【问题标题】:Getting Class Not Found: org.apache.ivy.core.report.ResolveReport when using GroovyClassLoader in Java在 Java 中使用 GroovyClassLoader 时找不到类:org.apache.ivy.core.report.ResolveReport
【发布时间】:2016-03-06 17:24:34
【问题描述】:

我有一个像这样的 groovy 脚本:

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

class MyCsvParser {

}

我想通过GroovyClassLoader 在我的java 应用程序中加载这个类。但@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

当我注释掉 @Grab 时,一切正常。如何在GroovyClassLoader 中启用葡萄?

【问题讨论】:

    标签: java groovy


    【解决方案1】:

    您应该添加 ivy 依赖项。默认情况下不会添加它,因为它被声明为不可传递的。 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 2017-01-28
      • 1970-01-01
      • 2016-09-15
      • 2023-04-04
      相关资源
      最近更新 更多