Ant +类路径问题

时间:2010-08-12 14:19:28

标签: ant classpath

我写了一个ANT脚本,最后正在构建jar

这里是jar部分的构建

<jar jarfile="${destination}/@{name}.jar">
     <fileset dir="${output}">
         <include name="abc/xyz/@{name}/**"/>
     </fileset>
     <zipfileset dir="lib" prefix="lib/"/>
     <manifest>
          <attribute name="Main-Class" value="com.abc.xyz.HelloWorld"/>
          <attribute name="Class-Path" value=".:lib/activation.jar:lib/antlr-2.7.6.jar:lib/asm-attrs.jar:lib/asm.jar:lib/cglib-2.1.3.jar:lib/commons-collections-2.1.1.jar:lib/commons-logging-1.1.jar:lib/dom4j-1.6.1.jar:lib/ehcache-1.2.3.jar:lib/ejb3-persistence.jar:lib/hibernate-annotations.jar:lib/hibernate-commons-annotations.jar:lib/hibernate-entitymanager.jar:lib/hibernate-tools.jar:lib/hibernate3.jar:lib/javassist.jar:lib/jdbc2_0-stdext.jar:lib/jta.jar:lib/mysql-connector-java-5.1.5-bin.jar"/>
     </manifest>
</jar>

现在当我尝试执行它执行的包时,但每当发送数据时我都会收到错误。

java.lang.NoClassDefFoundError: javax/persistence/NoResultException

但是持久性jar在类路径中存在,我已经尝试了类路径的所有组合,但是徒劳无功。

但是在另一个系统中,我试过没有创建像

这样的jar
set classpath=.;lib/activation.jar;lib/antlr-2.7.6.jar;lib/asm-attrs.jar;lib/asm.jar;lib/cglib-2.1.3.jar;lib/commons-collections-2.1.1.jar;lib/commons-logging-1.1.jar;lib/dom4j-1.6.1.jar;lib/ehcache-1.2.3.jar;lib/ejb3-persistence.jar;lib/hibernate-annotations.jar;lib/hibernate-commons-annotations.jar;lib/hibernate-entitymanager.jar;lib/hibernate-tools.jar;lib/hibernate3.jar;lib/javassist.jar;lib/jdbc2_0-stdext.jar;lib/jta.jar;lib/mysql-connector-java-5.1.5-bin.jar
java com.abc.xyz.HelloWorld

这很好用。

在Mac中,当我尝试这样的时候:

java -cp .:lib/activation.jar:lib/antlr-2.7.6.jar:lib/asm-attrs.jar:lib/asm.jar:lib/cglib-2.1.3.jar:lib/commons-collections-2.1.1.jar:lib/commons-logging-1.1.jar:lib/dom4j-1.6.1.jar:lib/ehcache-1.2.3.jar:lib/ejb3-persistence.jar:lib/hibernate-annotations.jar:lib/hibernate-commons-annotations.jar:lib/hibernate-entitymanager.jar:lib/hibernate-tools.jar:lib/hibernate3.jar:lib/javassist.jar:lib/jdbc2_0-stdext.jar:lib/jta.jar:lib/mysql-connector-java-5.1.5-bin.jar com.abc.xyz.HelloWorld

它也可以正常工作:(但是我创造它的那一刻就停止了。

如何解决此问题?

2 个答案:

答案 0 :(得分:0)

首先,“Main-Class”和“Class-Path”最明显的条目仅用于可执行的jar。换句话说,当您按如下方式调用java时:

java -jar foo.jar

使用 -cp 选项调用java意味着您正在提供自己的类路径,并注意您还必须在命令行上提供主类。

其次,你需要用空格替换“:”字符:

<attribute name="Class-Path" value=". lib/activation.jar lib/antlr-2.7.6.jar lib/asm-attrs.jar lib/asm.jar lib/cglib-2.1.3.jar lib/commons-collections-2.1.1.jar lib/commons-logging-1.1.jar lib/dom4j-1.6.1.jar lib/ehcache-1.2.3.jar lib/ejb3-persistence.jar lib/hibernate-annotations.jar lib/hibernate-commons-annotations.jar lib/hibernate-entitymanager.jar lib/hibernate-tools.jar lib/hibernate3.jar lib/javassist.jar lib/jdbc2_0-stdext.jar lib/jta.jar lib/mysql-connector-java-5.1.5-bin.jar"/>

最后,我建议您使用 manifestclasspath 任务为您构建类路径字符串。它将正确解决jar和它的运行时依赖关系之间的任何相对链接。

<manifestclasspath property="mf.classpath" jarfile="${destination}/@{name}.jar">
    <classpath>
        <fileset dir="lib" includes="*.jar"/>
    <classpath>
</manifestclasspath>

<jar jarfile="${destination}/@{name}.jar">
    <fileset dir="${output}">
       <include name="abc/xyz/@{name}/**"/>
    </fileset>
    <zipfileset dir="lib" prefix="lib/"/>
    <manifest>
       <attribute name="Main-Class" value="com.abc.xyz.HelloWorld"/>
       <attribute name="Class-Path" value=". ${mf.classpath}"/>
    </manifest>
</jar>

最后一个观察....为什么你要在jar里面包含lib目录的内容? (jar命令中的zipfileset标签?)

这似乎是不必要的,您需要做的就是确保运行时依赖项存在于类路径清单条目中指定的lib目录中。

答案 1 :(得分:0)

它不起作用的原因是没有在类路径中,这里给出了解释: Java-Jar-Ignores-Classpath-Workaround