我有一个具有以下依赖关系的javaee项目:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<scope>provided</scope>
</dependency>
项目按预期正确构建,打包和部署。但是,当我尝试为此项目运行SonarQube构建时,我会收到以下类型的警告并发生最终致命错误
Nov 04, 2015 11:18:31 AM net.sourceforge.pmd.lang.java.typeresolution.ClassTypeResolver visit
WARNING: Could not find class com.admin.agent.AgentAdminController, due to: java.lang.ClassFormatError: JVMCFRE074 no Code attribute specified; class=javax/servlet/GenericServlet, method=<init>()V, pc=0
....
....
[ERROR] Failed to execute goal org.codehaus.mojo:sonar-maven-plugin:2.7.1:sonar (default-cli) on project build: Execution default-cli of goal org.codehaus.mojo:sonar-maven-plugin:2.7.1:sonar failed: An API incompatibility was encountered while executing org.codehaus.mojo:sonar-maven-plugin:2.7.1:sonar: java.lang.ClassFormatError: JVMCFRE074 no Code attribute specified; class=javax/servlet/jsp/PageContext, method=<init>()V, pc=0
经过一番搜索,我发现罪魁祸首是javaee-api依赖。仅作为API(没有实现)SonarQube抱怨缺少类。我发现的唯一解决方案是用jboss实现替换依赖:
<dependency>
<groupId>org.jboss.spec</groupId>
<artifactId>jboss-javaee-6.0</artifactId>
<version>1.0.0.Final</version>
<type>pom</type>
<scope>provided</scope>
</dependency>
然而,这对我来说效果不佳。我不得不修改我的pom并删除我原来的javaee-api依赖项并替换它。这意味着我的构建都不能使用javax.javaee-api依赖项吗?
就我而言,功能性Maven构建应该可以由Sonar扫描。
如何向Sonar表明我希望它为构建使用不同的依赖项(而不是项目pom中的依赖项),或者让它完全忽略javax.javaee-api依赖项?
答案 0 :(得分:0)
这似乎与sonarqube无关,而是PMD,因为您可以在每个日志行中看到:
net.sourceforge.pmd.lang.java.typeresolution.ClassTypeResolver
(请参阅包名称中的pmd)
听起来问题不在于找不到类的事实,而是PMD不支持此库中此类的二进制格式(很难理解帖子中信息的根本原因,最有可能这个lib与特定版本的JDK打包在一起,因此通过更改pom中的依赖性来解决这个问题,因为在这个新库中,支持二进制格式。
你能确定你使用的声纳-pmd的哪个版本? (这将告诉我们使用了哪个版本的PMD,如果在某一点上解决了这个问题,您可以查看发行说明。)
这听起来像是PMD课堂读者中的一个错误。
答案 1 :(得分:0)
这就是我们如何在 maven 项目中集成 SonarQube。 pom.xml
</properties>
<argLine></argLine>
<sonar.exclusions>**/*Entity.java</sonar.exclusions>
</properties>
<profiles>
<profile>
<id>coverage</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<sonar.host.url>
https://localhost:8080(Add the url for sonar)
</sonar.host.url>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.8.0.2131</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
-Dsonar.login = "login key for sonar"
mvn clean test sonar:sonar -Dsonar.login= -Pcoverage