在ant build中包含hibernate jar依赖项

时间:2010-04-22 10:58:28

标签: java hibernate ant manifest executable-jar

我正在尝试为一个使用hibernate的项目编译一个可运行的jar文件。我正在尝试构建一个ant build.xml文件来简化我的构建过程,但是我在最终的jar文件中包含hibernate3.jar时遇到了麻烦。

如果我运行ant脚本,我设法包含我的所有库jar,并将它们放在最终的jar文件的根目录中。当我运行jar文件时,我得到了一个

java.lang.NoClassDefFoundError: org/hibernate/Session 

错误。如果我在Eclipse中使用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.jar

build.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的refids指向项目根目录中lib目录lib中的目录。 manifest.classpath-variable获取所有库jar文件的类路径,并使用pathconvert和mapper展平它们。

我也尝试将清单类路径设置为“。”,“。/”,只设置库jar,但完全没有区别。我希望对我的问题有一个简单的补救措施......

1 个答案:

答案 0 :(得分:2)

由于您无法在类路径中指定jar-inside-jar,因此这种方式无效。 你需要只装载你的代码,然后使用libs jars和启动脚本压缩你的jar,比如

#!/bin/sh
java -cp ./hibernate.jar:./mycode.jar... my.Main

(这是大多数人所做的),或者您可以将所有lib jar解压缩到包含编译的类的同一个dir,然后将jar结果dir返回到单个jar文件(这是什么maven jar - 依赖包装做)。