gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:56:42 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com