由Ant构建的Jar程序没有看到具有显式设置的类路径的类

时间:2013-03-15 14:45:29

标签: java ant classpath

所以,这是我的build.xml:

<?xml version="1.0"?>
  <project name="test" default="hello_jar">
  <path id="commons" >
    <fileset dir="lib">
      <include name="commons-lang-2.6.jar"/>
    </fileset>
  </path>
  <target name="compile">
    <mkdir dir="build/classes"/>
    <javac srcdir="src/test_package" destdir="build/classes" classpathref="commons"/>
  </target>
<target name="hello_jar" depends="compile">
  <mkdir dir="build/jar"/>
  <jar destfile="build/jar/hello.jar">
    <fileset dir="build/classes">
      <include name="test_package/Hello.class"/>
    </fileset>
    <manifest>
      <attribute name="Main-Class" value="test_package.Hello"/>
    </manifest>
  </jar>
</target>

成功构建jar后,我使用显式设置classpath执行它:

java -classpath lib/commons-lang-2.6.jar -jar build/jar/hello.jar test_package.Hello

我得到以下内容:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang/math/Range
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2451)
    at java.lang.Class.getMethod0(Class.java:2694)
    at java.lang.Class.getMethod(Class.java:1622)
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.math.Range
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    ... 6 more

为什么不能找到'commons-lang'jar?

1 个答案:

答案 0 :(得分:3)

您应该选择:

  • 要么使用-jar,要么JVM将使用jar内清单文件中指定的类路径。它还将使用清单来了解必须执行哪个主类。因此,应该没有-cp选项,并且没有指定类名:

    java -jar build/jar/hello.jar
    
  • 或者你使用-cp(或-classpath),你应该在类路径中添加每个jar(commons和hello),你应该指定要执行的主类名: / p>

    java -cp lib/commons-lang-2.6.jar:build/jar/hello.jar test_package.Hello
    

在您的情况下,由于您尚未在清单中配置类路径,因此您应该选择第二个选项。