上篇博文中說明了如何通過命令編譯及運行自己的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