如何使用javaee-api为SonarQube构建maven构建?

时间:2015-11-04 18:47:43

标签: java maven sonarqube

我有一个具有以下依赖关系的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依赖项?

2 个答案:

答案 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