2010-02-23 23 views
4

我有一個名爲「MyTools」的jar。該jar文件位於c:\ data文件夾中。我在名爲「UseTools.java」的文件夾中創建了一個新文件。現在我想在我的UseTools.java中使用MyTools.jar中的一些類。我試過,但它似乎沒有工作:如何使用沒有包信息的jar文件?

import MyTools.*;  
public class UseTools 
{ 
    public static void main(String[] args) 
    { 
    MyTools.SomeClass foo = new SomeClass(); 
    SomeClass.doSomething(); 
    } 
} 

我試圖編譯此:

javac -cp . UseTools.java 

,並得到該錯誤消息:

UseTools.java:1: package MyTools does not exist 
import MyTools.*; 
^ 
UseTools.java:7: package MyTools does not exist 
     MyTools.SomeClass foo = new SomeClass() 
            ^
2 errors 

我沒設置包任何班級的名字。

我必須在我的罐子類設置包的名字嗎?

+0

你可以在命令行運行'jar -tf MyTools.jar'併發布輸出嗎?也許你的jar沒有正確打包。 – karoberts 2010-02-23 17:29:23

+0

我使用netbeans創建了jar。當我做一個-tf時,它會在根中返回一個META-INF文件夾和SomeClass.class。 – vikasde 2010-02-23 17:37:41

+0

首先在Java中包名應該全部小寫。類名應該是CamelCase。 – 2010-02-23 18:00:41

回答

0

您需要添加-cp file.jar而不是-cp。

後者將拿起唯一的.class文件。 BTW:爲什麼不使用NetBeans,eclipse或intelliJ這樣的IDE?

+0

目錄我試過,但得到了同樣的錯誤「包不存在」:javac的-cp MyTools.jar UseTools.java – vikasde 2010-02-23 17:07:05

1

在你MyTools.jar應該有一個名爲銘佑一包。在編譯之前,您應該將jar添加到類路徑中。

+0

確定,當我運行它使用java,我仍然需要將jar包含在我的classpath中嗎? – vikasde 2010-02-23 17:48:08

+0

如果您正在運行命令控制檯,那麼您設置的類路徑將一直存在,直到您關閉控制檯,因此如果您在編譯期間設置類路徑的同一控制檯中運行,則無需再次設置它。 – GuruKulki 2010-02-23 18:05:20

3

要提到更多與問題標題相關的內容: 在Java中,您不能從命名包內的代碼訪問默認包中的類。

這意味着,如果你的jar文件中的類沒有明確屬於任何包和JAR文件是直接在無子文件夾的根文件夾內,他們在默認的包。這不是很詳細,缺乏模塊性和可擴展性,但在技術上是可以的。 然後,您只能從代碼中使用這些類,這些代碼也位於默認包中。但這並不一定意味着它必須放在同一個罐子裏。如果您有多個src或class文件夾,它們都可以包含可以交互的默認包中的類。 JAR文件中的組織和項目中的包結構是相互獨立的。

不過,我會嚴格鼓勵您使用明確的包信息。

相關問題