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的主要内容,如果未能解决你的问题,请参考以下文章

NoClassDefFoundError

Androidx 迁移:NoClassDefFoundError

关于NoClassDefFoundError错误

毕业:java.lang.NoClassDefFoundError

Hive 安装问题:NoClassDefFoundError

NoClassDefFoundError:....KeyedObjectPoolFactory