簡體   English   中英

幫助 java 中的包 - 導入不起作用

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

這些都必須從源代碼樹的根目錄完成。 否則, javacjava將無法找到任何其他包(實際上, 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.

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