簡體   English   中英

Java —為常見軟件包創建一個Jar文件

[英]Java — Creating a Jar file for common packages

我有一個問題,希望有人能幫助我。

我有兩個Java項目,我們將其稱為CORE,其中包含一堆具有通用功能的類,並為數據庫提供了休眠接口/ dao等。

其他項目需要CORE才能與我們的數據庫進行交互並利用通用的核心功能。

現在,我已經使用Gradle創建了一個Jar文件,通過我的IDE將jar文件導入了其他項目,並且一切都正確地編譯了。

但是,當我嘗試運行其他項目時,我得到了

Java.lang.NoClassDefFoundError:無法初始化類

現在我了解到,在創建一個Jar文件時,您需要提供一個清單文件,其中詳細說明了入口點....但是Core項目沒有任何可運行的main方法....所以我如何創建這樣的Jar其他所有項目都可以使用CORE嗎?

謝謝


更新

好的,我想在這里我需要更多幫助(感謝到目前為止的所有信息)

正確,因此我在gradle文件中將jar作為編譯和運行時依賴項

dependencies {
compile files('lib/CORE-all-1.0.jar')
runtime files('lib/CORE-all-1.0.jar')
compile 'org.testng:testng:6.9.6'
compile 'org.hamcrest:hamcrest-all:1.3'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.6.1'
compile 'com.fasterxml.jackson.core:jackson-core:2.6.1'
compile 'com.fasterxml.jackson.core:jackson-databind:2.6.1'
compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.6.1'
compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'
compile 'org.apache.httpcomponents:httpclient:4.5'
compile 'joda-time:joda-time:2.8.2'
compile 'org.slf4j:jcl-over-slf4j:1.7.12'
compile 'ch.qos.logback:logback-classic:1.1.3'
compile 'net.sf.ehcache:ehcache:2.10.1'

}

