在Groovy中使用Google反射会导致异常,而等效的Java代码可以工作

在Groovy中使用Google反射会导致异常,而等效的Java代码可以工作,java,reflection,groovy,reflections,Java,Reflection,Groovy,Reflections,我试图使用一些来自Groovy的代码,当代码在Java中运行时,它会导致一个异常 有关守则是: Reflections reflections = new Reflections(new ConfigurationBuilder() .setScanners( new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner() ) .setUrls(Classpat

我试图使用一些来自Groovy的代码,当代码在Java中运行时,它会导致一个异常

有关守则是:

Reflections reflections = new Reflections(new ConfigurationBuilder()
        .setScanners( new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner() )
        .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
        .filterInputsBy(
        new FilterBuilder()
                .include( prefix( "net.initech" ) )
                .exclude( prefix( "net.initech.util" )
        )));

有问题的异常是:
ClasspathHelper.forClassLoader(…)

无论我是否使用
@CompileStatic
,都会发生这种情况。另外,尝试只使用
this.getClassLoader()
,也会出现同样的问题

例外情况是:


线程“main”java.lang.NoClassDefFoundError中出现异常:javax/servlet/ServletContext
位于java.lang.Class.getDeclaredMethods0(本机方法)
位于java.lang.Class.privateGetDeclaredMethods(Class.java:2688)
位于java.lang.Class.getDeclaredMethods(Class.java:1962)
位于org.codehaus.groovy.reflection.stdclasses.CachedSAMClass.getAbstractMethods(CachedSAMClass.java:91)
位于org.codehaus.groovy.reflection.stdclasses.CachedSAMClass.getSAMMethod(CachedSAMClass.java:155)
位于org.codehaus.groovy.reflection.ClassInfo.isSAM(ClassInfo.java:280)
位于org.codehaus.groovy.reflection.ClassInfo.createCachedClass(ClassInfo.java:270)
org.codehaus.groovy.reflection.ClassInfo.access$400(ClassInfo.java:36)
位于org.codehaus.groovy.reflection.ClassInfo$LazyCachedClassRef.initValue(ClassInfo.java:441)
位于org.codehaus.groovy.reflection.ClassInfo$LazyCachedClassRef.initValue(ClassInfo.java:432)
位于org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46)
位于org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33)
位于org.codehaus.groovy.reflection.ClassInfo.getCachedClass(ClassInfo.java:89)
位于org.codehaus.groovy.reflection.ReflectionCache.getCachedClass(ReflectionCache.java:107)
位于groovy.lang.MetaClassImpl(MetaClassImpl.java:163)
位于groovy.lang.MetaClassImpl(MetaClassImpl.java:187)
位于groovy.lang.MetaClassImpl(MetaClassImpl.java:193)
位于groovy.lang.MetaClassRegistry$MetaClassCreationHandle.createNormalMetaClass(MetaClassRegistry.java:158)
位于groovy.lang.MetaClassRegistry$MetaClassCreationHandle.createWithCustomLookup(MetaClassRegistry.java:148)
位于groovy.lang.MetaClassRegistry$MetaClassCreationHandle.create(MetaClassRegistry.java:131)
位于org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:175)
位于org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:192)
位于org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.getMetaClass(MetaClassRegistryImpl.java:255)
位于org.codehaus.groovy.runtime.InvokerHelper.getMetaClass(InvokerHelper.java:859)
位于org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallStaticSite(CallSiteArray.java:72)
位于org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:159)
位于org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
位于net.initech.DeltaCodeGen.main(DeltaCodeGen.groovy:27)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:483)
位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
原因:java.lang.ClassNotFoundException:javax.servlet.ServletContext
在java.net.URLClassLoader$1.run(URLClassLoader.java:372)
在java.net.URLClassLoader$1.run(URLClassLoader.java:361)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:360)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:424)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 35多

我可以通过添加到我的
POM.xml

    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>servlet-api</artifactId>
        <version>6.0.37</version>
    </dependency>

org.apache.tomcat
servlet api
6.0.37

但是我不应该这样做,Java版本中也没有这样做。

您可能遇到了一个众所周知的问题,Groovy编译器有时需要将运行时依赖项放在其编译类路径上。这是因为编译器使用Java反射来访问其编译类路径。在即将发布的版本中有具体的计划来解决这个问题(不记得是2.x还是3.0)。

看起来您希望扫描的域是“net.initech”。在这种情况下,为什么不使用
ClasspathHelper.forPackage(“net.initech”)
(并保留排除模式)

第二,使用
新类加载器[0]
的想法是什么

另外,请注意,使用
新子类扫描程序(false)
不是最佳做法,因为它可能会创建所有类的大型md存储(所有类都是从
对象派生的)。

基本上,Reflections并不打算列出所有类(尽管它显然可以),而是基于某些标准(注释/超类型等)聚合类型。

猜测:这可能与groovy编译器有关,它触发了对某些库的需求,即使它们没有在Groovy代码中使用。这会很奇怪,因为我正在扫描的包只是用于表示我们域的简单POJO。再看一次,因为您在编译时没有遇到此异常,所以您没有遇到我提到的问题。然而,由于它发生在Groovy反射检查一个类时,所以可能是一个类似的问题。DeltaCodeGe的第27行是什么