2015-11-04 62 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