2010-04-22 69 views
2

我正在尝试为使用hibernate的项目编译可运行的jar文件。我试图构建一个ant build.xml文件来简化我的构建过程,但是我在最终jar文件中包含hibernate3.jar时遇到了麻烦。在ant build中包含休眠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在项目的根目录中。 manifest.classpath变量接受所有这些库jar文件的类路径,并使用pathconvert和mapper将它们弄平。

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

回答

2

因为你不能指定jar-inside-jar在你的类路径,这种方式将无法正常工作。 你需要要么罐子只代码,然后用库瓶和启动脚本压缩您的罐子,就像

(这是大多数人做的),或者你可以解开所有的lib罐子一样其中包含你的编译类,然后将jar结果返回到单个jar文件(这是maven jar -with-dependencies包装所做的)。

+0

谢谢您的澄清。我选择将所有lib库解压到我的build-dir中,并将所有类与项目类一起重新打包。 我使用了zipfileset:,但是有没有更简单的方法在目录中包含多个jar文件,而不必调用zipfileset为每个我想包括的jar文件? – Patrick 2010-04-22 12:58:17

+0

你总是可以写sh脚本,它会做'jar xf * jar; jar cf my-app-with-libs.jar *'。 不过,我会推荐第一种方法 - zip将自动解压缩并通过附带的shell脚本启动。使用第二种方法,您必须照顾来自不同库的具有相同FQCN的类(如果有的话)。 – 2010-04-22 13:48:23

+0

好的,非常感谢您的帮助。实际上,我选择将清单类路径指向一个附带的lib子文件夹,我在其中复制了所有必需的jar文件,现在它效果很好。 – Patrick 2010-04-22 16:16:05