2015-11-04 36 views
2

我有具有以下依赖一个JavaEE的项目:如何使用javaee-api为SonarQube构建maven构建?

<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

你显然已经问过,并放弃它:http://stackoverflow.com/questions/29152487/how-to-ignore-javax-files-in-sonarqube。 – Gimby

+0

@Gimby - 哇...你是对的;我什至不记得发布!我想6个月后,我仍在寻找更好的解决方案! –

回答

0

这似乎有关sonarqube并不而是PMD,你可以为每个日志行看到: net.sourceforge.pmd.lang.java.typeresolution.ClassTypeResolver(见pmd的封装名称)

听起来,这个问题是不是一个事实,即未找到类而是PMD不支持在这个库中这个类的二进制格式(很难理解你的文章中的信息的潜在原因,很可能这个lib是用特定版本的JDK打包的),所以这是固定的改变你的pom的依赖关系,因为在这个新的库中,二进制格式被支持。

你能确定你正在使用哪个版本的sonar-pmd吗? (这将告诉我们使用了哪个版本的PMD,如果这是在一个地方解决的话,你可以检查发行说明)。

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

+0

我使用的是PMD 5.3.1,它使用自动生成的目标/ sonar/pmd.xml文件作为其配置。我已经浏览了SonarQube界面,甚至没有看到我可以指定PMD配置的位置。 –

+0

我认为这个问题源于javax.javaee-api不是完整的实现,而只是一个残缺的实现。为什么这会影响PMD对我来说有点模糊。此外,如果我添加一个额外的完整实现作为依赖项,它仍然不够好,除去删除依存关系(我认为是因为在类路径中存在两个相同名称的类,并且mvn/pmd正在使用/解析stubbed版本第一) –

+0

你可以精确的声纳-PMD插件的版本?而不是PMD本身的版本。获得关于该问题的更多信息的选项将是在没有sonarqube的情况下使用PMD对您的项目进行分析。这将允许精确确定来自哪里的错误(PMD或sonar-pmd)。问题是,'.class'文件的读取事实,你已经stubbed实现或不提供是无关紧要的,据我所知。 – benzonico