如何使用 Maven 构建存储(新构建时间戳文件夹和最新文件夹)?

How have a build store using maven (new build timestamped folder and latest folder)?

当我使用 Maven 构建项目时,我想在每次构建时创建一个新文件夹。

低于我的要求:

  1. 为项目的每个模块创建 jar 文件。
  2. 在某些外部目录
  3. 中为新版本创建文件夹,名称类似于build_'current-date-with-time'
  4. 将 jar 文件复制到 build_'current-date-with-time'/libs
  5. 复制配置文件到build_'current-date-with-time'/conf
  6. 将所有这些也复制到 latest 文件夹(此文件夹中的文件将更改为最新版本)

问题:

这是一个如何完成它的例子:

  • 使用 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.directorybuild.store.directory.latest 属性来定义目标文件夹。

然后可以根据进一步的要求轻松地将其他改进和配置添加到此配置文件中。