我写了一个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在类路径中存在,我已经尝试了类路径的所有组合,但是徒劳无功。
但是在另一个系统中,我试过没有创建像
这样的jarset 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
它也可以正常工作:(但是我创造它的那一刻就停止了。
如何解决此问题?
答案 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