1

SO で別の回答からいくつかのコードを使用しようとしていますが、コードが Java で実行されている間、Groovy から例外が発生します。

問題のコードは次のとおりです。

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()しただけでも同じ問題が発生します。

例外は次のとおりです。

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

これを回避するには、POM.xml

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

しかし、私は持っているべきではありませんし、Java バージョンにはありません。

4

2 に答える 2

1

Groovy コンパイラーがランタイム依存関係をコンパイル・クラスパスに配置する必要があるというよく知られた問題に直面している可能性があります。これは、コンパイラが Java リフレクションを使用してコンパイル クラス パスにアクセスするためです。今後のリリースでこれを修正する具体的な計画があります (2.x か 3.0 かは忘れてください)。

于 2014-01-13T00:59:05.553 に答える
0

スキャンしたいドメインは「net.initech」のようです。その場合、使用しないClasspathHelper.forPackage("net.initech")(そして除外パターンを残す) のはなぜですか?

第二に、使用のアイデアは何new ClassLoader[0]ですか?

また、すべてのクラスの巨大な md ストアが作成される可能性があるため、使用はベスト プラクティスではないことに注意してくださいnew SubTypesScanner(false)(まあ、すべてのクラスは から派生していますObject)。基本的に、リフレクションはすべてのクラスをリストするつもりはありませんが (明らかに可能ですが)、いくつかの基準 (注釈/スーパータイプなど) に基づいてタイプを集約します。

于 2014-01-20T10:12:56.157 に答える