2008-11-15 125 views
2

我試圖使用以下命令行語法運行基於java的工具:java -cp archive.jar archiveFolder.theMainClassName.Although類正在搜索,一個主類,「theMainClassName」在archive.jar中,並在輸入給出的archiveFolder中,我不斷收到我的類沒有看到的錯誤。有人對這個問題有任何想法嗎?預先感謝您從Jar文件中讀取類的Java命令行問題

+0

運行命令`jar tf `併發布結果。 剪切並粘貼您正在使用的確切命令行,以及java命令輸出的確切錯誤消息。 – erickson 2008-11-15 22:22:13

回答

5

這裏是什麼工作一個具體的例子,這樣你可以比較自己的SI tuation。

把這段代碼放在任何地方,放在一個名爲MainClass.java的文件中。 (我假設一個目錄中稱爲src後通常你會安排源到包匹配,當然。)

package archiveFolder; 

public class MainClass 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("I'm MainClass"); 
    } 
} 

然後運行這些命令:

# Compile the source 
javac -d . src/MainClass.java 

# Build the jar file 
jar cf archive.jar archiveFolder 

# Remove the unpackaged binary, to prove it's not being used 
rm -rf archiveFolder # Or rmdir /s /q archiveFolder on Windows 

# Execute the class 
java -cp archive.jar achiveFolder.MainClass 

結果:

I'm MainClass 

你是如何構建你的jar文件的?代碼是否在適當的包中?

1

也許與java -jar archive.jar

當然,假設清單指向正確的類...

你應該給你得到了確切的消息,它可能會擺脫更多的光。

編輯:有關在jar清單文件中設置應用程序入口點(主類)的信息,請參見Working with Manifest Files: The Basics

+0

這實際上並沒有回答這個問題......他不是試圖運行jar而是jar中的特定類。這幾乎肯定是一個包裝問題。 – 2008-11-15 22:31:39

3

確實theMainClassName類的頂部有以下包裝線:

package archiveFolder 

您需要的類文件是在相同的目錄結構中聲明的包。所以,如果你有這樣的事情:

org/jc/tests/TestClass.class 

它的源文件必須是這樣的:

package org.jc.tests; 

public class TestClass { 
    public static void main(String[] args) { 
    System.out.printf("This is a test class!\n"); 
    } 
} 

然後,你可以使用以下方法來創建jar文件和命令行運行它(假定當前目錄是在頂層,略高於ORG):

$ jar -cf testJar.jar org/jc/tests/*.class 
$ java -cp testJar.jar org.jc.tests.TestClass 
1

通常當一個從屬類(靜態部件)沒有發現發生這種情況 - 像這樣,使用的log4j:

public class MyClass { 
    private static Logger log = Logger.getLogger("com.example"); 
} 

其理由是,這樣的靜態成員的初始化可以理解爲部分類加載 - 錯誤導致類不可用(可加載),導致您描述的錯誤。

靜態構造函數是另一個可能的原因:

public class MyClass { 
    static { 
    // <b>any</b> error caused here will cause the class to 
    // not be loaded. Demonstrating with stupid typecast. 
    Object o = new String(); 
    Integer i = (Integer) o; 
    } 
} 
0

我認爲其他人已經覆蓋了一些常見的東西在這裏。我會打開罐子,並確保列出了這個類。我還會仔細檢查該類是否公開,並且方法是「public static void main(String [] arg)」。