我正在尝试为一个使用hibernate的项目编译一个可运行的jar文件。我正在尝试构建一个ant build.xml文件来简化我的构建过程,但是在最终的jar文件中包含hibernate3.jar时遇到了问题。
如果我运行ant脚本,我会设法包含所有的库jar,并且它们被放在最终的jar文件的根目录中。当我运行jar-file时,我得到一个
java.lang.NoClassDefFoundError: org/hibernate/Session 错误。如果我在Eclipse中使用到jar的内置导出,那么只有当我选择“将所需的库提取到jar中”时,它才会起作用。但这会使jar变得臃肿,并包含太多我的项目(即单元测试)。
下面是我生成的清单:
Manifest-Version: 1.0
Main-Class: main.ServerImpl
Class-Path: ./ antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar
hibernate3.jar javassist-3.9.0.GA.jar jta-1.1.jar slf4j-api-1.5.11.jar
slf4j-simple-1.5.11.jar mysql-connector-java-5.1.12-bin.jar rmiio-2.0.2.jar
commons-logging-1.1.1.jarbuild.xml的部分看起来像这样:
<target name="dist" depends="compile" description="Generates the Distribution Jar(s)">
<mkdir dir="${dist.dir}" />
<jar destfile="${dist.dir}/${dist.file.name}.jar" basedir="${build.prod.dir}" filesetmanifest="mergewithoutmain">
<manifest>
<attribute name="Main-Class" value="${main.class}" />
<attribute name="Class-Path" value="./ ${manifest.classpath} " />
<attribute name="Implementation-Title" value="${app.name}" />
<attribute name="Implementation-Version" value="${app.version}" />
<attribute name="Implementation-Vendor" value="${app.vendor}" />
</manifest>
<zipfileset refid="hibernatefiles" />
<zipfileset refid="slf4jfiles" />
<zipfileset refid="mysqlfiles" />
<zipfileset refid="commonsloggingfiles" />
<zipfileset refid="rmiiofiles" />
</jar>
</target>zipfilesets的refid指向项目根目录下的库目录lib中的目录。classpath变量获取所有这些库jar文件的类路径,并使用pathconvert和mapper将它们展平。
我还尝试将清单类路径设置为“.”、"./“,并且仅将库jar设置为".",但没有任何区别。我希望有一个简单的方法来解决我的问题...
发布于 2010-04-22 19:31:56
由于您不能在类路径中指定jar-inside-jar,因此这种方式将不起作用。您只需要压缩您的代码,然后使用libs jar和启动脚本压缩您的jar,如下所示
#!/bin/sh
java -cp ./hibernate.jar:./mycode.jar... my.Main(这是大多数人都会做的),或者您可以将所有lib jar解压到包含已编译类的同一目录中,然后将jar结果目录返回到单个jar文件(这就是maven jar与依赖项打包所做的事情)。
https://stackoverflow.com/questions/2690143
复制相似问题