在NoClassDefFoundError的使用Ant运行 [英] NoClassDefFoundError at runtime with ant

查看:252
本文介绍了在NoClassDefFoundError的使用Ant运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

还有我想配置使用Ant的项目,这是我所得到的:

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>

那么首先你可以看到我在文件夹中的src / lib中的log4j,并在第二部分,你可以看到它在运行时找不到。 pretty奇怪,因为它编译罚款,它只是似乎不能够找到在运行时。

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.

我的build.xml文件:

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.

推荐答案

您在这里会见了一个共同的问题:当您运行的东西在 Java的罐子... 命令时, -classpath ... 属性下降。的原因是安全性(Jar文件可以进行数字签名,以确保他们不会修改,这将是很容易使的Java 加载不同的依赖Jar文件具有相同内容但具有劫持功能)。

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).

解决方案很简单:包括类路径:... 太属性的 MANIFEST.MF 文件作为您 Main-Class的那样:......

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

这篇关于在NoClassDefFoundError的使用Ant运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