2017-09-14 99 views
2

項目鏈接:https://github.com/randomquestion/MultiModuleMavenCheckstyleSampleMaven的 - 對模塊的依賴性的Checkstyle不工作

我有多個模塊一個非常簡單的Maven項目。我正在關注this Maven guide以啓用Checkstyle。所以我創建了一個名爲build-tools的通用模塊(按照指南),並在根文件夾中添加了Checkstyle配置。但是我遇到了一個非常奇怪的問題。

當我從頭開始創建一個新的Maven項目,mvn clean install似乎工作得很好,包括Checkstyle的。但是,只要我重命名checkstyle文件並用新名稱更新pom.xml,生成開始失敗,錯誤Could not find resource <new Checkstyle file name>。在那之後,我再也無法重建它了。看起來這個問題是,在根目錄下對build-tools模塊的依賴不起作用。

├── build-tools 
│   ├── build-tools\ (1).iml 
│   ├── pom.xml 
│   ├── src 
│      └── main 
│        └── resources 
│        └── default-checkstyle.xml 
├── pom.xml 

根的pom.xml:

<modules> 
    <module>build-tools</module> 
</modules> 

<properties> 
    <checkstyle.config.location>default-checkstyle.xml</checkstyle.config.location> 
</properties> 

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-checkstyle-plugin</artifactId> 
     <version>2.17</version> 
     <dependencies> 
     <dependency> 
      <groupId>com.mycompany.app</groupId> 
      <artifactId>build-tools</artifactId> 
      <version>1.0-SNAPSHOT</version> 
     </dependency> 
     </dependencies> 
     <executions> 
     <execution> 
      <id>validate</id> 
      <phase>validate</phase> 
      <configuration> 
      <configLocation>default-checkstyle.xml</configLocation> 
      <encoding>UTF-8</encoding> 
      <consoleOutput>true</consoleOutput> 
      <failOnViolation>true</failOnViolation> 
      </configuration> 
      <goals> 
      <goal>check</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

構建工具的pom.xml

<parent> 
    <groupId>com.mycompany.app</groupId> 
    <artifactId>my-app</artifactId> 
    <version>1.0-SNAPSHOT</version> 
</parent> 

<groupId>com.mycompany.app</groupId> 
<artifactId>build-tools</artifactId> 
<version>1.0-SNAPSHOT</version> 
<name>build-tools</name> 

錯誤:

INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------ 
[INFO] Reactor Build Order: 
[INFO] 
[INFO] my-app 
[INFO] build-tools 
[INFO] 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building my-app 1.0-SNAPSHOT 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ my-app --- 
[INFO] Deleting /Users/../workspace/my-app/target 
[INFO] 
[INFO] --- maven-checkstyle-plugin:2.17:check (validate) @ my-app --- 
[INFO] ------------------------------------------------------------------------ 
[INFO] Reactor Summary: 
[INFO] 
[INFO] my-app ............................................. FAILURE [ 1.170 s] 
[INFO] build-tools ........................................ SKIPPED 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 1.291 s 
[INFO] Finished at: 2017-09-13T22:25:26-07:00 
[INFO] Final Memory: 12M/309M 
[INFO] ------------------------------------------------------------------------ 
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:2.17:check (validate) on project my-app: Failed during checkstyle execution: Unable to find configuration file at location: default-checkstyle.xml: Could not find resource 'default-checkstyle.xml'. -> [Help 1] 

上可能什麼錯什麼建議?爲什麼mvn install不是先建立build-tools模塊?

回答

1

您當前的設置將無法正常工作!當我克隆你的項目並嘗試構建時,它肯定會失敗,因爲在構建父pom時我的本地存儲庫中沒有build-tool工件。

這是結構,你應該有:

-- build-tools 
    | | 
    | - pom.xml 
    | 
    - my app 
    | | 
    | - src 
    | - pom.xml 
    | 
    - pom.xml 

這裏是父pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>com.mycompany.app</groupId> 
<artifactId>my-app-parent</artifactId> 
<packaging>pom</packaging> 
<version>1.0-SNAPSHOT</version> 

<name>my-app-parent</name> 
<url>http://maven.apache.org</url> 

<!-- 
    ~ Modules 
--> 
<modules> 
    <module>build-tools</module> 
    <module>my-app</module>  
</modules> 

<build> 
    <!-- 
    ~ Plugin Settings 
    --> 
    <pluginManagement> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-checkstyle-plugin</artifactId> 
     <version>2.17</version> 
     <dependencies> 
      <dependency> 
      <groupId>com.mycompany.app</groupId> 
      <artifactId>build-tools</artifactId> 
      <version>1.0-SNAPSHOT</version> 
      </dependency> 
     </dependencies> 
     <executions> 
      <execution> 
      <id>validate</id> 
      <phase>validate</phase> 
      <goals> 
       <goal>check</goal> 
      </goals> 
      </execution> 
     </executions> 
     <configuration> 
      <configLocation>my-app-checkstyle.xml</configLocation> 
     </configuration> 
     </plugin> 
    </plugins> 
    </pluginManagement> 
</build> 

<reporting> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-checkstyle-plugin</artifactId> 
     <version>2.17</version> 
     <configuration> 
     <configLocation>default-checkstyle.xml</configLocation> 
     </configuration> 
    </plugin> 
    </plugins> 
</reporting> 
</project> 

構建工具/ pom.xml中作爲

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0      http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <groupId>com.mycompany.app</groupId> 
    <artifactId>my-app-parent</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    </parent> 
    <artifactId>build-tools</artifactId> 
</project> 

你的其他項目/的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <groupId>com.mycompany.app</groupId> 
    <artifactId>my-app-parent</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    </parent> 
    <artifactId>my-app</artifactId> 
    <packaging>jar</packaging> 

    <name>my-app</name> 
    <url>http://maven.apache.org</url> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-checkstyle-plugin</artifactId> 
     </plugin> 
    </plugins> 
    </build> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
</project> 

CheckStyle的重命名文件名作爲build-tools/src/main/resources/my-app-checkstyle.xml

+0

我已經創建了[pull request](https:// github。com/randomquestion/MultiModuleMavenCheckstyleSample/pull/2) –

+0

謝謝!這也可以工作,但如果root/parent模塊中有java源代碼,將會失敗。提交的另一個拉取請求也適用於該案例。 – RandomQuestion

+0

根模塊是'maven pom aggregator',爲什麼你認爲它應該有源代碼? –

0

Accrding到same document。你應該嘗試除了<dependency><reporting>標籤作爲配置(在<build>標籤)的插件設置:

<reporting> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-checkstyle-plugin</artifactId> 
     <version>2.17</version> 
     <configuration> 
     <configLocation>default-checkstyle.xml</configLocation> 
     <encoding>UTF-8</encoding> 
     <consoleOutput>true</consoleOutput> 
     <failOnViolation>true</failOnViolation> 
     </configuration> 
    </plugin> 
    </plugins> 
</reporting> 
+0

這看起來問題。我認爲問題在於checkstyle配置中對模塊構建工具的依賴性無法正常工作。這就是爲什麼當我重命名文件時,它失敗了。 – RandomQuestion

+0

@RandomQuestion你的意思是,將它重命名爲'checkstyle.xml'對你來說工作正常嗎? – nullpointer

+0

是的。它與原始文件名一起工作。我驗證它的另一種方式是我創建了一個全新的項目,包含root pom和build-tools模塊。如果我直接在root上運行mvn install,它無法找到指示它不是首先構建構建工具的構建工具jar。 – RandomQuestion