Getting Class Not Found: org.apache.ivy.core.report.ResolveReport 在 Java 中使用 GroovyClassLoader 时

2022-09-03 01:10:59

我有一个时髦的脚本,如下所示:

@Grab('com.univocity:univocity-parsers:2.0.0')
import com.univocity.parsers.csv.*;

class MyCsvParser {

}

我想通过在我的java应用程序中加载这个类。但不知何故,在常春藤例外中产生了:GroovyClassLoader@Grab

SomeJavaClass {
    void someMethod() {
         String script = FileUtils.readFileToString("the groovy File");
         Class c = new GroovyClassLoader(this.getClass().getClassLoader())).parse(script);
    }
}

叠:

Caused by: java.lang.ClassNotFoundException: org.apache.ivy.core.report.ResolveReport
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 41 more

当我注释掉一切时,一切都很好。如何启用葡萄?@GrabGroovyClassLoader


答案 1

您应该添加常春藤依赖关系。默认情况下不会添加它,因为它被声明为非传递。Ivy 是管理由 以下方式加载的依赖项的库:@Grab

<dependency>
  <groupId>org.apache.ivy</groupId>
  <artifactId>ivy</artifactId>
  <version>2.4.0</version>
</dependency>

答案 2

将其添加到您的gradle.build

configurations {
  ivy
}

dependencies {
  ivy "org.apache.ivy:ivy:2.4.0"
 ...
}

tasks.withType(GroovyCompile) {
  groovyClasspath += configurations.ivy
}

推荐