4

GroovyShellを使用してJavaアプリ内のGroovyスクリプトを評価しようとしています。

問題:プログラムは正常にコンパイルされますが、実行時にNoClassDefFoundErrorが発生します。

TestClass.java:

import groovy.lang.Binding;
import groovy.lang.GroovyShell;

class TestClass {
    static Binding binding;
    static GroovyShell shell;

    public static void main(String[] args) {
        System.out.println("Hello, world.");
        binding = new Binding();
        shell = new GroovyShell(binding);
        Object value = shell.evaluate("5 ** 5");
    }
}

次に、次のコマンドでコンパイルします。

> javac -cp%GROOVY_HOME%\ embeddable \ groovy-all-2.1.1.jar TestClass.Java

> jar cfm TestClass.jar Manifest.txt TestClass.class

エラーなしでコンパイルされます。それから私はそれを実行します:

> java -jar TestClass.jar

Hello, world
Exception in thread "main" java.lang.NoClassDefFoundError: groovy/lang/Binding
    at TestClass.main(TestClass.java:10)
Caused by: java.lang.ClassNotFoundException: groovy.lang.Binding
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)

完全なエラーテキスト:http://puu.sh/2gOrx

コンパイルしたときと同じ-cpで実行しようとしましたが、同じエラーが発生します。

4

2 に答える 2

4

実行可能 JAR を実行している場合、CLASSPATH 環境や「-cp」オプションなどのグローバル クラスパスは有効になりません。詳細については、この投稿を参照してください: Java -jar オプションはクラスパス オプションを変更しますか

java - Java アプリケーション起動ドキュメント

このオプションを使用すると、JAR ファイルがすべてのユーザー クラスのソースとなり、他のユーザー クラス パス設定は無視されます。

代わりに、マニフェスト ファイルに Class-Path を設定する必要があります。次のサンプルを確認してください。

ファイル構造

|-- Manifest.txt
|-- TestClass.class
|-- TestClass.jar
|-- TestClass.java
`-- lib
    `-- groovy-all-2.1.1.jar

Manifest.txt (最後の行に新しい行を追加することを忘れないでください)

Main-Class: TestClass
Class-Path: lib/groovy-all-2.1.1.jar

質問で同じコマンドを実行して、実行可能な JAR を生成して実行します。詳細については、次の Wiki ページを確認してください:マニフェスト ファイルのパスの設定

于 2013-03-14T03:52:15.367 に答える