java - 针对不同环境的 Maven 构建

标签 java maven tomcat

我有一个 Java 项目,目前可以很好地使用 Maven 构建。但是,我正在使用 Ant 脚本来完成我认为 Maven 也可以完成的其他任务。为了简化构建工作流程,我想让 Maven 做我需要的一切。所有这些都通过 Jenkins 自动完成。

挑战在于我希望 Maven 构建单个 Artifact 并通过命令行按需将其部署到多个环境。目前,我通过使用 Maven 构建,然后使用 Ant 脚本来创建 WAR Artifact 的副本,其中一些文件根据我选择的环境进行了更改。这适用于 JDBC 连接字符串、属性文件等在每个环境中都不同的内容。

我知道 Maven 可以使用配置文件,如 answer 中所述.但是,我一直在想办法为环境制作一个辅助 WAR 文件。例如我从构建步骤创建的“myproject.war”开始,我想创建“myproject-dev.war”,然后将其部署到开发 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>

如果您为每个环境添加一个单独的程序集描述符并添加一行描述符,您可以通过一次调用为每个环境创建包。 这样做的一个缺点是您有多个程序集描述符,除了几行相同之外。

所以你可以使用 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>

这使得维护这样的构建变得简单方便。一个完整的工作示例可以查看 integration tests of iterator-maven-plugin .

关于java - 针对不同环境的 Maven 构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25434223/

相关文章:

java - Apache Ant Javadocs 是否包含在 Eclipse 插件中?

java - 对象数组索引值被前面的索引值覆盖

java - 使用 Jacoco 对使用 Powermock 编写的测试类进行单元测试覆盖

eclipse - Maven 从命令行安装但从 Eclipse UI 传递时测试失败

java - 如何为 Tomcat 配置 CometConnectionManagerValve?

java - Tomcat 中的 mysql-connector 异常行为

java - 在区域设置“en_US”的代码 'user.title' 下找不到消息

java - 如何将 RecordInterceptor 设置为 ConcurrentKafkaListenerContainerFactory

java - OpenTok-java-sdk 问题创建 SessionId 抛出异常

tomcat - AtmosphereFramework异常java.lang.IllegalStateException : Not supported