所以,这是我的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?
答案 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
在您的情况下,由于您尚未在清单中配置类路径,因此您应该选择第二个选项。