java - ant 运行时出现 NoClassDefFoundError

标签 java ant configuration noclassdeffounderror build.xml

我正在尝试使用 Ant 配置项目,这就是我得到的:

     D:\Dropbox\EclipseWorkspace\PIRS\src\lib>dir
     Volume in drive D is WinMedia
     Volume Serial Number is 8ED9-B662
    
     Directory of D:\Dropbox\EclipseWorkspace\PIRS\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\src\lib>cd ../..
    
    D:\Dropbox\EclipseWorkspace\PIRS>
    D:\Dropbox\EclipseWorkspace\PIRS>
    D:\Dropbox\EclipseWorkspace\PIRS>ant run
    Buildfile: D:\Dropbox\EclipseWorkspace\PIRS\build.xml
    
    init:
    
    compile:
        [javac] Compiling 1 source file to D:\Dropbox\EclipseWorkspace\PIRS\build
    
    jar:
          [jar] Building jar: D:\Dropbox\EclipseWorkspace\PIRS\dist
    \jar\PIRS.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>

首先你可以看到我在 src/lib 文件夹中有 log4j,在第二部分你可以看到它在运行时没有找到。很奇怪,因为它编译得很好,但似乎在运行时找不到它。

我的build.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project name="PIRS" default="dist" basedir=".">
    <description>PIRS</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.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.jar" fork="true">
        <classpath refid="classpath"/>
            
        </java>
    </target>
        
</project>

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

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

最佳答案

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

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

关于java - ant 运行时出现 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13486996/

相关文章:

java正则表达式月份2位数

macos - Ant 套接字任务在 Mac 上不起作用

java - 使用 .jars 编译会导致缺少 .class 文件

configuration - 如何解决Prometheus错误 'role missing (one of: pod, service, endpoints, node)'

configuration - 为 Nix 配置 Iosevka

java - 绘制罗塞塔形状

java - 如何在 POJO 中表示集合以在 Grails View 中呈现为选择

java - 无法使用 mapstruct 将 List<Source> 映射到 List<Target>

regex - 如何在Ant 'ReplaceRegExp'任务中执行数学函数?

在不太了解服务器配置的情况下发送电子邮件的 C# 代码?