2016-09-15 152 views
2

用盡了關於問題原因的想法。我有一個Java jar(如果這很重要,請從intellij下的gradle構建)。Java Jar - 類路徑問題

  • Jar有一個清單。

  • 啓動含有JAR目錄java -jar MyJar.jar給出「無法找到或加載主類companyname.mainclass」

  • 的Java從清單作爲讀取裏面的jar清單文件編輯到mainclass2將錯誤更改名稱消息

  • 清單僅包含在一條線上的版本,在一條線上然後主類屬性,然後2個空行

  • 所有依賴關係是在一個/ lib文件夾相對於罐子所以清單中沒有指定類路徑

  • 在zip文件程序中打開jar會顯示文件夾companyname,其中包含文件mainclass,因此限定名稱會反映在jar結構中。大寫也是正確的。

  • 手動指定類名java -cp MyJar.jar companyname.mainclass給出了同樣的類未找到錯誤

  • 有問題的類確實有一個主要方法,並且不會在IDE下運行正常,當解壓縮。

我錯過了什麼(除了頭上越來越多的頭髮)?

修改的其他詳情: - 使用Java 8

罐子結構:

-META-INF 
    MANIFEST.MF 
-companyname 
    -module 
    -interfaces 
     interface1.class 
    -commands 
     baseCommand.class 
     register.class 
     specialCommand.class 
    moduleSpec.class 
    moduleProcessor.class 
    mainclass.class 
log4j.xml 
springconfig1.xml 
springconfig2.xml 

清單文件:

Manifest-Version: 1.0 
Main-Class: companyname.mainclass 
(newline char here) 
(newline char here) 
+0

在編輯中分享jar文件 –

+0

中文件的結構和位置。 – SeeMoreGain

+0

介意如果您還添加清單的內容? –

回答

2

首先,確保你正在創建可執行的jar。有關使用gradle創建可執行jar的信息,請參閱this answer

如果您正在創建並打包您的jar,可能無法加載您的主類,因爲它具有無法找到的依賴關係。你說:

所有相關性在/ lib文件夾相對於罐子所以沒有如果你的意思是,lib文件夾是在文件系統上的同一文件夾中的清單

指定的類路徑。 jar文件,那麼你的依賴不會被發現。該lib文件夾的內容不會自動添加到jar的類路徑中。您可以手動將它們添加到java命令的類路徑中,也可以將它們添加到清單中。如果將它們添加到類路徑中,你可以使用通配符:

java -cp "MyJar.jar;lib/*" com.mycompany.MyMainClass 

如果將它們添加到清單,you can't use wildcards,所以你需要指定lib目錄下的每個單獨的JAR依賴。 (更多信息請參見Oracle tutorial on adding jars to the classpath。)

如果lib目錄位於jar(「fat jar」)內部,那麼沒有類路徑可以幫助您:默認的classloader不會從可執行文件jar中加載依賴關係。但是,有多種工具可以讓您創建一個包含所有依賴關係的胖jar包,並將其作爲單個可執行jar分發。由於您使用了gradle,因此gradle shadow plugin可能對您有用。

+0

我曾經讀過關於classpath的某處並直接從/ lib目錄讀取,因此發表評論。需要記住不要相信我在互聯網上閱讀的所有內容! – SeeMoreGain

0

清單將利用這裏。此外,如果您嘗試

java -jar -verbose:class MyJar | grep mainclass 

它會確認您的班級是否正在加載。哦 - 另外,這裏有沒有JVM的混合?

確保java -version顯示一個Java 8,因爲這就是Intellij/Gradle構建的提示。

+0

所以管道只顯示錯誤消息。看着整個詳細的輸出,它肯定會加載java 8 jre。但不加載任何我的課程。它加載java類(全部在.jar中),然後出現錯誤消息,最後出現兩個java庫('java.lang.Shutdown')加載。那麼任何線索呢? – SeeMoreGain

0

如果您的主類有一個靜態初始化塊會在運行時引發一些錯誤,則可能是原因。

+0

這不是網站尋找的答案,這是最好的評論,也是最差的評論。 –