0

だから、これが私の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を正常に構築した後、明示的に設定されたクラスパスを使用して実行します。

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が見つからないのはなぜですか?

4

1 に答える 1

3

以下を選択する必要があります。

  • を使用する-jarと、JVM は jar 内のマニフェスト ファイルで指定されたクラスパスを使用します。また、マニフェストを使用して、実行する必要があるメイン クラスを認識します。したがって、-cpオプションはなく、クラス名も指定されていません。

    java -jar build/jar/hello.jar
    
  • -cpまたは(または)を使用-classpathし、クラスパス (commons と hello) にすべての jar を追加し、実行するメイン クラス名を指定する必要があります。

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

あなたの場合、マニフェストでクラスパスを構成していないため、2 番目のオプションを選択する必要があります。

于 2013-03-15T14:54:18.070 に答える