上篇博文中说明了如何通过命令编译及运行自己的Java文件。但是当前都是以项目为单位的,如何组织项目中的文件以及对项目的编译运行,是命令行编译主要解决的问题。
1. 项目组织 我们以下面的项目作为样例来说明:
Test/
|-- Test.jar
|-- classes
| |-- Main.class
| |-- OutterTest.class
| `-- inner
| `-- InnerTest.class
|-- run.py
|-- run.sh
`-- src
|-- Main.java
|-- OutterTest.java
`-- inner
`-- InnerTest.java
上面是一个项目:Test。其中,有两个文件夹,src用来放置所有的源代码,也就是.java文件;classes用来放置相应的.class文件。Test.jar是最终生成的jar文件,run.py和run.sh是项目的脚本文件。下面列出三个.java文件,只是简单的显示一句话:
// Main.java
import inner.*;
public class Main
{
public static void main(String[] args)
{
System.out.println("main: hello word!");
OutterTest out1 = new OutterTest();
out1.hello();
InnerTest in1 = new InnerTest();
in1.hello();
}
}
// OutterTest.java
public class OutterTest
{
public void hello()
{
System.out.println("Hello OutterTest!");
}
}
// InnerTest.java
package inner;
public class InnerTest
{
public void hello()
{
System.out.println("Hello InnerTest!");
}
}
注意上面的InnerTest类,它在package inner中,所以将InnerTest.java放在inner文件夹下,这样可以保证统一。在Eclipse中,新建一个类时,会让你填写package名,然后Eclipse会为你新新建一个相应的文件夹。
2. 项目编译 javac -d classes src/*.java src/inner/*.java 由上一篇知道,javac中-d表示”指定存放生成的类文件的位置“,也就是将生成的.class文件放在-d指定的文件夹中。需要指出的是,classes文件夹是手动建立的。
另外,javac还可以批量编译.java文件,上面的命令表示编译src目录下的所以.java文件、编译src/inner目录下的所有.java文件。这样就可以批量编译.java文件,并将生成的.class文件放在classes文件夹中。这里同样要指出一点,因为package inner的关系,会自动建立inner文件夹,并将所有package inner下的类文件.class放在classes/inner下。
3.项目打包 jar -cvf Test.jar -C classes/ . 这个命令将会把classes下的所有文件(包括.class和文件夹等)打包为Test.jar文件。
上篇博客中,介绍了参数-C的意义:-C 更改为指定的目录并包含其中的文件,如果有任何目录文件, 则对其进行递归处理。它相当于使用 cd 命令转指定目录下。
注意后面的"."的用法,jar可以递归的打包文件夹,"."表示是当前文件夹。如果执行命令“jar -cvf Test.jar .”,表示将当前目录下的所有文件及文件夹打包。所以上面的命令的意思就是“将classes下的所有文件打包为Test.jar”。
4.项目运行 java -cp Test.jar Main 通过上面的命令就可以执行Test.jar中的Main.class。其中,cp指定了jar文件的位置。
5. 脚本文件 通过上面的几步,我们就可以完成整个项目的编译和运行。而且,通过src和classes两个文件夹将源文件和目标文件分开,使项目比较整洁。但是如果每次编译、运行都要输入上面一系列命令,还是比较繁琐的,尤其当项目文件较多时,这时通过脚本文件管理整个项目是明智的选择。
下面是项目的脚本文件run.py
import os
import sys
if __name__ == "__main__":
ProjectJar = "Test.jar"
if sys.argv[1] == "c":
print("Compile program.")
src = "src/*.java src/inner/*.java"
os.system("javac -d classes " + src)
os.system("jar -cvf " + ProjectJar + " -C classes/ .")
if sys.argv[1] == "r":
print("Run program.")
os.system("java -cp " + ProjectJar + " Main")
print("Over!")
通过这个脚本文件,可以使用"python run.py c"完成项目的编译、打包;使用"python run.py r"运行项目。
通过这篇文章,我们已经了解了Java项目的管理方法,以及编译、打包、运行的命令行,最后介绍了使用脚本文件有效管理项目。
附件中包含整个项目,同时还包括一个run.sh,方便不熟悉python的人查看。
附件:
Test.tar