0

在将 spotbugs 添加到我的多模块项目中时,我遇到了一个问题:
Failed to execute goal on project %X: Could not resolve dependencies for project %X:war:1.0.1-SNAPSHOT: Failure to find %Y. 1-SNAPSHOT in https://repository.apache.org/content/repositories/snapshots/ was cached in the local repository, resolution will not be reattempted until the update interval of apache.snapshots has elapsed or updates are forced -> [Help 1]

其中:
%X - 模块 1 它取决于模块 2 (%Y)
%Y - 模块 1 (%X) 所需的模块 2(.jar 库)

相关的 pom.xml:

    <artifactId>myProj</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>%X</module>
        <module>%Y</module>
    </modules>

       ...

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>com.github.spotbugs</groupId>
                    <artifactId>spotbugs-maven-plugin</artifactId>
                    <version>4.0.4</version>
                    <dependencies>
                        <!-- overwrite dependency on spotbugs if you want to specify the version of spotbugs -->
                        <dependency>
                            <groupId>com.github.spotbugs</groupId>
                            <artifactId>spotbugs</artifactId>
                            <version>4.1.2</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

子模块 pom.xml:

<parent>
        <groupId>my.project</groupId>
        <artifactId>myProj</artifactId>
        <relativePath>../pom.xml</relativePath>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <artifactId>%X</artifactId>
    <version>1.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>%X</name>

       .....

      <build>
        <finalName>%X</finalName>
        <plugins>
            <plugin>
                <groupId>com.github.spotbugs</groupId>
                <artifactId>spotbugs-maven-plugin</artifactId>
            </plugin>
                       ..........
     </build>

然后我按下一个顺序执行命令:
>mvn clean compile -正常编译的项目
>mvn spotbugs:spotbugs-输出错误

也试过:

  1. 执行clean compile with -U
  2. 从我的本地 maven 存储库中删除工件
  3. 仅在我的子模块中添加插件并执行mvn spotbugs:spotbugs -pl :%X
  4. 遵循下一个指南的步骤[链接]
  5. 检查 IntelliJ 插件,它可以工作

那么问题来了:如何正确启动呢?:)

PS spotbugs 在代码分析中是否有一些限制?我正在尝试在遗留项目中使用它,所以可能正因为如此,我遇到了
PSS 问题,我在另一个没有“孩子”的项目上尝试过它,并且它使用了(比如说)最新的技术都可以正常工作。


更新:尝试执行maven clean install -pl :%Y,现在我得到了其他错误。还尝试排除“apache org”并有相同的错误堆栈跟踪:

[INFO] 
[INFO] --- spotbugs-maven-plugin:4.0.4:spotbugs (default-cli) @ myProject ---
[INFO] Fork Value is true
     [java] Exception in thread "main" edu.umd.cs.findbugs.ba.AnalysisException: Exeption was thrown during analysis
     [java]     at edu.umd.cs.findbugs.FindBugs2.lambda$analyzeApplication$3(FindBugs2.java:1125)
     [java]     at java.util.ArrayList.forEach(ArrayList.java:1257)
     [java]     at edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:1118)
     [java]     at edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:309)
     [java]     at edu.umd.cs.findbugs.FindBugs.runMain(FindBugs.java:395)
     [java]     at edu.umd.cs.findbugs.FindBugs2.main(FindBugs2.java:1231)
     [java] Caused by: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded
     [java]     at java.util.concurrent.FutureTask.report(FutureTask.java:122)
     [java]     at java.util.concurrent.FutureTask.get(FutureTask.java:192)
     [java]     at edu.umd.cs.findbugs.FindBugs2.lambda$analyzeApplication$3(FindBugs2.java:1120)
     [java]     ... 5 more
     [java] Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
     [java]     at java.util.HashMap.resize(HashMap.java:704)
     [java]     at java.util.HashMap.putVal(HashMap.java:629)
     [java]     at java.util.HashMap.put(HashMap.java:612)
     [java]     at java.util.HashSet.add(HashSet.java:220)
     [java]     at java.util.AbstractCollection.addAll(AbstractCollection.java:344)
     [java]     at java.util.HashSet.<init>(HashSet.java:120)
     [java]     at edu.umd.cs.findbugs.ba.deref.UnconditionalValueDerefSet.cleanDerefSet(UnconditionalValueDerefSet.java:407)
     [java]     at edu.umd.cs.findbugs.ba.deref.UnconditionalValueDerefAnalysis.propagateDerefSetsToMergeInputValues(UnconditionalValueDerefAnalysis.java:881)
     [java]     at edu.umd.cs.findbugs.ba.deref.UnconditionalValueDerefAnalysis.meetInto(UnconditionalValueDerefAnalysis.java:728)
     [java]     at edu.umd.cs.findbugs.ba.Dataflow.execute(Dataflow.java:345)
     [java]     at edu.umd.cs.findbugs.classfile.engine.bcel.UnconditionalValueDerefDataflowFactory.analyze(UnconditionalValueDerefDataflowFactory.java:82)
     [java]     at edu.umd.cs.findbugs.classfile.engine.bcel.UnconditionalValueDerefDataflowFactory.analyze(UnconditionalValueDerefDataflowFactory.java:41)
     [java]     at edu.umd.cs.findbugs.classfile.impl.AnalysisCache.analyzeMethod(AnalysisCache.java:368)
     [java]     at edu.umd.cs.findbugs.classfile.impl.AnalysisCache.getMethodAnalysis(AnalysisCache.java:321)
     [java]     at edu.umd.cs.findbugs.ba.ClassContext.getMethodAnalysis(ClassContext.java:995)
     [java]     at edu.umd.cs.findbugs.ba.ClassContext.getUnconditionalValueDerefDataflow(ClassContext.java:837)
     [java]     at edu.umd.cs.findbugs.detect.BuildUnconditionalParamDerefDatabase.analyzeMethod(BuildUnconditionalParamDerefDatabase.java:118)
     [java]     at edu.umd.cs.findbugs.detect.BuildUnconditionalParamDerefDatabase.considerMethod(BuildUnconditionalParamDerefDatabase.java:107)
     [java]     at edu.umd.cs.findbugs.detect.BuildUnconditionalParamDerefDatabase.visitClassContext(BuildUnconditionalParamDerefDatabase.java:91)
     [java]     at edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:76)
     [java]     at edu.umd.cs.findbugs.FindBugs2.lambda$null$1(FindBugs2.java:1108)
     [java]     at edu.umd.cs.findbugs.FindBugs2$$Lambda$18/1193894341.call(Unknown Source)
     [java]     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
     [java]     at edu.umd.cs.findbugs.CurrentThreadExecutorService.execute(CurrentThreadExecutorService.java:86)
     [java]     at java.util.concurrent.AbstractExecutorService.invokeAll(AbstractExecutorService.java:238)
     [java]     ... 4 more

4

2 回答 2

1

通过在我的 pom.xml 旁边添加来解决问题:

<plugin>
    <groupId>com.github.spotbugs</groupId>
    <artifactId>spotbugs-maven-plugin</artifactId>
    <version>4.0.4</version>
    ........
        <configuration>
            <effort>Max</effort>
            <threshold>Low</threshold>
            <failOnError>false</failOnError>
            <maxHeap>1024</maxHeap>
        </configuration>
    ........
</plugin>

于 2020-09-08T12:48:45.827 回答
0

请使用mvn clean install,这会将您的工件带到本地存储库。因为这使您能够:

使用(您的项目/模块)作为本地其他项目的依赖项

而不是mvn clean compile,它只编译到“构建输出文件夹”(通常target;)(......这对于 IDE 来说可能已经足够了,但也省略了完整testpackage阶段:o)

...这使得来自 spotbugs 的错误消息更易于理解(这是正确的:%X:war:1.0.1-SNAPSHOT不在存储库中(仅在您上次执行的状态install)。)

https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html


更新:我认为,克服 的唯一机会java.lang.OutOfMemoryError是:

增加记忆力!(https://spotbugs.github.io/spotbugs-maven-plugin/faq.html#How_do_I_avoid_OutOfMemory_errors,另请注意“fork”注释。)

分析您的堆栈跟踪和https://github.com/spotbugs/spotbugs/blob/master/spotbugs/src/main/java/edu/umd/cs/findbugs/ba/deref/UnconditionalValueDerefSet.java#L407的当前源代码, 这是:

Set<ValueNumber> valueNumbers = new HashSet<>(vnaFrame.allSlots());

...所以没有明显的错误,但实际上只是一个巨大的哈希集(实例化/复制),并且增加内存是一个公平的解决方案。

于 2020-09-04T09:53:19.447 回答