使用aspectjweaver 1.11版本和高于1.8.5版本的aspectjrt会导致在使用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)
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 后,这些错误仍然存在。如何更新aspectjrt而不获取这些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.getEnclosureElements() 因该注释处理器的 NPE 失败,我也会担心此构建中的其他错误。任何注释处理器都很有可能发生这种情况,与 GWT 无关。
关于java - 注释处理期间的 GWT RfValidator NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58976448/