NoClassDefFoundError:groovy / lang / binding
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NoClassDefFoundError:groovy / lang / binding相关的知识,希望对你有一定的参考价值。
我正在尝试使用GroovyShell来评估Java应用程序中的Groovy脚本。
问题:我的程序编译正常,但在运行时给我一个NoClassDefFoundError。
test class.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运行它,但它给了我同样的错误。
如果运行可执行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。
而不是直接运行JAR,将JAR加载到classpath
并指定要运行的类:
$ java -classpath $groovyJar:TestClass.jar TestClass
这有点hacky因为Main-Class
在清单中指定但随后从命令行中获取。从好的方面来说,您不必将Class-Path
硬编码到清单中。
自从很久以前就提出这个问题以来,Groovy JAR的路径发生了变化。假设groovy
在你的PATH中,找到Groovy JAR的一种方法是:
$ groovyHome=$(dirname $(dirname $(which groovy)))
$ groovyJar=$groovyHome/lib/$(basename $groovyHome).jar
结果将是这样的:
$ 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
要构建JAR,您可以使用本地测试,创建Groovy文件:
COM /示例/ HelloWorld.groovy
package com.example
class HelloWorld {
static void main(String[] args) {
println "Hello, world."
}
}
然后发出命令:
$ 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.
注意:Groovy JAR(groovy-2.5.2.jar
)为5.4MB,最新版本(groovy-3.0.0-alpha-3.jar
)为7.5MB。
以上是关于NoClassDefFoundError:groovy / lang / binding的主要内容,如果未能解决你的问题,请参考以下文章
Androidx 迁移:NoClassDefFoundError
毕业:java.lang.NoClassDefFoundError