如何使用 Maven 构建存储(新构建时间戳文件夹和最新文件夹)?
How have a build store using maven (new build timestamped folder and latest folder)?
当我使用 Maven 构建项目时,我想在每次构建时创建一个新文件夹。
低于我的要求:
- 为项目的每个模块创建 jar 文件。
- 在某些外部目录
中为新版本创建文件夹,名称类似于build_'current-date-with-time'
- 将 jar 文件复制到 build_'current-date-with-time'/libs
- 复制配置文件到build_'current-date-with-time'/conf
- 将所有这些也复制到 latest 文件夹(此文件夹中的文件将更改为最新版本)
问题:
- 如何添加'current-date-with-time'构建路径?
- 如何将 jar 移动到外部文件夹?
- 如何将其他文件也移动到此文件夹以及如何将所有这些文件再次移动到另一个文件夹?
这是一个如何完成它的例子:
- 使用 maven
${maven.build.timestamp}
属性 作为目录名后缀以获得带时间戳的动态目录名
- 重新定义
maven.build.timestamp.format
,如果需要,删除 :
默认字符,这可能会导致某些 OS 出现问题。例如,对于值 yyyy-MM-dd_HH-mm-ss
(_
替换 :
)
- 配置
maven-clean-plugin
以在执行此构建 activity 之前清理 latest
文件夹。官方文档已经提供了how to delete additional files 的例子
- 配置
maven-resources-plugin
通过两个不同的插件执行将您的项目资源复制到 latest
和新的构建存储文件夹。官方文档已经在 how to copy resources 上提供了示例
- 配置
maven-jar-plugin
将项目工件打包到两个目录(最新和构建),我建议使用两个不同的 maven classifier
(时间戳和 latest
是完美的候选者).官方文档已经提供了 how to attach additional jars 的示例
- 配置
maven-dependency-plugin
通过两个插件执行将项目依赖项复制到两个文件夹。官方文档已经在 how to copy project dependencies 上提供了示例
- 将整个构建配置放在 Maven 中 profile 以便不将其作为默认行为但能够按需调用它
这是上面的完整实现,已经放在配置文件中:
<profile>
<id>build-store</id>
<properties>
<maven.build.timestamp.format>yyyy-MM-dd_HH-mm-ss</maven.build.timestamp.format>
<build.store.directory>c:\build_${maven.build.timestamp}</build.store.directory>
<build.store.directory.latest>c:\latest</build.store.directory.latest>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<filesets>
<fileset>
<directory>${build.store.directory.latest}</directory>
<includes>
<include>**/*</include>
</includes>
</fileset>
</filesets>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<id>copy-dependencies-to-build-store</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<outputDirectory>${build.store.directory}</outputDirectory>
<classifier>${maven.build.timestamp}</classifier>
</configuration>
</execution>
<execution>
<id>copy-dependencies-to-latest</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<outputDirectory>${build.store.directory.latest}</outputDirectory>
<classifier>latest</classifier>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies-to-build-store</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${build.store.directory}/libs</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
<execution>
<id>copy-dependencies-to-latest</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${build.store.directory.latest}/libs</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>copy-resources-build-store</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${build.store.directory}/conf</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
<execution>
<id>copy-resources-latest</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${build.store.directory.latest}/conf</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
通过以下方式调用构建:
mvn clean package -P build-store
然后将清理 latest
文件夹内容,根据构建时间戳创建一个新文件夹,将所需文件移至该文件夹并移至 latest
文件夹。
您可以通过编辑 build.store.directory
和 build.store.directory.latest
属性来定义目标文件夹。
然后可以根据进一步的要求轻松地将其他改进和配置添加到此配置文件中。
当我使用 Maven 构建项目时,我想在每次构建时创建一个新文件夹。
低于我的要求:
- 为项目的每个模块创建 jar 文件。
- 在某些外部目录 中为新版本创建文件夹,名称类似于build_'current-date-with-time'
- 将 jar 文件复制到 build_'current-date-with-time'/libs
- 复制配置文件到build_'current-date-with-time'/conf
- 将所有这些也复制到 latest 文件夹(此文件夹中的文件将更改为最新版本)
问题:
- 如何添加'current-date-with-time'构建路径?
- 如何将 jar 移动到外部文件夹?
- 如何将其他文件也移动到此文件夹以及如何将所有这些文件再次移动到另一个文件夹?
这是一个如何完成它的例子:
- 使用 maven
${maven.build.timestamp}
属性 作为目录名后缀以获得带时间戳的动态目录名 - 重新定义
maven.build.timestamp.format
,如果需要,删除:
默认字符,这可能会导致某些 OS 出现问题。例如,对于值yyyy-MM-dd_HH-mm-ss
(_
替换:
) - 配置
maven-clean-plugin
以在执行此构建 activity 之前清理latest
文件夹。官方文档已经提供了how to delete additional files 的例子
- 配置
maven-resources-plugin
通过两个不同的插件执行将您的项目资源复制到latest
和新的构建存储文件夹。官方文档已经在 how to copy resources 上提供了示例
- 配置
maven-jar-plugin
将项目工件打包到两个目录(最新和构建),我建议使用两个不同的 mavenclassifier
(时间戳和latest
是完美的候选者).官方文档已经提供了 how to attach additional jars 的示例
- 配置
maven-dependency-plugin
通过两个插件执行将项目依赖项复制到两个文件夹。官方文档已经在 how to copy project dependencies 上提供了示例
- 将整个构建配置放在 Maven 中 profile 以便不将其作为默认行为但能够按需调用它
这是上面的完整实现,已经放在配置文件中:
<profile>
<id>build-store</id>
<properties>
<maven.build.timestamp.format>yyyy-MM-dd_HH-mm-ss</maven.build.timestamp.format>
<build.store.directory>c:\build_${maven.build.timestamp}</build.store.directory>
<build.store.directory.latest>c:\latest</build.store.directory.latest>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<filesets>
<fileset>
<directory>${build.store.directory.latest}</directory>
<includes>
<include>**/*</include>
</includes>
</fileset>
</filesets>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<id>copy-dependencies-to-build-store</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<outputDirectory>${build.store.directory}</outputDirectory>
<classifier>${maven.build.timestamp}</classifier>
</configuration>
</execution>
<execution>
<id>copy-dependencies-to-latest</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<outputDirectory>${build.store.directory.latest}</outputDirectory>
<classifier>latest</classifier>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies-to-build-store</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${build.store.directory}/libs</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
<execution>
<id>copy-dependencies-to-latest</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${build.store.directory.latest}/libs</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>copy-resources-build-store</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${build.store.directory}/conf</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
<execution>
<id>copy-resources-latest</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${build.store.directory.latest}/conf</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
通过以下方式调用构建:
mvn clean package -P build-store
然后将清理 latest
文件夹内容,根据构建时间戳创建一个新文件夹,将所需文件移至该文件夹并移至 latest
文件夹。
您可以通过编辑 build.store.directory
和 build.store.directory.latest
属性来定义目标文件夹。
然后可以根据进一步的要求轻松地将其他改进和配置添加到此配置文件中。