簡體   English   中英

使用自行創建的jar文件時出現ClassNotFoundException

[英]ClassNotFoundException when using a self-created jar file

使用Eclipse,我創建了一些解析器類,我希望將它們作為jar存檔提供給另一個項目,以進行驗證。 因此,解析器項目如下所示:

ParserProject
- src
-- com.package.x
--- ClassA
--- ClassB
- lib
-- external1.jar
-- external2.jar

ClassAClassB使用外部jar檔案,例如Jackson或某些Apache Commons。 為了向另一個項目提供功能,我將整個項目導出為jar存檔和可執行的jar存檔( 右鍵單擊項目> Export ...> Java> JAR文件>選擇所有文件,然后“導出生成的類文件和資源”>完成 )。

創建的jar文件沒有任何錯誤。 在驗證項目中使用parserproject.jar時,可以使用自動完成功能訪問所有方法,但是在運行驗證項目時,會得到java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonParseException

現在有三件事:

  1. 所有傑克遜罐子都包含在解析器項目中。 此外,我可以在解析器項目中運行main()方法,並且一切正常,不會發生ClassNotFoundException

  2. 當我在類路徑中將parserproject.jar添加到驗證項目並在Package Explorer中打開jar存檔時,parserproject.jar似乎包含了它所需的所有jar。

  3. 對於可執行jar存檔,所有必需的外部jar都包含在MANIFEST.MF程序包瀏覽器>驗證項目>引用的庫> +,除了parserproject.jar> META-INF> MANIFEST.MF )。 看起來像這樣:

清單版本:1.0 Rsrc類路徑:./ json-20140107.jar jackson-annotations-2.5.4.jar ja ckson-core-2.5.4.jar jackson-databind-2.5.4.jar commons-io- 2.4.jar co mmons-validator-1.3.1.jar slf4j-api-1.7.5.jar slf4j-log4j12-1.7.5.jar json-schema-validator-2.2.6.jar jackson-module-jsonSchema-2.4。 4.jar juniversalchardet-1.0.3.jar snakeyaml-1.15.jar commons-beanutils-1.7。 0.jar commons-digester-1.6.jar commons-logging-1.0.4.jar joda-time-2。 8.1.jar jopt-simple-4.6.jar jsr305-3.0.0.jar json-schema-core-1.2.5.j ar libphonenumber-6.2.jar jackson-coreutils-1.8.jar commons-lang-2.6。 jar guava-16.0.1.jar msg-simple-1.1.jar btf-1.2.jar mailapi-1.4.3.jar uri-template-0.9.jar類路徑:。 Rsrc主要類別:com.package.SchemeValidator主要類別:org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

  1. 當且僅當我在驗證項目中使用生成的jar文件時,我才會獲得異常。 如果我擺脫了parserproject.jarparserproject.jar定義了對ecplise解析器項目的依賴關系( 右鍵單擊驗證項目>屬性> Java構建路徑>項目 ),則不會得到ClassNotFoundException

所以現在我的問題是,我應該如何導出jar,以便找到每個類。 謝謝!

Eclipse在生成.jar時僅照顧編譯時的依賴性

由於您生成的.jar幾乎可以移動到任何地方,因此在執行期間必須再次存在依賴項。

您有兩種選擇:

  1. 使用-jar選項執行jar,同時將所有依賴項保留在同一文件夾中。 由於清單使用“ ./”作為classpath ,這意味着所有依賴項都必須位於從中執行jar的同一目錄中。 注意 classpath相對於您正在執行的目錄,而不是文件所在的目錄。
  2. 使用-jar選項執行jar,然后指定-cp選項以指向依賴項,並指定主類。

java -cp "<path to your jar>;<path to dependency 1>;<path to dependency 3>[;...]" <your main class>

您可能會考慮創建一個所謂的胖子罐,其中將包含所有需要的類。 例如: http : //fjep.sourceforge.net/

如果您不想自己管理所有依賴關系的麻煩,請考慮使用Maven https://maven.apache.org/或Gradle https://gradle.org/之類的構建工具。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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