运行时使用ant的NoClassDefFoundError

时间:2012-11-21 05:36:09

标签: java ant configuration noclassdeffounderror build.xml

我正在尝试使用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>

实际上这条线似乎没有任何改变。

嗯,有什么想法吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

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

解决方案很简单:在Class-Path: ...文件中也包含MANIFEST.MF属性,就像使用Main-Class: ...一样。