簡體   English   中英

如何使用javac編譯java包結構

[英]How to compile java package structures using javac

我正在嘗試編譯(從命令行)一個導入我自己的另一個包的 java 包。 我正在在線學習教程,但是當我嘗試編譯最終的 java 文件 (CallPackage.java) 時,似乎出現錯誤。

這是文件結構:

+ test_directory (contains CallPackage.java)
   -> importpackage
       -> subpackage (contains HelloWorld.java)

這是 CallPackage.java:

/// CallPackage.java
import importpackage.subpackage.*;
class CallPackage{
  public static void main(String[] args){
  HelloWorld h2=new HelloWorld();
  h2.show();
  }
}

這是 HelloWorld.java:

///HelloWorld.java

package importpackage.subpackage;

public class HelloWorld {
  public void show(){
  System.out.println("This is the function of the class HelloWorld!!");
  }
}

嘗試的步驟

  1. 轉到子包並使用$javac HelloWorld.java
  2. 轉到 test_directory 並使用$javac CallPackage.java

這給了我最后一個命令的錯誤:

CallPackage.java:1: package importpackage.subpackage does not exist
import importpackage.subpackage.*;
^
CallPackage.java:4: cannot find symbol
symbol  : class HelloWorld
location: class CallPackage
  HelloWorld h2=new HelloWorld();
  ^
CallPackage.java:4: cannot find symbol
symbol  : class HelloWorld
location: class CallPackage
  HelloWorld h2=new HelloWorld();
                    ^
3 errors

如何編譯這兩個包? 非常感謝您的幫助!

問題是需要為每個命令(javac 和 java)設置類路徑:

嘗試的步驟

  1. 從 top_level 編譯 HelloWorld.java,而不是去分包:

    $javac -cp . importpackage/subpackage/HelloWorld.java

  2. 以同樣的方式編譯 CallPackage.java:

    $javac -cp . CallPackage.java

  3. 還使用類路徑運行文件:

    $java -cp . CallPackage

注意:運行“$java CallPackage”將給出錯誤“錯誤:無法找到或加載主類 CallPackage”

總之,在每個步驟中,必須指定類路徑。 它在這樣運行后工作。

和我一樣的情況。 我通過同時編譯類來接管它。
例如,這是我的項目:

+ beerV1
   -> classes
   -> src
         -> com
              -> example
                   -> model
                        -> BeerExpert.java
                   -> web
                        -> BeerSelect.java


啤酒專家.java:

package com.example.model;
import ...

public class BeerExpert{
    ...
}


啤酒選擇.java:

package com.example.web;
import com.example.model.*;
import ...

public class BeerSelect {
      ...
}


如您所見: BeerSelect.java正在嘗試導入com.example.model包中的類。
第一次,我先通過命令編譯BeerExert.java

--> javac -d classes src/com/example/model/BeerExpert.java

然后:
--> javac -d classes src/com/example/web/BeerSelect.java

結果是:
-->... error: package com.example.model does not exist

所以,我知道在這種情況下單獨編譯多個類是行不通的。


在谷歌上苦苦掙扎后,我發現了一個非常簡單的方法來解決這個問題:
只需一次編譯:

--> javac -d classes src/com/example/model/BeerExpert.java src/com/example/web/BeerSelect.java 


最后,這是我得到的:

 + beerV1
           -> classes
                 -> com
                      -> example
                           -> model
                                -> BeerExpert.class
                           -> web
                                -> BeerSelect.class
           -> src
                 -> com
                      -> example
                           -> model
                                -> BeerExpert.java
                           -> web
                                -> BeerSelect.java

希望有幫助。

你確定 importpackage/subpackage 在你的類路徑中嗎?

-cp 路徑或 -classpath 路徑

指定在哪里可以找到用戶類文件,以及(可選)注釋處理器和源文件。 該類路徑覆蓋 CLASSPATH 環境變量中的用戶類路徑。 如果 CLASSPATH、-cp 和 -classpath 均未指定,則用戶類路徑由當前目錄組成。 有關更多詳細信息,請參閱設置類路徑。

如果未指定 -sourcepath 選項,還會在用戶類路徑中搜索源文件。

如果未指定 -processorpath 選項,則還會在類路徑中搜索注釋處理器。

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html

這是一個古老的話題,但谷歌把我帶到了這個網站。 為了完整起見,我想在@Vĩnh Thụy Trần 關於如何在將主類編譯到自定義文件夾后運行它的答案中添加一點。 雖然現在看起來微不足道,但我花了一些時間才把它做好。

為了運行您的項目,您還需要指定類的路徑:

java -classpath <directory> your.package.name.classname

或者

java -cp <directory> your.package.name.classname

再次以 Vĩnh Thụy Trần 的示例為例,該命令將如下所示:

java -cp classes com.example.web.BeerSelect

我希望它會幫助某人,因為我花了一些時間來弄清楚。

(1)首先編譯代碼

javac -d importpackage.subpackage.HelloWorld

(2)然后編譯CallPackage.java

javac CallPackage.java

刪除您的包文件夾(將您的代碼粘貼到其他文件夾后),然后在 cmd 中找到您當前代碼所在的文件夾並嘗試 javac -d 。 Helloworld.java(這也將創建Helloworldclass 和子包)並在編譯運行代碼后嘗試為您的mainfunction 代碼即Callpackage.java 嘗試相同的代碼try java Callpackage

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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