2012-10-23 73 views
22

我試圖加載使用無法找到或加載主類的JAR文件

@echo off 
java -jar Test.jar 
pause 

一個罐子的

Manifest-Version: 1.0 
Main-Class: classes.TestClass 

在JAR目錄中的清單,我可以清楚地看到一個類\ TestClass文件,當我提取它。

編輯:classes.TestClass確實有public static void main(String[] args)。在classes.TestClass

包減速是package classes;

但我仍然不斷收到錯誤消息

Could not find or load main class classes.TestClass 

我經歷過的一切,我已經能夠找到這個問題,並且它都沒有似乎有幫助。

我試過編輯classpath,重做清單,安裝新的JRE。

我還應該做什麼?

+1

TestClass是否包含主函數? – Baz

+1

@Baz是的,它有一個主要方法。 – Austin

+2

你確定'TestClass'的包名是'classes'嗎? –

回答

7

1.創建一個文本文件卡列斯Manifest.txt和提供值作爲

主類:classes.TestClass

2.創建罐作爲

jar cfm test.jar Manifest.txt類/ *。類

3.Run罐子作爲

Java的罐子Test.jar的

+0

你能告訴你的java路徑和classpath集怎麼樣。在回覆之前,您可以嘗試一件事。嘗試通過命令行而不是Eclipse運行相同的TestClass。 – Arham

+0

我可以使用命令行運行該類。與其他java命令一起,如javac。 – Austin

1

這是非常困難的不完整信息進行調試。

這兩個最有可能的事情是,jar中的文件不存儲在JAR中的目錄中,或者它不是正確的文件。

您需要存儲TestClass.class - 一些在此商店新增的人員源文件TestClass.java。

而且您需要創建jar文件,以便TestClass.class出現一個類的路徑。確保它不是「/ classes」。使用zip查看文件並確保它具有「類」的路徑。

13

我得到它的工作是這樣的:

TestClass.Java

package classes; 

public class TestClass { 

    public static void main(String[] args) { 
     System.out.println("Test"); 
    } 

} 

使用javac在命令行上產生TestClass.class。將TestClass.class放入文件夾classes/

MANIFEST.MF

Manifest-Version: 1.0 
Main-Class: classes.TestClass 

然後運行

jar cfM MANIFEST.MF test.jar classes/ 

然後運行它作爲

java -jar test.jar 
+3

我想回答一個隱含在答案中的問題:「沒有jar文件的情況下,運行TestClass.class的類路徑」時,將「cd」指向已使用的路徑非常重要。例如,「cd/MyEclipseWorkspace/MyProject/bin」如果jar使用類文件的絕對路徑,它可能會因「無法找到或加載主類」錯誤而失敗。例如,這是錯誤的:jar cfm test.jar manifest.txt /absolutepath/classes/TestClass.class – Corral

+1

@ Corral的評論不應該被忽略。我一直在試圖解決這個問題,直到我讀了它,現在我的jar完美運行。 –

+0

'>%JAVAHOME%\ bin \ jar cfM MANIFEST.MF test.jar類/'結果在 'test.jar:沒有這樣的文件或目錄'和'MANIFEST.JS'現在被破壞(它的二進制文件現在)。 –

2

我有同樣的問題,到底它的,因爲我複製並將代碼粘貼到單詞上,這是一種稍微不同的' - '字符使用ACTER,這就是所有我能想到的,當我在手動鍵入它,它的工作

11

java命令「全路徑的 - 你 - 罐子」主

運行任何其他類有 「公共靜態無效的主要」 在一些包,

java命令 「全路徑的 - 你 - 罐子」 package1.package2.packages-hierarchy.ClassHavingMain

+2

請在您降低評價時添加解釋。 –

+1

如果你和你的jar在同一個目錄下,你是否需要放完整路徑? – Ungeheuer

+0

這真的解決了我的問題。我的manifest.md從來沒有工作... –

1

在LEA ST我做這個的方式如下:

如果你有一個嵌套的src樹(說com.test.myclass.MyClass),你從你需要做下面的根目錄編譯:

1)當您創建JAR(通常把這個腳本): 罐子-cvfm my.jar COM /測試/ MyClass的/ manifest.txt COM /測試/ MyClass的/ MyClass.class

2)清單應該看起來像:

Mainfest版本:1.0 Main-Class:com.test.myclass.MyClass Class-Pat H: 。 my.jar

3)現在你可以運行這樣從任何地方的jar:

Java的罐子my.jar

希望這可以幫助別人

2

我有,我可以通過授予執行特權在其中的jar文件的位置(在Linux系統上)所有父文件夾解決了類似的問題。

實施例:

/folder1/folder2/folder3/executable.jar

所有3個文件夾(文件夾1,文件夾2和folder3)以及所述executable.jar無需執行特權爲當前用戶,否則返回錯誤「無法找到或加載主類...」。

0

我有一個奇怪的問題,當MANIFEST.MF中的一個不正確的條目導致加載失敗。這是當我試圖發起一項非常簡單的Scala程序:

錯誤:

Main-Class: jarek.ResourceCache 
Class-Path: D:/lang/scala/lib/scala-library.jar 

正確:

Main-Class: jarek.ResourceCache 
Class-Path: file:///D:/lang/scala/lib/scala-library.jar 

用不正確的版本,我得到一個神祕的消息,同OP做到了。在解析清單文件時,可能應該說畸形的URL異常。

在清單文件中使用絕對路徑是IntelliJ用於爲程序提供長類路徑的用途。

相關問題