[英]Help with packages in java - import does not work
我是 C++ 開發人員 - 不是 java 開發人員,但必須讓這段代碼工作......
我有 2 個公共課程將被另一個產品使用。 我在每個 java 文件中使用了 package 指令。
package com.company.thing;
class MyClass ...
當我嘗試編譯使用我添加的測試應用程序時
import com.company.thing.*;
javac 編譯器失敗,出現關於 com.company 的錯誤不存在。 (即使我在與 class 文件相同的目錄中編譯它,我剛剛制作了 package 文件)
我確信我正在做一些愚蠢而愚蠢的事情。
我已經閱讀了http://java.sun.com/docs/books/tutorial/java/package/usepkgs.html頁面並嘗試設置像 /com/company/thing 這樣的目錄結構,但要么我有完全搞砸了,或者我錯過了其他東西。
編輯感謝您的建議-我以前嘗試過類路徑。 它沒有幫助。
我嘗試編譯
javac -classpath <parent> client.java
結果是:
package com.company does not exist
我在 \com\company\product 中有要導入的代碼(兩個 java 文件)。 我編譯的很好。 (他們包含 MyClass)我什至為他們制作了 jar 文件。 我將 jar 文件復制到父目錄。
然后我做了(在帶有客戶端 java 文件的父目錄中)
javac -cp <jarfile> *.java
結果是:
cannot access MyClass
bad class file: MyClass.class(:MyClass.class)
class file contains wrong class: com.company.product.MyClass
Please remove or make sure it appears in the correct subdirectory of the classpath.
編輯
如果我使用 MyClass 的完全限定名稱並在父目錄中編譯它,我可以編譯和運行客戶端代碼。 我現在完全糊塗了。
編譯時沒有設置類路徑 - 只是
javac *.java
在父目錄中 - 它工作正常。
我可以編譯一個測試應用程序,但是當我必須將它集成到生產代碼中時,這不會削減它。 還在尋求幫助。
編輯:
最后 - 不知道為什么它以前不起作用 - 但我清理了整個目錄結構中的所有文件,現在它可以工作了。
謝謝
好的,只是為了澄清已經發布的內容。
您應該有目錄com
,其中包含目錄company
,包含目錄example
,包含文件MyClass.java
。
從包含com
的文件夾中,運行:
$ javac com\company\example\MyClass.java
然后:
$ java com.company.example.MyClass Hello from MyClass!
這些都必須從源代碼樹的根目錄完成。 否則, javac
和java
將無法找到任何其他包(實際上, java
甚至無法運行MyClass
)。
我創建了文件夾“testpackage”和“testpackage2”。 在 testpackage 中,我創建了 TestPackageClass.java 包含以下代碼:
package testpackage;
import testpackage2.MyClass;
public class TestPackageClass {
public static void main(String[] args) {
System.out.println("Hello from testpackage.TestPackageClass!");
System.out.println("Now accessing " + MyClass.NAME);
}
}
在 testpackage2 中,我創建了 MyClass.java 包含以下代碼:
package testpackage2;
public class MyClass {
public static String NAME = "testpackage2.MyClass";
}
從包含兩個新文件夾的目錄中,我運行:
C:\examples>javac testpackage\*.java C:\examples>javac testpackage2\*.java
然后:
C:\examples>java testpackage.TestPackageClass Hello from testpackage.TestPackageClass! Now accessing testpackage2.MyClass
這會讓事情變得更清楚嗎?
是的,這是一個類路徑問題。 您需要告訴編譯器和運行時 your.class 文件所在的目錄是 CLASSPATH 的一部分。 您需要添加的目錄是 package 結構開頭的“com”目錄的父目錄。
您可以使用 javac.exe 和 java.exe 的 -classpath 參數來執行此操作。
還應該詢問您使用的 3rd 方類是如何打包的。 如果它們在 JAR 中,並且我建議您將它們合二為一,請將 .jar 文件添加到類路徑中:
java -classpath .;company.jar foo.bar.baz.YourClass
谷歌搜索“Java 類路徑”。 它會找到這樣的鏈接。
還有一件事:“導入”沒有加載類。 它所做的一切都是為了節省您的打字時間。 當您包含導入語句時,您不必在代碼中使用完全解析的 class 名稱 - 您可以鍵入“Foo”而不是“com.company.thing.Foo”。 這就是它所做的一切。
聽起來您的目錄結構走在了正確的軌道上。 編譯依賴代碼時,指定javac
的-classpath
參數。 使用com
目錄的父目錄,其中com
依次包含company/thing/YourClass.class
所以,當你這樣做時:
javac -classpath <parent> client.java
<parent>
應該是指com
的父級。 如果您在com
,那將是../
。
你得到了一堆很好的答案,所以我只是提出一個建議。 如果你打算在這個項目上工作超過 2 天,下載 eclipse 或 netbeans 並在那里構建你的項目。
如果您通常不是 java 程序員,那么它將給您的幫助將是無價的。
如果您只花費 2 小時,那么 1/2 小時的下載/安裝是不值得的。
兩者都有“修復導入”的熱鍵/菜單項,這樣您就不必再擔心導入了。
標准的 Java 類加載器是目錄結構的堅持者。 類路徑中的每個條目都是一個目錄或 jar 文件(實際上是 zip 文件),然后它會搜索給定的 class 文件。 例如,如果您的類路徑是“.;my.jar”,它將在以下位置搜索 com.example.Foo:
./com/example/
my.jar:/com/example/
也就是說,它將在具有 package 的“修改名稱”的子目錄中查找,其中“.” 替換為文件分隔符。
此外,值得注意的是,您不能嵌套.jar 文件。
只需在系統變量和用戶變量菜單下添加類路徑條目(我的意思是您的父目錄位置)...遵循:右鍵單擊我的電腦>屬性>高級>環境變量
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.