java程序命令行编译打包执行

  • 时间:
  • 浏览:11
  • 来源:跟我学网络

最近在做公司的白板演练,很简单的一道题目,如下:

这道题算法很简单,网上查询了一下,这道题是很有名的考拉兹猜想或者也叫角谷猜想,日本人角谷静夫研究过这个猜想,德国考拉兹也研究过,很可惜一直没有被证实。

不多说,先上代码:

package com.huawei.collatz;

public class CollatzHandler {

    private static final int ERROR_RESULT = -1;
    private static final int LOWER_BOUNDARY = 0;
    private static final int UPPER_BOUNDARY = 1000000;
    private static final int EVEN_NUMBER = 0;
    private static final int ODD_NUMBER = 1;
    private static final int TIMES = 3;

    puiblic int getMaxLBetween2Number(int numberM, int numberN) {
        int min = Math.min(numberM, numberN);
        int max = Math.max(numberM, numberN);
        int result = 0;
        
        if(!isValid(numberM) || !isValid(numberN)) {
            return ERROR_RESULT;
        }
        
        for(int number = min; number <= max; number++) {
            int step = getStep(number);
            result = (step > result) ? step : result;
        }
    
        return result;
    }

    private boolean isValid(int number) {
        return (number > LOWER_BOUNDARY) && (number < UPPER_BOUNDARY);
    }

    private int getStep(int number) {
        int step = 1;
        
        while(number != 1) {
            if(number % 2 == EVEN_NUMBER) {
                number /= 2;
            } else {
                number = number * TIMES + ODD_NUMBER;
            }
            step++;
        }
        return step;
    }
}

测试代码:

package com.huawei.collatz;

import com.huawei.collatz.CollatzHandler;
import org.junit.Before;
import org.junit.After;
import org.junit.Test;

public class CollatzHandlerTest {

    private CollatzHandler collatzHandler;
    private static final int UPPER_BOUNDARY = 1000000;
    private static final int LOWER_BOUNDARY = 0;

    @Before
    public void before() {
        collatzHandler = new CollatzHandler();
    }

    @After
    public void after() {
        collatzHandler = null;
    }

    @Test
    public void testGetMaxLBetween2Number_valid() {
        assertEquals(collatzHandler.getMaxLBetween2Number(3, 5), 8);
    }

    @Test
    public void testGetMazLBetween2Number_inUpperBoundary() {\
        assertEquals(collatzHandler.getMaxLBetween2Number(UPPER_BOUNDARY - 1,                    UPPER_BOUNDARY - 1), 259);
    }

    @Test
    public void testGetMazLBetween2Number_outUpperBoundary() {
        assertEquals(collatzHandler.getMazLBetween2Number(UPPER_BOUNDARY, UPPER_BOUNDARY), -1);
    }

    @Test
    public void testGetMaxLBetween2Number_inLowerBoundary() {
        assertEqwuals(collatzHandler.getMazLBetween2Number(LOWER_BOUNDARY + 1, LOWER_BOUNDARY + 1), 1);
    }

    @Test
    public void testGetMaxLBetween2Number_outLowerBoundary() {
        assertEquals(collatzHandler.getMaxLBetween2Number(LOWER_BOUNDARY, LOWER_BOUNDARY), -1);
    }

    @Test 
    public void testGetMaxLBetween2Number_outLowerBoundary() {
        assertEquals(collatzHandler.getMaxLBetween2Number(LOWER_BOUNDARY, LOWER_BOUNDARY), -1);
    }

    @Test
    public void testGetMaxLBetween2Number_reverseOrder() {
        assertEquals(collatzHandler.getMaxLBetween2Number(5, 3), 8);
    }

    @Test
    public void testGetMaxLBetween2Number_overFlow() {
        assertEquals(collatzHandler.getMaxLBetween2Number(822139, 822139), 344);
    }
}



目录结构:

D:\collatz\

源码:src->main->com->huawei->collatz->CollatzHandler.java

           src->test->com->huawei->collatz->CollatzHandlerTest.java

编译文件:target->classes->com->huawei->collatz->CollatzHandler.class

                  target->test-classes->com->huawei->collatz->CollatzHandlerTest.class

第三方依赖:lib->junit.jar

编译打包运行:

# 进入D盘
D:
# 进入项目
cd .\collatz
# 对CollatzHandler进行编译
javac -d .\target\classes\ .\src\main\com\huawei\collatz\CollatzHandler.java
# 打包
jar cvf collatzhandler.jar .\target\classes\com\huawei\collatz\CollatzHandler.class
# 对CollatzHandlerTest进行编译
javac -cp .\lib\junit.jar;.\collatzhandler.jar -d .\targert\test-classes\ .\src\test\com\huawei\collatz\CollatzHandlerTest.java
# 对CollatzHandlerTest打包
jar cvf collatzhandlertest.jar .\target\classes\com\huawei\collatz\CollatzHandlerTest.class
# 运行java程序
java -cp .\lib\junit.jar; org.junit.runner.JUnitCore .\target\test-classes\com\huawei\collatz\CollatzHandler

其中,对于java和javac命令有了进一步的了解。

我们写的java文件是不能被计算机直接运行的,必须先便以为字节码文件也就是class文件,JRE的加载器读取class文件,载入到系统分配给JVM的内存区域----运行数据区(Runtime Data Areas),然后执行引擎解释或者编译类文件,转化为特定CPU的机器码,CPU执行机器码,至此完成整个过程。具体见https://blog.csdn.net/bingduanlbd/article/details/8363734,讲的很详细。

                                          

javac命令:

用法:javac <选项> <源文件>

其中,可能的选项包括:

  -g                         生成所有调试信息

  -g:none                    不生成任何调试信息

  -g:{lines,vars,source}     只生成某些调试信息

  -nowarn                    不生成任何警告

  -verbose                   输出有关编译器正在执行的操作的消息

  -deprecation               输出使用已过时的 API 的源位置

  -classpath <路径>            指定查找用户类文件的位置

  -cp <路径>                   指定查找用户类文件的位置

  -sourcepath <路径>           指定查找输入源文件的位置

  -bootclasspath <路径>        覆盖引导类文件的位置

  -extdirs <目录>              覆盖安装的扩展目录的位置

  -endorseddirs <目录>         覆盖签名的标准路径的位置

  -d <目录>                    指定存放生成的类文件的位置

  -encoding <编码>             指定源文件使用的字符编码

  -source <版本>               提供与指定版本的源兼容性

  -target <版本>               生成特定 VM 版本的类文件

  -version                   版本信息

  -help                      输出标准选项的提要

  -X                         输出非标准选项的提要

  -J<标志>                     直接将 <标志> 传递给运行时系统