2012-11-21 50 views
1

好我想配置使用Ant的项目,这就是我得到:的NoClassDefFoundError在与蚂蚁运行

 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中的log4j的/ lib和在第二部分你可以看到它在运行时没有找到。很奇怪,因为它编译得很好,它似乎无法在运行时找到它。

我的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> 

其实行似乎并没有改变任何东西。

那么,它的任何想法?提前致谢。

+1

classpath作为属性可能会被设置一次,而不是你的任务。尝试使用-debug运行ant,它将写入属性,类路径等信息。 – Jayan

回答

0

您在这里遇到了一个常见问题:当您运行java -jar ...命令时,-classpath ...属性被删除。原因是安全性(Jar文件可以进行数字签名以确保它们未被修改,并且它会很容易使java加载具有相同内容但具有劫持功能的不同依赖项Jar文件)。

解决方法很简单:包括Class-Path: ...太属性,在MANIFEST.MF文件为您Main-Class: ...一样。