上篇博文中說明了如何通過命令編譯及運(yùn)行自己的Java文件。但是當(dāng)前都是以項(xiàng)目為單位的,如何組織項(xiàng)目中的文件以及對項(xiàng)目的編譯運(yùn)行,是命令行編譯主要解決的問題。
1. 項(xiàng)目組織 我們以下面的項(xiàng)目作為樣例來說明:
Test/
|-- Test.jar
|-- classes
| |-- Main.class
| |-- OutterTest.class
| `-- inner
| `-- InnerTest.class
|-- run.py
|-- run.sh
`-- src
|-- Main.java
|-- OutterTest.java
`-- inner
`-- InnerTest.java
上面是一個(gè)項(xiàng)目:Test。其中,有兩個(gè)文件夾,src用來放置所有的源代碼,也就是.java文件;classes用來放置相應(yīng)的.class文件。Test.jar是最終生成的jar文件,run.py和run.sh是項(xiàng)目的腳本文件。下面列出三個(gè).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文件夾下,這樣可以保證統(tǒng)一。在Eclipse中,新建一個(gè)類時(shí),會讓你填寫package名,然后Eclipse會為你新新建一個(gè)相應(yīng)的文件夾。
2. 項(xiàng)目編譯 javac -d classes src/*.java src/inner/*.java 由上一篇知道,javac中-d表示”指定存放生成的類文件的位置“,也就是將生成的.class文件放在-d指定的文件夾中。需要指出的是,classes文件夾是手動建立的。
另外,javac還可以批量編譯.java文件,上面的命令表示編譯src目錄下的所以.java文件、編譯src/inner目錄下的所有.java文件。這樣就可以批量編譯.java文件,并將生成的.class文件放在classes文件夾中。這里同樣要指出一點(diǎn),因?yàn)閜ackage inner的關(guān)系,會自動建立inner文件夾,并將所有package inner下的類文件.class放在classes/inner下。
3.項(xiàng)目打包 jar -cvf Test.jar -C classes/ . 這個(gè)命令將會把classes下的所有文件(包括.class和文件夾等)打包為Test.jar文件。
上篇博客中,介紹了參數(shù)-C的意義:-C 更改為指定的目錄并包含其中的文件,如果有任何目錄文件, 則對其進(jìn)行遞歸處理。它相當(dāng)于使用 cd 命令轉(zhuǎn)指定目錄下。
注意后面的"."的用法,jar可以遞歸的打包文件夾,"."表示是當(dāng)前文件夾。如果執(zhí)行命令“jar -cvf Test.jar .”,表示將當(dāng)前目錄下的所有文件及文件夾打包。所以上面的命令的意思就是“將classes下的所有文件打包為Test.jar”。
4.項(xiàng)目運(yùn)行 java -cp Test.jar Main 通過上面的命令就可以執(zhí)行Test.jar中的Main.class。其中,cp指定了jar文件的位置。
5. 腳本文件 通過上面的幾步,我們就可以完成整個(gè)項(xiàng)目的編譯和運(yùn)行。而且,通過src和classes兩個(gè)文件夾將源文件和目標(biāo)文件分開,使項(xiàng)目比較整潔。但是如果每次編譯、運(yùn)行都要輸入上面一系列命令,還是比較繁瑣的,尤其當(dāng)項(xiàng)目文件較多時(shí),這時(shí)通過腳本文件管理整個(gè)項(xiàng)目是明智的選擇。
下面是項(xiàng)目的腳本文件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!")
通過這個(gè)腳本文件,可以使用"python run.py c"完成項(xiàng)目的編譯、打包;使用"python run.py r"運(yùn)行項(xiàng)目。
通過這篇文章,我們已經(jīng)了解了Java項(xiàng)目的管理方法,以及編譯、打包、運(yùn)行的命令行,最后介紹了使用腳本文件有效管理項(xiàng)目。
附件中包含整個(gè)項(xiàng)目,同時(shí)還包括一個(gè)run.sh,方便不熟悉python的人查看。
附件:
Test.tar