簡體   English   中英

java從命令行編譯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM