使用Gradle插件的Findbugs在Java 9中不起作用

fxm*_*asa 5 java findbugs java-9

我正在将我的项目(多项目Gradle)从Java 8 迁移到Java 9(到目前为止不使用模块).我使用Gradle 4.3和Findbugs Gradle插件 - 我apply plugin: 'findbugs'在我的gradle.build文件中.在依赖中我有

compile group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2'
compile group: 'com.google.code.findbugs', name: 'annotations', version: '3.0.1'
Run Code Online (Sandbox Code Playgroud)

以前,使用java 8(open-jdk)一切正常,但是当我使用java 9(oracle - build 9.0.1+11)时,我在执行后得到了以下异常gradle check(com.example.custom.MyClass是我的代码库中的一个类):分析期间发生了以下错误:

Error scanning com/example/custom/MyClass for referenced classes
java.lang.IllegalArgumentException
  At org.objectweb.asm.ClassReader.<init>(ClassReader.java:170)
  At org.objectweb.asm.ClassReader.<init>(ClassReader.java:153)
  At edu.umd.cs.findbugs.asm.FBClassReader.<init>(FBClassReader.java:35)
  At edu.umd.cs.findbugs.classfile.engine.asm.ClassReaderAnalysisEngine.analyze(ClassReaderAnalysisEngine.java:48)
  At edu.umd.cs.findbugs.classfile.engine.asm.ClassReaderAnalysisEngine.analyze(ClassReaderAnalysisEngine.java:34)
  At edu.umd.cs.findbugs.classfile.impl.AnalysisCache.getClassAnalysis(AnalysisCache.java:262)
  At edu.umd.cs.findbugs.classfile.engine.ClassInfoAnalysisEngine.analyze(ClassInfoAnalysisEngine.java:75)
  At edu.umd.cs.findbugs.classfile.engine.ClassInfoAnalysisEngine.analyze(ClassInfoAnalysisEngine.java:38)
  At edu.umd.cs.findbugs.classfile.impl.AnalysisCache.getClassAnalysis(AnalysisCache.java:262)
  At edu.umd.cs.findbugs.FindBugs2.buildReferencedClassSet(FindBugs2.java:774)
  At edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:222)
  At org.gradle.api.plugins.quality.internal.findbugs.FindBugsExecuter.runFindbugs(FindBugsExecuter.java:39)
  At java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  At java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  At java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  At java.base/java.lang.reflect.Method.invoke(Method.java:564)
  At org.gradle.process.internal.worker.request.WorkerAction.run(WorkerAction.java:100)
  At org.gradle.process.internal.worker.request.WorkerAction.runThenStop(WorkerAction.java:83)
  At java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  At java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  At java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  At java.base/java.lang.reflect.Method.invoke(Method.java:564)
  At org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
  At org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
  At org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:146)
  At org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:128)
  At org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
  At org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
  At org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
  At java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
  At java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
  At org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
  At java.base/java.lang.Thread.run(Thread.java:844)
Run Code Online (Sandbox Code Playgroud)

这适用于我的gradle项目中的每个类(以及Hibernate JPA 2 Metamodel生成器生成的每个类).我想这将与拼图模块有关.但是我没有声明任何内容module-info.java,所以我想为整个代码库创建了一个自动模块,所有内容都可以从任何地方访问.

Nam*_*man 5

尽管 findbugs Java9 支持看起来并没有逐渐向前推进。还有更多关于它的帖子,最终建议使用spotbugs

compile 'com.github.spotbugs:spotbugs:3.1.0'
Run Code Online (Sandbox Code Playgroud)

您会发现本迁移指南同样有用。


您可能只是想尝试使用以下方法在您的项目构建中将 ASM 版本覆盖为 6.0:

compile 'org.ow2.asm:asm:6.0'
Run Code Online (Sandbox Code Playgroud)

  • Findbugs 依赖于 `asm-commons` 和 `asm-debug-all`。我添加了 `compile 'org.ow2.asm:asm-commons:6.0'` 和 `compile 'org.ow2.asm:asm-debug-all:6.0_BETA'` 并且在我检查依赖项之后我仍然看到 `\-- - com.google.code.findbugs:findbugs:3.0.1 +--- org.ow2.asm:asm-debug-all:5.0.2 +--- org.ow2.asm:asm-commons:5.0.2 | \--- org.ow2.asm:asm-tree:5.0.2 | \--- org.ow2.asm:asm:5.0.2` 还是不行。可能更好的解决方案是按照您的建议迁移到“spotbugs”。谢谢! (2认同)
  • @fxmasa ya 这将是我主要猜测的方式。或者作为对那些 github 问题的评论之一是拉取 java 9 相关分支并自己更新内容以使用它。 (2认同)