在多模块项目中发现错误/Maven 构建

问题描述 投票:0回答:2

在将 Spotbug 添加到我的多模块项目期间,我遇到了一个问题:

无法在项目 %X 上执行目标:无法解析项目 %X:war:1.0.1-SNAPSHOT 的依赖项:找不到 %Y。
1-https://repository.apache.org/content/repositories/snapshots/中的SNAPSHOT已缓存在本地存储库中,直到apache.snapshots的更新间隔已过或强制更新时,才会重新尝试解析 -> [帮助1]`

地点:

%X - 模块 1 它取决于模块 2 (%Y)
%Y - 模块 1 (%X) 需要模块 2(.jar 库)

家长

pom.xml

<groupId>my.project</groupId> <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. 仅在我的子模块中添加插件并执行
  4. mvn spotbugs:spotbugs -pl :%X
    
    
  5. 遵循下一个指南的步骤
  6. [链接]
  7. 检查了 IntelliJ 插件,它有效
那么问题来了:如何正确启动呢? :)

PS:spotbugs 在代码分析方面有一些限制吗?我正在尝试在遗留项目中使用它,所以也许因此我遇到了麻烦

PPS:我已经在我的另一个没有“子项”的项目上尝试过它,并且它使用(比方说)最新技术,一切正常。

更新:我尝试执行

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
    
maven findbugs spotbugs
2个回答
1
投票
请使用

mvn clean install

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

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

而不是

mvn clean compile

,它仅编译到“构建输出文件夹”(通常为 
target
;)(...这对于 IDE 来说可能就足够了,但也省略了完整的 
test
package
 阶段: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());
...所以没有明显的错误,但实际上只是一个巨大的哈希集(实例化/复制),增加内存是一个公平的解决方案。


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>
    
© www.soinside.com 2019 - 2024. All rights reserved.