NoClassDefFoundError:groovy / lang / binding

时间:2013-03-14 01:18:39

标签: java groovy jar classpath

我正在尝试使用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运行它,但它给了我同样的错误。

2 个答案:

答案 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。