我正在尝试使用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运行它,但它给了我同样的错误。
答案 0 :(得分:3)
如果运行可执行JAR,则全局类路径(例如,CLASSPATH环境和“-cp”选项)不会生效。有关详细信息,请参阅此帖子:Does java -jar option alter classpath options。
java - the Java application launcher document
使用此选项时,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页面:Setting the path in a Manifest file。
答案 1 :(得分:0)
代替直接运行JAR,将JAR加载到04.10.2018
中并指定要运行的类:
classpath
有点麻烦,因为$ java -classpath $groovyJar:TestClass.jar TestClass
是在清单中指定的,但随后从命令行获取。从好的方面来说,您不必将Main-Class
硬编码到清单中。
自从很久以前问这个问题以来,Groovy JAR的路径已经改变。假设Class-Path
在您的 PATH 中,找到Groovy JAR的一种方法是:
groovy
结果将类似于:
$ groovyHome=$(dirname $(dirname $(which groovy)))
$ groovyJar=$groovyHome/lib/$(basename $groovyHome).jar
要构建可以在本地进行测试的JAR,请创建Groovy文件:
com / example / HelloWorld.groovy
$ which groovy
/Users/dem/apps/groovy/groovy-2.5.2/bin/groovy
$ echo $groovyJar
/Users/dem/apps/groovy/groovy-2.5.2/lib/groovy-2.5.2.jar
然后发出命令:
package com.example
class HelloWorld {
static void main(String[] args) {
println "Hello, world."
}
}
注意: Groovy JAR($ groovyc com/example/*.groovy
$ jar cfv HelloWorld.jar com/example/*.class
added manifest
adding: com/example/HelloWorld.class(in = 2829) (out= 1220)(deflated 56%)
$ ls -o
total 8
-rw-r--r-- 1 dem 1708 Oct 5 01:15 HelloWorld.jar
drwxr-xr-x 3 dem 96 Oct 5 01:10 com
$ java -classpath $groovyJar:HelloWorld.jar com.example.HelloWorld
Hello, world.
)为5.4MB,最新版本(groovy-2.5.2.jar
)为7.5MB。