【问题标题】:How to structure maven build with javaee-api for SonarQube?如何使用 javaee-api 为 SonarQube 构建 maven 构建?
【发布时间】:2021-02-12 17:21:40
【问题描述】:

我有一个 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 依赖项?

就我而言,Sonar 应该可以扫描功能性 Maven 构建。

如何向 Sonar 表明我希望它使用不同的依赖项进行构建(而不是项目 pom 中的依赖项),或者让它完全忽略 javax.javaee-api 依赖项?

【问题讨论】:

  • 你之前显然已经问过这个问题并放弃了它:stackoverflow.com/questions/29152487/…
  • @Gimby - 哇...你是对的;我什至不记得发过那个!我猜 6 个月后,我仍在寻找更好的解决方案!

标签: java maven sonarqube


【解决方案1】:

这似乎不是关于 sonarqube 而是 PMD,正如您在每个日志行中看到的那样: net.sourceforge.pmd.lang.java.typeresolution.ClassTypeResolver(查看包名中的pmd)

听起来问题不在于找不到该类,而是PMD不支持该库中此类的二进制格式(很难理解您帖子中信息的根本原因,这个库很可能是使用特定版本的 JDK 打包的),因此可以通过更改 pom 中的依赖项来解决此问题,因为在这个新库中,支持二进制格式。

您能准确说明您使用的是哪个版本的声纳-pmd 吗? (这将告诉我们使用的是哪个版本的 PMD,如果在某一时刻解决了这个问题,您可以查看发行说明)。

这听起来绝对像是 PMD 类阅读器中的一个错误。

【讨论】:

  • 我使用的是 PMD 5.3.1,它使用自动生成的 target/sonar/pmd.xml 文件作为其配置。我查看了 SonarQube 界面,甚至没有看到我可以在哪里指定 PMD 配置。
  • 我认为问题源于 javax.javaee-api 不是一个完整的实现,而只是一个存根实现。为什么这会影响 PMD 对我来说有点模棱两可。此外,如果我添加一个额外的完整实现作为依赖项,那么在不删除存根依赖项的情况下它仍然不够好(我假设由于类路径上有两个同名的类,并且 mvn/pmd 正在使用/解析存根版本优先)
  • 你能准确的说下 sonar-pmd 插件的版本吗?不是 PMD 本身的版本。获取有关该问题的更多信息的一个选项是使用不带声纳的 PMD 对您的项目进行分析。这将允许准确确定错误来自何处(PMD 或 sonar-pmd)。问题是阅读.class 文件,据我所知,您是否已存根implem 或未提供这一事实是无关紧要的。
  • 根据 SonarQube 更新中心页面,我使用的是 Sonar-PMD 插件 v2.4.1。我将不得不直接使用 PMD 插件尝试您的理论。实际上,我已经尝试创建一个对 javaee-api lib 具有一些最小依赖关系的虚拟项目,但无法使用该基本配置重现警告/错误消息。
【解决方案2】:

这就是我们如何将 SonarQube 集成到 maven 项目中。 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多