Maven配置多源代碼目錄、多資源目錄

在本地機器搭建一個開源項目的源碼環境時,把其轉換爲maven項目,因模塊業務劃分,不一樣的業務放在不一樣的源目錄下,這樣轉換出來的maven項目結構以下:
html

pom.xml內容以下:java

<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>
  <groupId>sokeeper</groupId>
  <artifactId>sokeeper</artifactId>
  <version>3.4.6</version>
  <name>sokeeper</name>
  <description>sokeeper</description>

  <properties>
    <target.dir>target</target.dir>
  </properties>

  <dependencies>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.16</version>
    </dependency>
    <dependency>
           .....
    </dependency>
  </dependencies>
</project>

在使用過程當中發現,在eclipse中能夠正常使用,但使用mvn compile命令進行編譯的時候,target/classes目錄下始終沒有編譯後的*.class文件。查看maven執行日誌發現有一行日誌以下:apache

Nothing to compile - all classes are up to date

後經驗證發現,全部在src/main/java目錄下的代碼,都會被編譯成功。而在src/java/main、src/java/generated源目錄下的代碼不會被編譯。這時,才突然想起maven項目的默認項目結構是這樣的:eclipse


而後,纔想明白爲啥出現eclipse中能夠編譯,使用mvn compile不能正常編譯。原來,在建立maven項目後,我把代碼拷貝到了src/java/main目錄下,並把src/java/main目錄做爲了源代碼目錄(Source Code Folder),這樣eclipse的自動編譯項目功能,就會自動編譯全部源代碼目錄下的java文件(同理src/java/generated)。而使用maven命令時,maven項目默認以src/main/java爲源代碼目錄,會把src/main/java這個目錄下的全部java文件進行編譯,其它的源代碼目錄下的java文件,則不會被maven編譯。maven

既然已經知道問題出如今這裏,就能夠尋思解決方案了。要麼,能夠直接把src/java/main、src/java/generated目錄下的java代碼都移到maven默認的源代碼目錄src/main/java下;要麼,讓maven在執行編譯命令的時候,也去編譯src/java/main、src/java/generated目錄的java文件。測試

從網上搜索資料,發現maven的默認源代碼、資源文件、測試源代碼目錄配置能夠修改配置:ui

<build>
    <!--默認源代碼目錄-->
    <sourceDirectory>src/main/java </sourceDirectory>  
    <!--默認測試源代碼目錄-->
    <testSourceDirectory>src/test/java</testSourceDirectory>  
    <!--默認資源目錄-->
    <resources>  
        <resource>  
            <directory>src/main/resources</directory>  
        </resource>  
    </resources> 
    <!--默認測試資源目錄--> 
    <testResources>  
        <testResource>  
             <directory>src/test/resources</directory>  
        </testResource>  
    </testResources>  
</build>

但<sourceDirectory>只能指定一個源代碼目錄,不能指定多個,繼續查找,又發現了一個插件build-helper-maven-plugin。發現這個插件能夠指定多個源代碼目錄、多個資源目錄,這個插件就能夠實現個人需求。用法以下:spa

<plugins>  
        <!-- 指定多個源代碼目錄、多個資源文件目錄 -->
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.8</version>
        <executions>
          <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>add-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>src/java/main</source>
                <source>src/java/generated</source>
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin> 
    </plugins>  
</build>

配置好build-helper-maven-plugin插件後,在eclipse中右鍵項目,maven->update project configuration。插件


這樣當前項目中的src/java/main、src/java/generated再也不單單是eclipse認識的源代碼目錄,仍是maven的源代碼目錄。maven再執行編譯時,就會到src/java/main、src/java/generated、src/main/java目錄下去編譯java文件。如此,便解決了問題。日誌


另介紹幾種maven插件的配置:

<build>
    <plugins>
      <!-- 指定多個源代碼目錄、多個資源文件目錄 -->
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.8</version>
        <executions>
          <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>add-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>src/java/main</source>
                <source>src/java/generated</source>
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <!-- 編譯插件 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.0</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
           <encoding>UTF8</encoding> 
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
      <!-- 生成源文件jar包文件 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>2.1.1</version>
        <executions>
          <execution>
            <id>attach-sources</id>
            <goals>
              <goal>jar-no-fork</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <!-- 打字節碼包插件 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <includes>
            <classesDirectory>org/</classesDirectory>
          </includes>
          <executions>
            <execution>
              <id>make-a-jar</id>
              <phase>compile</phase>
              <goals>
                <goal>jar</goal>
              </goals>
            </execution>
          </executions>
        </configuration>
      </plugin>
      <!-- 部署插件 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <descriptors>
            <descriptor>assembly.xml</descriptor>
          </descriptors>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
相關文章
相關標籤/搜索