2012-11-21 116 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: ...一樣。