2010-08-18 94 views
9

嗨,我一直在使用IDE,但現在我需要從命令行運行和編譯。使用Java中的命令行編譯多個軟件包

問題是我有多個包,我試圖找到答案,但沒有任何工作。

所以我

src/ 
    Support/ (.java files) 
    Me/ (.java files) 
    Wrapers/ (.java files) 

你知道如何編譯用javac一切嗎?

回答

6

這應該做它(可能需要通過-cp命令行開關的其他路徑元素):

javac Support/*.java Me/*.java Wrapers/*.java 

但是,如果你的構建過程變得更加複雜(它會!),你應該考慮使用Apache Ant用於構建自動化。

+2

+1 - 對於一個外部最少的項目依賴,Ant比(例如)Maven更簡單。他的IDE甚至可以生成一個初始的「build.xml」文件。 – 2010-08-18 13:39:33

+0

謝謝我試過這個,它編譯所有東西,但它不會生成類結構,所以當我嘗試運行我的主要它說:「」main「java.lang.NoClassDefFoundError:Wrapper/java」 – Altober 2010-08-18 13:46:56

+1

@Altober:'java'工具期望*類名*,而不是文件名,特別是不是源文件名。你可能需要做一些事情,比如'java wrapers.wrapper',假設你在一個包中有一個類「Wrapper」「Wrapers」 – 2010-08-18 13:50:06

8

對於此類任務,您應該使用構建工具(如MavenAnt)。

在初始階段,當項目不是很複雜,你可以在適當位置使用以下行來編譯,用適當的類路徑(由@邁克爾的建議):

javac Support/*.java Me/*.java Wrapers/*.java

+0

是的問題是我需要在外部服務器上執行它,我也無法安裝任何aditional。 – Altober 2010-08-18 13:39:22

+0

您可以在存儲代碼的同一文件系統中解壓縮ant/maven,不需要「安裝」它們,因此這不會妨礙您使用 – 2010-08-18 13:43:19

6
javac -d compiled $(find src -name *.java) 
+0

謝謝我嘗試過,但我得到「非法變量名」你知道爲什麼。謝謝 – Altober 2010-08-18 13:43:07

+0

也許你需要'-sourcepath src'。 (或者你需要指定'src'目錄作爲類路徑的一部分) – 2010-08-18 16:22:10

+0

我試過你的代碼片段和我的NetBeans項目,它的工作原理如下: – auraham 2012-09-22 17:41:25

2

如果你真的只是需要使用javac和標準UNIX命令,你可以這樣:

find src -name \*.java -print0 | xargs -0 javac -d classes 
0

在許多情況下,螞蟻是矯枉過正。如果你使用的是windows或shell腳本(sh文件),只要使用BAT文件即可。您可以創建一個包含所有javac命令的文本文件,並在您想構建時運行該文件。

例如,我用下面的bat文件來構建我的應用程序之一:

@echo off 
echo Building Shazaam... 

del classes\com\aepryus\shazaam\*.* /q 
del classes\com\aepryus\shazaam\engine\*.* /q 
del classes\com\aepryus\shazaam\domain\*.* /q 
del classes\com\aepryus\shazaam\persist\*.* /q 
del classes\com\aepryus\shazaam\view\*.* /q 
del classes\com\aepryus\shazaam\task\*.* /q 
del classes\com\aepryus\shazaam\action\*.* /q 
del classes\com\aepryus\shazaam\controller\*.* /q 

javac src\com\aepryus\shazaam\*.java  -classpath \lib\AepUtil.jar;\lib\AepXML.jar;\lib\AepLoom.jar; -d classes 
javac src\com\aepryus\shazaam\engine\*.java -classpath \lib\AepUtil.jar;\lib\AepXML.jar;\lib\AepLoom.jar;\lib\Sprout.jar;classes; -d classes 
javac src\com\aepryus\shazaam\domain\*.java -classpath \lib\AepUtil.jar;\lib\AepLoom.jar;\lib\Sprout.jar;classes; -d classes 
javac src\com\aepryus\shazaam\persist\*.java -classpath \lib\AepUtil.jar;\lib\AepLoom.jar;\lib\Sprout.jar;classes; -d classes 
javac src\com\aepryus\shazaam\view\*.java -classpath \lib\Servlet.jar;\lib\AepUtil.jar;\lib\AepXML.jar;\lib\AepLoom.jar;\lib\AepHTML.jar;\lib\Sprout.jar;classes; -d classes 
javac src\com\aepryus\shazaam\task\*.java -classpath \lib\AepUtil.jar;\lib\AepLoom.jar;\lib\AepHTML.jar;\lib\Sprout.jar;classes; -d classes 
javac src\com\aepryus\shazaam\action\*.java -classpath \lib\Servlet.jar;\lib\AepUtil.jar;\lib\AepLoom.jar;\lib\AepHTML.jar;\lib\Sprout.jar;classes; -d classes 
javac src\com\aepryus\shazaam\controller\*.java -classpath \lib\Servlet.jar;\lib\AepUtil.jar;\lib\AepXML.jar;\lib\AepRPC.jar;\lib\AepLoom.jar;\lib\AepHTML.jar;\lib\Sprout.jar;classes; -d classes 

cd classes 
jar cf ..\war\WEB-INF\lib\Shazaam.jar . 
cd.. 

echo Complete 
+0

如果你重構一個包或者添加一個新的包,你每次都必須觸摸這個文件?有一個http://skillsmatter.com/podcast/java-jee/zen-and-the-art-of-build-script-maintenance的手錶,如果你需要說服... – 2010-08-18 13:56:45

+2

不知道別人。但是在項目過程中,我需要修改這樣一個批處理文件的次數是微乎其微的。毫無疑問,Maven和Ant是有保證的;但我沒有遇到過它們。有時爲了殺死一隻蒼蠅,一把關槍不是必要的(也不是核彈) – aepryus 2010-08-18 14:10:05

0

真正的答案是javac的-d -sourcepath(其中類建立和安裝的地方)(來源包的根目錄)-cp(依賴關係的類路徑,它可以再次成爲構建和保存類的類文件夾)Java文件的全限定名稱。

實施例的javac -d類-sourcepath SRC -cp類SRC \ COM \測試\ FirstSample.java

的FirstSample.java包含的主要方法。 Pacjage結構如下所述。

之前編譯
HomeApp
--src
------ COM \測試\ FirstSample.java(使用FirstPojo.java第一個樣品)
------ COM \測試\ FirstPojo.java
--classes

編譯
HomeApp
--src 後------ com \ test \ FirstSample.java(FirstSample.java使用FirstPojo。JAVA)
------ COM \測試\ FirstPojo.java
--classes
------ COM \測試\ FirstSample.class(FirstSample.class使用FirstPojo.class)
- ----- com \ test \ FirstPojo.class