2013-03-14 31 views
2

我想通过使用GroovyShell来评估Java应用程序内的Groovy脚本。NoClassDefFoundError:groovy/lang/binding

问题:我的程序编译正常,但在运行时给我一个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运行它,但它给了我同样的错误。

+0

你可以试试“java -cp TestClass.jar;%GROOVY_HOME%\ embeddable \ groovy-2.1.1.jar TestClass”? – longhua 2013-03-14 01:50:46

+0

同样的错误。 http://puu.sh/2hlYG – Terran 2013-03-14 02:59:33

+0

%GROOVY_HOME%\ embeddable \ groovy-2.1.1.jar是否存在?在我身边,它是groovy-all-2.1.1.jar。 – longhua 2013-03-14 03:15:08

回答

3

如果您正在运行可执行JAR,则全局类路径(例如CLASSPATH环境和“-cp”选项)不会生效。详情请参阅此帖子:Does java -jar option alter classpath options

java - the Java application launcher document

When you use this option, the JAR file is the source of all user classes, and other user class path settings are ignored.

相反,你需要设置类路径清单文件。检查下面的示例。

文件结构

|-- 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页面:Setting the path in a Manifest file