簡體   English   中英

適用於不同環境的Maven構建

[英]Maven building for different environments

我有一個Java項目,目前可以使用Maven很好地構建它。 但是,我正在使用Ant腳本執行我認為Maven也可以完成的其他任務。 為了簡化構建工作流程,我想讓Maven做我需要的一切。 詹金斯(Jenkins)使所有這些自動化。

挑戰在於,我希望Maven構建一個工件,然后通過命令行將其按需部署到多個環境中。 當前,我通過使用Maven進行構建,然后使用Ant腳本來創建WAR工件的副本,並根據我選擇的環境更改了一些文件來完成此操作。 這適用於JDBC連接字符串,屬性文件等在每個環境中都不同的事物。

我了解Maven可以使用配置文件,如本答案所述 但是,我一直想弄清楚如何為環境制作輔助WAR文件。 例如,我從構建步驟中創建的“ myproject.war”開始,我想創建“ myproject-dev.war”,然后將其部署到dev Tomcat服務器。 我認為可以使用antrun maven插件進行文件更改,但是我不知道如何將其掛接到生命周期中。 然后,我需要使用tomcat插件進行部署。

關於如何配置的任何建議?

讓我們假設您具有如下結構(僅作為示例)

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

您可以定義一個程序集描述符,如下所示:

<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>

此外,您需要如下所示的maven-assembly-plugin配置:

<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>
  </executions>
</project>

如果為每個環境添加一個單獨的Assembly-descriptor,並在其中添加一行描述符,則可以通過一次調用為每個環境創建軟件包。 這樣做的一個缺點是,除了幾行相同的內容外,您還有多個匯編描述符。

因此,您可以使用iterator-maven-plugin來減少配置和維護麻煩,例如:

<plugin>
  <groupId>com.soebes.maven.plugins</groupId>
  <artifactId>iterator-maven-plugin</artifactId>
  <version>0.3</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>iterator</goal>
      </goals>
      <configuration>
        <items>
          <item>test</item>
          <item>prod</item>
          <item>dev</item>
        </items>

        <pluginExecutors>
          <pluginExecutor>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-assembly-plugin</artifactId>
              <version>2.4</version>
            </plugin>
            <goal>single</goal>
            <configuration>
              <descriptors>
                <descriptor>src/assembly/iterator.xml</descriptor>
              </descriptors>
            </configuration>
          </pluginExecutor>
        </pluginExecutors>
      </configuration>
    </execution>
  </executions>
</plugin>

因此,此外,您需要像這樣的適當的程序集描述符:

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

  <id>${item}</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/${item}/</directory>
      <includes>
        <include>**</include>
      </includes>
    </fileSet>
    <fileSet>
      <outputDirectory>WEB-INF</outputDirectory>
      <directory>${project.build.directory}/environment/${item}/</directory>
      <includes>
        <include>**</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>

這使得維護這樣的構建變得簡單而方便。 一個完整的工作示例可以查看iterator-maven-plugin集成測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM