首页 > 解决方案 > 使用 maven,如何以特定格式将战争的最终名称与项目版本连接起来?

问题描述

Tomcat 的并行部署功能要求 .war 文件名采用特定格式。

例如:如果我们正在运行版本 1 的项目,并且我们需要热部署版本 2,则需要 .war 名称为“project-name##2.war”。

我们在项目中使用语义版本控制。所以我们的版本例如是5.31.6

当我们通过 Tomcat 管理器部署新版本时,我们使用 maven 构建项目,将文件名重命名为project-name##053106.war并将其上传到服务器。这个过程是手动的并且容易出错。

我们的版本是pom.xml这样设置的:

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>br.com.group</groupId>
    <artifactId>project-name</artifactId>
    <version>5.31.6</version>
    <packaging>war</packaging>
    <name>Project Name</name>
    <description>Project Description</description>
    ...
</project>

我们在配置文件中设置最终名称,例如:

<profiles>
    <profile>
        <id>local</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <profilelabel>LOCAL</profilelabel>
        </properties>
        <build>
            <finalName>project-name-local</finalName>
        </build>
    </profile>
    <profile>
        <id>production</id>
        <properties>
            <profilelabel>PRODUCTION</profilelabel>
        </properties>
        <build>
            <finalName>project-name</finalName>
        </build>
    </profile>
</profiles>

我的问题是:通过上面的示例,我如何构建最终名称与不带点的版本号以及版本“str_pad”ed(5.31.6 变为 053106)的每个“部分”连接的 war 文件?

标签: maven

解决方案


您可以使用 gmaven 插件以project.version任何所需的方式进行处理并将其分配给一个属性(全部在初始化阶段)。这是一个示例,它处理带有-SUFFIX部分的版本(为了安全起见,它处理多个破折号的情况):

<build>
    <finalName>yourProjectName-${paddedVersion}</finalName>
    <plugins>
        <plugin>
            <groupId>org.codehaus.gmaven</groupId>
            <artifactId>gmaven-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <phase>initialize</phase>
                    <goals>
                        <goal>execute</goal>
                    </goals>
                    <configuration>
                        <source>
                            println('Mangling project version: ' + project.version)
                            String[] versionParts = project.version.split("-")
                            paddedVersion = versionParts[0].split("\\.").collect { it.padLeft(2,"0") }.join()
                            if (versionParts.size() > 1) {
                                paddedVersion += "-" + versionParts[1..-1].join("-")
                            }
                            println('Padded version version: ' + paddedVersion)
                            project.properties["paddedVersion"] = paddedVersion
                        </source>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

推荐阅读