groovy - 找不到合适的类加载器可供抓取

标签 groovy intellij-idea classloader junit4

我在类(class)开始时有这个:

@Grab(group = 'org.ccil.cowan.tagsoup', module = 'tagsoup', version = '1.2')
class MyClass{...

我正在尝试对此类进行单元测试,但是每当我尝试运行 JUnit 4 测试时,都会收到此错误:
Caused by: java.lang.RuntimeException: No suitable ClassLoader found for grab
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77)
    at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:102)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:52)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:190)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:198)
    at groovy.grape.GrapeIvy.chooseClassLoader(GrapeIvy.groovy:163)
    at groovy.grape.GrapeIvy$chooseClassLoader.callCurrent(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:44)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:149)
    at groovy.grape.GrapeIvy.grab(GrapeIvy.groovy:227)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSite.invoke(PogoMetaMethodSite.java:225)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:51)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:44)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:153)
    at groovy.grape.GrapeIvy.grab(GrapeIvy.groovy:216)
    at groovy.grape.Grape.grab(Grape.java:131)
    at groovy.grape.Grape$grab.callStatic(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:165)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:173)
    at ammoscanner.AmmoScanner.<clinit>(AmmoScanner.groovy)
    ... 30 more

有任何想法吗?我正在使用 groovy 1.7.5

最佳答案

对我有用的解决方案(在 IntelliJ 和通过 Maven 中使用 @Grab 运行脚本测试):

  • 通过 @Grab 引用使用的依赖项在你的 Maven pom.xml文件(无论如何这对于更好的编码体验很有用):

  • 例如。我有以下 @Grab在我的 Groovy 脚本中:
    @Grab(group='info.picocli', module='picocli', version='4.6.1')
    
    所以我添加了以下 Maven 依赖项:
        <dependency>
          <groupId>info.picocli</groupId>
          <artifactId>picocli</artifactId>
          <version>4.6.1</version>
        </dependency>
    
  • 添加对 ivy 的可选依赖项在你的 Maven pom.xml文件(需要在您的 IDE 中正确处理 @Grab):
  •     <dependency>
          <groupId>org.apache.ivy</groupId>
          <artifactId>ivy</artifactId>
          <version>${ivy.version}</version>
          <scope>compile</scope>
          <optional>true</optional>
        </dependency>
    
  • 在您的测试代码中,设置 groovy.grape.enable系统属性到 false . 这是解决方案的主要和关键部分 - 它禁用 @Grab脚本的注释处理,但请记住,我们已经在 Maven pom.xml 中引用了那些依赖项文件:
  •     static {
            System.setProperty("groovy.grape.enable", "false")
        }
    
        @Test
        void test() {
            MainScript.call()
        }
    
    该解决方案的缺点是您必须在 @Grab 中复制依赖项。和 Maven pom.xml文件,但同样,如果您开发 Groovy 脚本,您通常已经这样做以改善您的编码体验(获得更好的代码亮点等)。

    关于groovy - 找不到合适的类加载器可供抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4611230/

    相关文章:

    model-view-controller - Groovy/Grails中的MVC

    java - 如何正确获取 WebTarget 获取请求响应 (JAX-RS) 的正文?

    java - 如何为maven项目创建新的maven依赖插件

    Java JAR 保护

    java - 使用类加载器访问不同的文件夹

    java - Maven包出现Ant BuildException : Invalid license info

    groovy - Gradle 2.4-编译后在运行任务中执行Groovy脚本文件

    xml - XmlSlurper转换html编码的符号

    android-studio - 为什么 IntelliJ Idea 和 Android Studio 上会出现这些奇怪的字符?

    java - Spring框架-类加载器关系