Java 注释处理期间GWT RfValidator NPE

Java 注释处理期间GWT RfValidator NPE,java,gwt,aspectj,annotation-processing,Java,Gwt,Aspectj,Annotation Processing,在aspectjrt大于1.8.5版的情况下使用aspectjweaver 1.11版会导致在使用Java 8构建GWT 1.8.2应用程序的过程中出现多个NPE: [INFO] --- aspectj-maven-plugin:1.11:compile (compile) @ myproject --- ... [ERROR] java.lang.NullPointerException at org.aspectj.org.eclipse.jdt.internal.compiler.

在aspectjrt大于1.8.5版的情况下使用aspectjweaver 1.11版会导致在使用Java 8构建GWT 1.8.2应用程序的过程中出现多个NPE:

[INFO] --- aspectj-maven-plugin:1.11:compile (compile) @ myproject ---
...
[ERROR] java.lang.NullPointerException
    at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding.sourceField(FieldBinding.java:437)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.determineSourceStart(TypeElementImpl.java:110)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.getSourceStart(TypeElementImpl.java:74)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.compare(TypeElementImpl.java:67)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.compare(TypeElementImpl.java:1)
    at java.util.TimSort.countRunAndMakeAscending(TimSort.java:360)
    at java.util.TimSort.sort(TimSort.java:234)
    at java.util.Arrays.sort(Arrays.java:1512)
    at java.util.ArrayList.sort(ArrayList.java:1462)
    at java.util.Collections.sort(Collections.java:175)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl.getEnclosedElements(TypeElementImpl.java:168)
    at com.google.web.bindery.requestfactory.apt.DomainChecker.isDefaultInstantiable(DomainChecker.java:407)
    at com.google.web.bindery.requestfactory.apt.DomainChecker.visitType(DomainChecker.java:253)
    at com.google.web.bindery.requestfactory.apt.DomainChecker.visitType(DomainChecker.java:44)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl.accept(TypeElementImpl.java:139)
    at javax.lang.model.util.ElementScanner6.scan(ElementScanner6.java:146)
    at com.google.web.bindery.requestfactory.apt.ScannerBase.scan(ScannerBase.java:76)
    at com.google.web.bindery.requestfactory.apt.State.executeJobs(State.java:248)
    at com.google.web.bindery.requestfactory.apt.RfValidator.process(RfValidator.java:86)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:142)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(RoundDispatcher.java:124)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:171)
    at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.java:956)
    at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:451)
    at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:427)
    at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:1107)
    at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:276)
    at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:189)
    at org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:114)
    at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:60)
    at org.aspectj.tools.ajc.Main.run(Main.java:371)
    at org.aspectj.tools.ajc.Main.runMain(Main.java:248)
    at org.codehaus.mojo.aspectj.AbstractAjcCompiler.execute(AbstractAjcCompiler.java:544)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:956)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:192)
    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:498)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)
这发生在所有@ProxyFor类中,这些类是项目外部类的代理(由maven依赖项解决)

@ProxyFor(value=ClassOfOtherProject.class)

其他ProjectProxy的公共接口类扩展了EntityProxy{/这在GWT编译中并没有失败,只是在将java源代码编译为字节码的过程中失败了。GWT的RequestFactory使用注释处理器来验证您的每个代理是否正确匹配它们在服务器上映射到的实体/值/服务类型,并且该版本的aspectjrt和jdt似乎可以通过某种方式无法正确查找其他项目的
类的成员,以便对其进行筛选以找到构造函数。请从堆栈跟踪中,在
com/google/web/bindery/requestfactory/apt/DomainChecker.java:407

List<ExecutableElement> constructors = ElementFilter.constructorsIn(x.getEnclosedElements());
List constructors=ElementFilter.constructorsIn(x.getEnclosedElements());

这是在注释处理器中执行操作的一种非常标准的方法-如果调用TypeElement.getEnclosedElements()如果此注释处理器的NPE失败,我也会担心此版本中的其他错误。这很可能发生在任何注释处理器上,与GWT无关。

我最终能够使用最新的AspectJ运行时构建我的项目,方法是让maven编译器插件只执行anno操作正在处理。只需将
仅添加到插件的配置中即可

类编译将由aspectj maven插件完成。可以通过向配置中添加
none
来禁用此插件的注释处理

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <useIncrementalCompilation>false</useIncrementalCompilation>
        <encoding>UTF-8</encoding>
        <annotationProcessors>
            <annotationProcessor>com.google.web.bindery.requestfactory.apt.RfValidator</annotationProcessor>
        </annotationProcessors>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>com.google.web.bindery</groupId>
            <artifactId>requestfactory-apt</artifactId>
            <version>2.8.2</version>
        </dependency>
    </dependencies>
</plugin>
List<ExecutableElement> constructors = ElementFilter.constructorsIn(x.getEnclosedElements());