[英]java compiling from the command line
我是一名經驗豐富的程序員,但多年未使用 Java - 主要是 C# - 並且過去使用過 IDE。 我正在嘗試從 Mac 上的命令行編譯一些代碼,但無法讓我的測試文件找到我的源代碼。 我假設問題出在包、文件結構、類路徑和導入語句的空間中 - 但我已經投入了幾個小時(包括在 Stack Overflow 上尋找)並且仍然卡住了。
這是我所擁有的:
Directory structure:
ProjectName
|
--src
|
--SourceClass
--test
|
--SourceClassTest
--external
|
--testng-6.8.7.jar
我的 SourceClass 看起來像這樣:
package ProjectName;
public class SourceClass<T>{
}
很簡單。 顯然,還會有更多 - 但我想首先確保在我實際進行編碼之前所有這些設置都是正確的。
我的測試類如下所示:
package ProjectName;
import java.util.*;
import org.testng.Assert;
import org.testng.annotations.*;
public class SourceClassTest{
@Test
private void createEmptySourceClass(){
SourceClass<Object> sourceClass = new SourceClass<Object>();
Assert.assertTrue(sourceClass.isEmtpy());
}
}
從“ProjectName”目錄運行的“javac src/*.java”編譯源類沒有問題。 我想看到這個失敗並出現“SourceClass 沒有 isEmpty() 方法”這樣的錯誤,但是我從“ProjectName”目錄中像這樣運行 javac:
javac test/*.java -classpath external/testng-6.8.7.jar
並得到這個例外:
test/SourceClassTest.java:12: error: cannot find symbol
SourceClass<Object> tree = new SourceClass<Object>();
^
symbol: class SourceClass
location: class SourceClassTest
test/SourceClassTest.java:12: error: cannot find symbol
SourceClass<Object> sourceClass = new SourceClass<Object>();
^
symbol: class SourceClass
location: class SourceClassTest
2 errors
我嘗試了很多事情 - 添加導入語句,向 javac 命令添加源路徑,將 sourceClass 編譯為 jar 並將其放入 bin 目錄中,然后將其添加到類路徑中,但我無法進行測試找到 SourceClass 符號。
知道我在這里缺少什么嗎?
如果您編譯到單獨的目標目錄中,它會起作用。 例如,
mkdir target
javac -d target/ src/*.java
javac -classpath target/ test/*.java
當您執行javac src/*.java
,它將在src
目錄本身中創建.class
文件。 默認情況下,假定您引用的任何類都在同一個包中。 因此,即使您將src/
添加到類路徑,它src/ProjectName/SourceClass.class
查找src/ProjectName/SourceClass.class
,但它沒有找到。 當您傳遞-d target/
選項時,它會創建正確的包層次結構,因此並找到該類。
javac 官方文檔中的相關文檔:
您應該在反映其包樹的目錄樹中排列源文件。 例如,如果您將所有源文件保存在 C:\\workspace 中,則 com.mysoft.mypack.MyClass 的源代碼應位於 C:\\workspace\\com\\mysoft\\mypack\\MyClass.java 中。
默認情況下,編譯器將每個類文件放在與其源文件相同的目錄中。 您可以使用 -d 指定單獨的目標目錄(請參閱下面的選項)。
...
...
-d directory設置類文件的目標目錄。 該目錄必須已經存在; javac 不會創建它。 如果類是包的一部分,javac 會將類文件放在反映包名稱的子目錄中,並根據需要創建目錄。 例如,如果指定 -d C:\\myclasses 並且類名為 com.mypackage.MyClass,則類文件名為 C:\\myclasses\\com\\mypackage\\MyClass.class。 如果未指定 -d,則 javac 將每個類文件放在與生成它的源文件相同的目錄中。
注意:-d 指定的目錄不會自動添加到您的用戶類路徑中。
我的猜測是它找不到 SourceClass 因為定義該類的文件在src
下,並且您沒有在 javac 命令行中提到該目錄。
如果我是你,我會將文件層次結構更改為:
ProjectName/src/ProjectName/SourceClass.java
ProjectName/src/ProjectName/SourceClassTest.java
ProjectName/external/testng-6.8.7.jar
然后運行javac src/ProjectName/*.java -classpath external/testng-6.8.7.jar
。
或者保持文件層次結構不變,然后運行javac src/*.java test/*.java -classpath external/testng-6.8.7.jar
接受的答案是正確的,但它錯過了一個關鍵點:當 javac 被要求編譯*.java
(而不是foo.java
,然后是foo2.java
...)時,它會將它們視為一個包並接受之間的引用他們。
這就是魔法。 其他語言使用頭文件隱式地做到這一點。
即使在閱讀了這篇文章之后,我還是花了一些時間來弄清楚這一點,這與我固有的假設相反,即一個程序一個接一個地在文件上運行會(應該)產生與在一組文件上運行該程序相同的結果。 我的壞; *
不僅僅是為了方便,而是至關重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.