NoClassDefFoundError at runtime with ant

怎甘沉沦 提交于 2019-12-24 16:13:03

问题


well I'm trying to configure the project with Ant and this is what I get:

     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>

Well first you can see I have the log4j in the folder src/lib and in the second part you can see that it's not found at runtime. Pretty strange, because it compiles fine, it just seems to not be able to find that at runtime.

My 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>

Actually the line doesn't seem to change anything.

Well, any ideas on it? Thanks in advance.


回答1:


You met a common issue here: when you run something with the java -jar ... command, the -classpath ... property is dropped. The reason is security (Jar files can be digitally signed to ensure they weren't modified and it would be so easy to make java load a different dependency Jar file with the same content but with hijacked functionality).

The solution is simple: include the Class-Path: ... attribute too in your MANIFEST.MF file as you did with Main-Class: ....



来源:https://stackoverflow.com/questions/13486996/noclassdeffounderror-at-runtime-with-ant

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!