注释处理期间,GWT RfValidator NPE

在使用Java 8构建GWT 1.8.2应用程序的过程中,使用aspectjweaver 1.11版本(其aspectjrt大于版本1.8.5)会导致多个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)
public interface ClassOfOtherProjectProxy extends EntityProxy { // <- NPE happens in this Line!

    ...

}

pom.xml的摘录:

<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>

只有使用Aspectjrt 1.8.4(或更低版本),它才能正常运行。我该怎么办?从Java 7迁移到8,将GWT 1.7.x迁移到1.8.2之后,这些错误仍然存​​在。如何在没有获得这些NPE的情况下更新Aspectjrt?

bajo42 回答:注释处理期间,GWT RfValidator NPE

这不是在GWT编译中失败,而仅仅是在将Java源代码编译为字节码的过程中。 GWT的RequestFactory使用注释处理器来验证您的每个代理是否正确匹配它们在服务器上映射到的实体/值/服务类型,并且看来此版本的AspectJRT和JDT无法以某种方式正确地查找成员ClassOfOtherProject的值,因此可以将其过滤以查找构造函数。在您的堆栈跟踪中,在com/google/web/bindery/requestfactory/apt/DomainChecker.java:407中:

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

这是在注释处理器中执行操作的一种非常标准的方法-如果调用TypeElement.getEnclosedElements()失败,并且该注释处理器的NPE失败,我也会担心此构建中的其他错误。任何注释处理器都极有可能发生这种情况,而与GWT无关。

,

通过让maven-compiler-plugin仅执行注释处理,我终于能够使用最新的AspectJ-Runtime构建项目。只需将<proc>only</proc>添加到插件的配置中即可。

该类的编译将由Aspectj-maven-plugin插件完成。可以通过在配置中添加<proc>none</proc>来禁用此插件的注释处理。

本文链接:https://www.f2er.com/3057645.html

大家都在问