1

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

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

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

4

1 回答 1

0

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

解决方案很简单:Class-Path: ...在您的文件中也包含该属性,MANIFEST.MF就像您对Main-Class: ....

于 2012-11-21T08:19:20.893 回答