2012-06-27 45 views
0

我正在將應用程序從Ant遷移到Maven。有兩種環境,這個應用程序可以部署到。一個配置稱爲Local,另一個調用者dev,因此自然有兩個螞蟻目標。每個螞蟻目標,從兩個不同的文件夾複製資源,並使其成爲最終戰爭文件的一部分。根據輸入參數選擇性地複製maven中的資源?

如何在maven中模仿這種行爲?我正在考慮在構建時傳遞一個參數,並基於此參數,我們可以使用maven資源插件來複制相應的文件夾。像這樣的東西。

<resources> 
      <resource> 
       <directory>src/main/resources</directory> 
       <filtering>true</filtering> 
       <excludes> 
        <exclude>${local}/**</exclude> 
       </excludes> 
      </resource> 
     </resources> 

我在正確的道路?如果是,我如何在運行時替換「本地」?另外,我正在做一個補充操作,如果我們想爲Dev開發,那麼我排除本地,反之亦然。有沒有更好的方法來處理這個問題?

另外,如果我使用這種方法,目標戰爭,將整個文件夾複製到它。我如何配置maven只複製文件夾內容而不是整個文件夾。

回答

2

當複製資源時,Maven會將包含/排除模式應用於定義的<directory>值,並且維持該目錄下的路徑結構向下。沒有任何等同於我能找到的螞蟻的flattenmapper

其餘的,請考慮Maven build profiles。您可以定義包含要在構建時更改的配置的配置文件,然後從命令行激活正確的配置文件。如下所示的配置,命令

mvn -Dtarget.env=local process-resources

將文件複製從/src/main/resources/localtarget/classes。由於「本地」包含在資源的directory元素中,因此它不會出現在複製資源的路徑中。

<profiles> 
    <profile> 
     <id>local</id> 
     <activation> 
      <property> 
       <name>target.env</name> 
       <value>local</value> 
      </property> 
     </activation> 
     <properties> 
      <resource.dir>local</resource.dir> 
     </properties> 
    </profile> 

    <!-- add a similar profile for dev --> 
</profiles> 

<resources> 
    <resource> 
     <directory>src/main/resources/${resource.dir}</directory> 
     <filtering>true</filtering> 
    </resource> 
</resources> 

您可以使用我在這裏展示的配置文件做更多的事情。我希望這會讓你開始,即使它不能解決你的整個用例。

+0

感謝您指出配置文件。 –

1

我可以推薦的最好的事情是建立一個結構類似以下(僅與屬性文件):

. 
|-- pom.xml 
`-- src 
    |-- main 
    | |-- java 
    | |-- resources 
    | |-- environment 
    | | |-- test 
    | | | `-- database.properties 
    | | `-- production 
    | |  `-- database.properties 
    | `-- webapp 

創建一個裝配描述符類似下面的結合使用與Maven的組件 - 插件爲每個環境之一:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 

    <id>test</id> 
    <formats> 
    <format>war</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>true</unpack> 
     <useProjectArtifact>true</useProjectArtifact> 
    </dependencySet> 
    </dependencySets> 
    <fileSets> 
    <fileSet> 
     <outputDirectory>WEB-INF</outputDirectory> 
     <directory>${basedir}/src/main/environment/test/</directory> 
     <includes> 
     <include>**</include> 
     </includes> 
    </fileSet> 
    </fileSets> 
</assembly> 

最後,你需要爲每個環境中執行:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>test</id> 
     <phase>package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
     <configuration> 
      <descriptors> 
      <descriptor>${project.basedir}/src/main/assembly/test.xml</descriptor> 
      </descriptors> 
     </configuration> 
     </execution> 
     <execution> 
     <id>production</id> 
     <phase>package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
     <configuration> 
      <descriptors> 
      <descriptor>${project.basedir}/src/main/assembly/production.xml</descriptor> 
      </descriptors> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

結果將通過一個單一的版本生成兩個war文件,這些文件已經被配置用於生產,另一個用於開發。

+0

太棒了,但這是否意味着每次構建時都會創建兩個戰爭文件。我可以選擇構建哪個戰爭文件嗎?只要不需要很多時間,那麼我對這個解決方案就可以了。 –