如果我打印課程路徑,我可以看到Jar :(

:printClasspath /Users/xxxxx/IdeaProjects/testProject/lib/CORE-all-1.0.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/org.testng/testng/6.9.6/e6788337be58ddc30c01d0ade783fb06cc825c7c/ testng-6.9.6.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-all/1.3/63a21ebc981131004ad02e0434e799fd7f3a8d5a/hamcrest-all-1.3.jar / Users / xxxxx /。 gradle / caches / modules-2 / files-2.1 / com.fasterxml.jackson.core / jackson-annotations / 2.6.1 / f9661ddd2456d523b9428651c61e34b4ebf79f4e / jackson-annotations-2.6.1.jar /Users/xxxxx/.gradle/caches/modules -2 / files-2.1 / com.fasterxml.jackson.core / jackson-core / 2.6.1 / 892d15011456ea3563319b27bdd612dbc89bb776 / jackson-core-2.6.1.jar /Users/xxxxx/.gradle/caches/modules-2/files- 2.1 / com.fasterxml.jackson.core / jackson-databind / 2.6.1 / 45c37a03be19f3e0db825fd7814d0bbec40b9e0 / jackson-databind-2.6.1.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/com.fasterxml .jackson.dataformat /傑克遜-DATAFORMAT-XML / 2.6.1 / a6fbc5b4c5622cda94d86ccfe93208b954765ccd /傑克遜-d ataformat-xml-2.6.1.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/org.codehaus.jackson/jackson-mapper-asl/1.9.13/1ee2f2bed0e5dd29d1cb155a166e6f8d50bbddb7/jackson-mapper-asl -1.9.13.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5/a1e6cbb3cc2c5f210dd1310ff9fcb2c09c0d1438/httpclient-4.5.jar /Users/xxxxx/.gradle/caches /modules-2/files-2.1/joda-time/joda-time/2.8.2/d27c24204c5e507b16fec01006b3d0f1ec42aed4/joda-time-2.8.2.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/ org.slf4j / jcl-over-slf4j / 1.7.12 / adef7a9e1263298255fdb5cb107ff171d07c82f3 / jcl-over-slf4j-1.7.12.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/ch.qos.logback /logback-classic/1.1.3/d90276fff414f06cb375f2057f6778cd63c6082f/logback-classic-1.1.3.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/net.sf.ehcache/ehcache/2.10.1/ a507a1302b631d0718fe29ae95d4e52e646ecc5a / ehcache-2.10.1.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/com.google.inject/guice/4.0/199b7acaa05b5 70bbccf31be998f013963e5e752 / guice-4.0-no_aop.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/org.beanshell/bsh/2.0b4/a05f0a0feefa8d8467ac80e16e7de071489f0d9c/bsh-2.0b4。 gradle / caches / modules-2 / files-2.1 / org.apache.ant / ant / 1.7.0 / 9746af1a485e50cf18dcb232489032a847067066 / ant-1.7.0.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1 /com.beust/jcommander/1.48/bfcb96281ea3b59d626704f74bc6d625ff51cbce/jcommander-1.48.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/org.yaml/snakeyaml/1.15/3b132bea69e8ee099f044。 Users / xxxxx / .gradle / caches / modules-2 / files-2.1 / junit / junit / 4.10 / e4f1766ce7404a08f45d859fb9c226fc9e41a861 / junit-4.10.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/com。 fastxml.jackson.module / jackson-module-jaxb-annotations / 2.6.1 / 6e49b856747d22cc74fd0dddf8c584de1522916c / jackson-module-jaxb-annotations-2.6.1.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1 /org.codehaus.woodstox/stax2-api/3.1.4/ac19014b1e6a7c08aad07fe1 14af792676b685b7 / stax2-api-3.1.4.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/org.codehaus.jackson/jackson-core-asl/1.9.13/3c304d70f42f832e0a86d45bd437f692129299a4/jackson-core -asl-1.9.13.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.1/f5aa318bda4c6c8d688c9d00b90681dcd82ce636/httpcore-4.4.1.jar / Users / xxxxx / .gradle / caches / modules-2 / files-2.1 / commons-logging / commons-logging / 1.2 / 4bfc12adfe4842bf07b657f0369c4cb522955686 / commons-logging-1.2.jar /Users/xxxxx/.gradle/caches/modules-2/files- 2.1 / commons-codec / commons-codec / 1.9 / 9ce04e34240f674bc72680f8b843b1457383161a / commons-codec-1.9.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.12 /8e20852d05222dc286bf1c71d78d0531e177c317/slf4j-api-1.7.12.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-core/1.1.3/e3c02049f2dbbc764681b40094core-fc0dcb 1.1.3.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/javax.inject/javax.inject/1/6 975da39a7040257bd​​51d21a231b76c915872d38 / javax.inject-1.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/aopalliance/aopalliance/1.0/235ba8b489512805ac13a8f9ea77a1ca5ebe3e8/jar/acapalliance-1.0。 modules-2 / files-2.1 / com.google.guava / guava / 16.0.1 / 5fa98cd1a63c99a44dd8d3b77e4762b066a5d0c5 / guava-16.0.1.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/org.apache .ant / ant-launcher / 1.7.0 / e7e30789211e074aa70ef3eaea59bd5b22a7fa7a / ant-launcher-1.7.0.jar /Users/xxxxx/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.1/ 860340562250678d1a344907ac75754e259cdb14 / hamcrest核-1.1.jar

而且我仍然看到錯誤:(

如果您的JAR文件是一個庫,則它的MANIFEST.MF文件中不會包含Main-Class條目。 庫支持其他程序,但它們無法運行。

如果您的JAR文件是程序,則需要在其MANIFEST.MF中同時包含Main-Class條目,清單可能應該在MANIFEST.MF中使用Class-Path條目提及所需的JAR文件。

如果您的JAR文件是嵌入在其他程序中的程序(不應,但是會發生),則其他程序將控制啟動行為。 沒有所謂的“庫提供的程序啟動器”。

有Java框架,它們是缺少關鍵功能的程序。 在這種情況下,您的代碼基本上是框架加載和運行的庫,並且將Main-Class添加到您的JAR文件不會影響Framework的Main-Class行為,因為Framework是啟動程序。

考慮到這一點,IDE通常會維護一個單獨的“運行”配置,該配置並不總是遵循您可能在命令行上使用的約定。 您應該查看您的IDE運行配置,並在可能的情況下將它們對齊以鏈接到所需的命令行調用,或者采取措施確保它們不會分開。 在您的情況下,可能是您的IDE缺少同一個CLASS_PATH上的兩個JAR文件,但是有關如何修復特定於您的IDE以及您創建的類型或項目的詳細信息。

您當然有類路徑問題。

  • 如果從IDE運行項目,則還需要添加核心依賴項(例如休眠)。

    Gradle可以使用想法插件更新您的類路徑: https : //docs.gradle.org/current/userguide/idea_plugin.html

  • 如果您在命令行中運行項目,則需要使用classpath選項指定所有依賴項。 例如: java -cp "Test.jar;lib/*" my.package.MainClass

    或者,您可以使用wildfly-swarmonejar創建一個uberjar

您的核心jar只需包含在使用它的任何應用程序的類路徑中。

例如

java -cp core.jar;app.jar path.to.main.class.in.app.jar

或者,您可以在構建應用程序jar時將其打包,然后將其添加到清單中,如下所示:

Class-Path: core.jar
Main-Class: path.to.main.class.in.app.jar

然后構建app.jar,在根目錄中包括core.jar

jar cfm app.jar MANIFEST.MF pathToClasses core.jar

並通過...致電

java -jar app.jar

在此示例中, core.jar包含在類路徑中,而app.jar已經知道其主類,因此調用更加簡單。

或使用sbt-assembly或onejar之類的內容創建一個“胖罐”。

暫無
暫無

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

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