通过命令编译java程序

通过Eclipse编写java程序久了,发现已经不会用命令来编译java程序了。今天在windows下搭建了一个solr环境,想放到linux下去跑一下,在windows上打成jar包后放在linux下不能运行,是时候回顾一下java的编译命令了。而且网上的资料比较零散,没有特别系统的资料。

本文在linux测试,同windows下的命令行工具差别不大。

编译并执行单个文件

1. 在目录下~/test_java/com/kuring下新建HelloWorld.java的文件,文件内容为

1
2
3
4
5
6
7
package com.kuring;

public class HellowWorld {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

2. 在目录~/test_java下执行javac com/kuring/HelloWorld.java命令来编译文件。此时会在HelloWorld.java文件所在的目录下生成HelloWorld.class的二进制文件。

3. 在目录~/test_java下执行java com.kuring.HelloWorld来执行HelloWorld.class。屏幕会输出hello world,说明文件执行成功。 也可以在任意路径下指定classpath路径来执行,命令为java -classpath ~/test_java com.kuring.HelloWorld,其中classpath指定了类的搜索路径。

编译并执行多个文件

1. 在目录下~/test_java/com/kuring下新建HelloWorld2.java和Main.java的文件,HelloWorld2.java文件内容为

1
2
3
4
5
6
7
package com.kuring;

public class HellowWorld2 {
    public void print() {
		System.out.println("hello world too");
	}
}

Main.java的文件内容为

1
2
3
4
5
6
7
8
package com.kuring;

public class Main {
	public static void main(String[] args) {
		HelloWorld2 hello = new HelloWorld2();
		hello.print();
	}
}

2. 在目录~/test_java下执行javac com/kuring/Main.java命令来编译文件。此时会在Main.java文件所在的目录下生成Main.class和HelloWorld2.class两个文件,可以看出javac有自动推导编译的功能。

3. 在目录~/test_java下执行java com.kuring.Main。屏幕会输出hello world too,说明文件执行成功。

打包

将上述例子中的程序打成jar包,可以在~/test_java目录下通过执行命令jar cvf my.jar com来生成jar文件。其中my.jar为要生成的jar文件的名字。 通过java -classpath my.jar com.kuring.Main来执行jar文件。 上述命令需要指定要执行的类名Main,如果想通过java -jar my.jar命令即可执行程序需要在jar包的META-INF/MANIFEST.MF文件中增加一行

1
Main-Class: SolrTest

来执行含有main函数的类。然后通过jar -cfm my.jar MANIFEST.MF路径 要打包的目录或文件来重新生成jar包。这样就可以通过java -jar my.jar来执行jar包了。

关于如何创建并执行引用了其他jar包的jar包,可以参考我的另外一篇博客《在Linux上搭建solr环境》,这里不再赘述。

常用jar命令

功能命令
用一个单独的文件创建一个 JAR 文件jar cf jar-file input-file...
用一个目录创建一个 JAR 文件jar cf jar-file dir-name
创建一个未压缩的 JAR 文件jar cf0 jar-file dir-name
更新一个 JAR 文件jar uf jar-file input-file...
查看一个 JAR 文件的内容jar tf jar-file
提取一个 JAR 文件的内容jar xf jar-file
从一个 JAR 文件中提取特定的文件jar xf jar-file archived-file...
运行一个打包为可执行 JAR 文件的应用程序java -jar app.jar

参考文档

JAR 文件揭密 Java程序的编译、执行和打包