我正在尝试使用Ant配置项目,这就是我得到的:
D:\Dropbox\EclipseWorkspace\PIRS_Arturas_Masaitis\src\lib>dir
Volume in drive D is WinMedia
Volume Serial Number is 8ED9-B662
Directory of D:\Dropbox\EclipseWorkspace\PIRS_Arturas_Masaitis\src\lib
2012.11.20 16:11 <DIR> .
2012.11.20 16:11 <DIR> ..
2012.10.16 22:03 315.805 commons-lang3-3.1.jar
2012.10.23 23:08 176.897 commons-validator-1.4.0.jar
2012.11.20 15:30 <DIR> hibernate
2012.11.16 04:48 253.160 junit-4.10.jar
2012.10.22 02:02 489.883 log4j-1.2.17.jar
2012.10.31 23:00 1.581.066 mockito-all-1.9.5.jar
2012.11.02 19:54 651.643 mybatis-3.1.1.jar
2012.11.01 04:37 832.960 mysql-connector-java-5.1.22-bin.jar
7 File(s) 4.301.414 bytes
3 Dir(s) 7.277.907.968 bytes free
D:\Dropbox\EclipseWorkspace\PIRS_Arturas_Masaitis\src\lib>cd ../..
D:\Dropbox\EclipseWorkspace\PIRS_Arturas_Masaitis>
D:\Dropbox\EclipseWorkspace\PIRS_Arturas_Masaitis>
D:\Dropbox\EclipseWorkspace\PIRS_Arturas_Masaitis>ant run
Buildfile: D:\Dropbox\EclipseWorkspace\PIRS_Arturas_Masaitis\build.xml
init:
compile:
[javac] Compiling 1 source file to D:\Dropbox\EclipseWorkspace\PIRS_Arturas_
Masaitis\build
jar:
[jar] Building jar: D:\Dropbox\EclipseWorkspace\PIRS_Arturas_Masaitis\dist
\jar\PIRS_Arturas_Masaitis.jar
run:
[java] Exception in thread "main" java.lang.NoClassDefFoundError: org/apach
e/log4j/Logger
[java] at com.nortal.pirs.userinterface.fakestarter.FakeUserInterface.<
init>(Unknown Source)
[java] at com.nortal.pirs.userinterface.fakestarter.FakeUserInterface.m
ain(Unknown Source)
[java] Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
[java] at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
[java] at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
[java] at java.security.AccessController.doPrivileged(Native Method)
[java] at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
[java] at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
[java] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
[java] at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
[java] ... 2 more
[java] Java Result: 1
BUILD SUCCESSFUL
Total time: 2 seconds
D:\Dropbox\EclipseWorkspace\PIRS_Arturas_Masaitis>
首先,你可以看到我在文件夹src / lib中有log4j,在第二部分你可以看到它在运行时找不到。很奇怪,因为它编译得很好,它似乎无法在运行时找到它。
我的build.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project name="PIRS" default="dist" basedir=".">
<description>PIRS Arturas Masaitis</description>
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="dist" location="dist"/>
<property name="lib.dir" location="src/lib"/>
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
<fileset dir="${lib.dir}" includes="*.jar"/>
</path>
<target name="init">
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init">
<javac includeantruntime="false" srcdir="${src}" destdir="${build}">
<classpath>
<path refid="classpath"/>
</classpath>
</javac>
</target>
<target name="jar" depends="compile" description="generate the jar">
<mkdir dir="${dist}/jar"/>
<jar destfile="${dist}/jar/PIRS_Arturas_Masaitis.jar" basedir="${build}">
<manifest>
<attribute name="Main-Class" value="com.nortal.pirs.userinterface.fakestarter.FakeUserInterface"/>
</manifest>
</jar>
</target>
<target name="clean" description="clean up" >
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
<target name="run" depends="jar">
<java jar="${dist}/jar/PIRS_Arturas_Masaitis.jar" fork="true">
<classpath refid="classpath"/>
</java>
</target>
</project>
实际上这条线似乎没有任何改变。
嗯,有什么想法吗?提前谢谢。
答案 0 :(得分:0)
您在这里遇到了一个常见问题:当您使用java -jar ...
命令运行时,-classpath ...
属性被删除。原因是安全性(Jar文件可以数字化签名以确保它们没有被修改,并且使java
加载具有相同内容但具有被劫持功能的不同依赖Jar文件是如此容易。
解决方案很简单:在Class-Path: ...
文件中也包含MANIFEST.MF
属性,就像使用Main-Class: ...
一样。