繁体   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