SCHeng

It all returns to nothing.

java

java手动编译小记

scheng

这篇文章记录如何不使用IDE,使用javac进行编译。

单文件编译

最简单的例子就是HelloWorld程序了,直接给出代码。

public class HelloWorld{
    public static void main(String[] args){
        System.out.println("Hello, World!");
    }
}

注意文件名与类名相同,所以应该保存为HelloWorld.java,直接在当前目录进行编译即可。

javac HelloWorld.java

会在当前目录(与HelloWorld.java的同一级目录)生成了HelloWorld.class。

直接运行java HelloWorld就可以看见输出了,要注意的是java HelloWorld.class是无法运行的。

传入的是main函数所在的类的名字,而不是class文件;java会根据类名自动去找class文件。

添加包名

这个内容在上一篇文章里已经提到了,再复述一下。

在原先的HelloWorld里面加一句package com.test

package com.test;
public class HelloWorld{
    public static void main(String[] args){
        System.out.println("Hello, World!");
    }
}

执行javac HelloWorld.java,生成了HelloWorld.class文件。这时需要先创建目录:/com/test然后在com/的上一层目录执行java com.test.HelloWorld

或者使用命令javac -d . HelloWorld.java,会在当前目录下生成一个.../com/test/HelloWorld.class,然后再运行java com.test.HelloWorld这样子也是可以的。

以上的这些行为说明,增加了package名,class名也会变化,在需要运行时候就要使用全限定名(关于全限定名、简单名的定义可以查看这篇文章);java会根据包名对应出目录结构,并从class path搜索该目录去找到class文件。

多文件编译

有两个文件如下:

package com1.test;
public class HelloWorld{
    public static void main(String[] args){
        HelloService service = new HelloService();
        service.printHello("World");
    }
}
package com1.test;
public class HelloWorld{
    public static void main(String[] args){
        HelloService service = new HelloService();
        service.printHello("World");
    }
}

有两种编译方式,第一种和上面单文件编译类似。

先执行javac -d . HelloService.java得到了com1/test/HelloService.class,再执行javac -d . HelloWorld.java,得到了com1/test/HelloWorld.class,然后就可以通过java com1.test.HelloWorld顺利运行了。

另外一种是直接写上全部需要的文件,在现在情况下就是javac -d . HelloWorld.java HelloService.java,不需要区分前后,会根据依赖关系自动确定顺序。

也可以使用javac -d . *.java直接对当前目录下的所有java文件进行编译。

使用src和target目录

希望能够想IDE一样,src目录下保存原文件,target目录下生成可运行文件。例如在javatest目录下有src目录,src目录中保存了各种java原文件。在javatest目录下执行javac -d target src/*.java就能将编译后的文件生成在target目录下了。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注