Java - 为通用包创建Jar文件

时间:2016-02-24 16:25:23

标签: java hibernate intellij-idea jar

我有一个问题,我希望那里有人可以帮助我。

我有两个java项目,我们称之为CORE,它包含一堆常用功能的类,并为我们的数据库提供hibernate接口/ 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/jackson-dataformat-xml/2.6.1/a6fbc5b4c5622cda94d86ccfe93208b954765ccd/jackson-dataformat-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/199b7acaa05b570bbccf31be998f013963e5e752/guice-4.0-no_aop.jar   /Users/xxxxx/.gradle/caches/modules-2/files-2.1/org.beanshell/bsh/2.0b4/a05f0a0feefa8d8467ac80e16e7de071489f0d9c/bsh-2.0b4.jar   /Users/xxxxx/.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/3b132bea69e8ee099f416044970997bde80f4ea6/snakeyaml-1.15.jar   /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.fasterxml.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/ac19014b1e6a7c08aad07fe114af792676b685b7/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/e3c02049f2dbbc764681b40094ecf0dcbc99b157/logback-core-1.1.3.jar   /Users/xxxxx/.gradle/caches/modules-2/files-2.1/javax.inject/javax.inject/1/6975da39a7040257bd​​51d21a231b76c915872d38/javax.inject-1.jar   /Users/xxxxx/.gradle/caches/modules-2/files-2.1/aopalliance/aopalliance/1.0/235ba8b489512805ac13a8f9ea77a1ca5ebe3e8/aopalliance-1.0.jar   /Users/xxxxx/.gradle/caches/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-core-1.1.jar

我仍然看到错误:(

3 个答案:

答案 0 :(得分:1)

如果您的JAR文件是库,则它的MANIFEST.MF中不会获得Main-Class条目。图书馆支持其他程序,它们不运行。

如果您的JAR文件是程序,则需要在其MANIFEST.MF中包含Main-Class条目,并且清单应该在MANIFEST.MF中提及具有Class-Path条目的所需JAR文件。

如果您的JAR文件是嵌入在其他程序中的程序(它不应该,但它会发生),OTHER程序将控制启动行为。没有“图书馆提供的程序启动器”这样的东西。

有Java框架,它们是缺少关键功能的程序。在这种情况下,您的代码基本上是框架加载和运行的库,并且向JAR文件添加Main-Class不会影响Framework的Main-Class行为,因为Framework是启动程序。

考虑到这一点,IDE通常会维护一个单独的运行配置,该配置并不总是遵循您可能在命令行上使用的约定。您应该检查IDE运行配置,如果可能的话,将它们与任一链路对齐到所需的命令行调用,或采取措施确保它们不会分开。在您的情况下,您的IDE缺少同一CLASS_PATH上的两个JAR文件,但有关如何修复的详细信息特定于您的IDE以及您创建的类型或项目。

答案 1 :(得分:0)

你肯定有类路径问题。

  • 如果从IDE运行项目,则还需要添加核心依赖项(如hibernate)。

    Gradle可以使用构思插件更新您的类路径:https://docs.gradle.org/current/userguide/idea_plugin.html

  • 如果在命令行中运行项目,则需要使用classpath选项指定所有依赖项。例如:java -cp "Test.jar;lib/*" my.package.MainClass

    或者您可以使用wildfly-swarmonejar创建一个uberjar。

答案 2 :(得分:0)

您的核心jar只需要包含在使用它的任何应用程序的类路径中。

E.g。

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

或者你可以在构建它时在你的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。