Tomcat部署旧版本的Webapp

时间:2019-01-18 10:16:19

标签: maven tomcat deployment gitlab gitlab-ci

这可能是重复的,因为我无法想象我们是第一个遇到这种情况的人,但是我似乎找不到它。

因此,我们正在使用Maven使用gitlab ci将WAR文件部署到tomcat 8.5服务器。问题是当我们从0.2.9升级到0.2.10时,tomcat弄乱了版本。显然,服务器按字母顺序部署了WAR,并且0.2.10介于0.2.1和0.2.2之间,并且即使0.2.10正确地部署到服务器,运行版本仍为0.2.9。

完整的Web应用程序名称看起来像:WebappName ## 0.2.10-SNAPSHOT_201901010000.war

我们曾考虑过将版本重命名为0.2.009和0.2.010,但这似乎是一个相当肮脏的解决方法。当然,较旧的版本会不时地被删除,因此这不是一个永久性的问题,但这有点令人讨厌,有关如何解决此问题的任何提示都很棒。

从pom.xml

<version>0.2.10-SNAPSHOT</version>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.install.skip>true</maven.install.skip>
    <timestamp>${maven.build.timestamp}</timestamp>
    <maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format>
</properties>
[..]
<profile>
    <id>deploy-stage</id>
    <activation>
        <activeByDefault>false</activeByDefault>
    </activation>
    <properties>
        <war.name>WebappName##${project.version}_${timestamp}</war.name>
        <tomcat.url>http://[..]/manager/text</tomcat.url>
        <tomcat.server>[..]</tomcat.server>
        <tomcat.webpath>/${war.name}</tomcat.webpath>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <id>default-war</id>
                        <goals>
                            <goal>manifest</goal>
                            <goal>war</goal>
                        </goals>
                        <phase>package</phase>
                    </execution>
                </executions>
                <configuration>
                        <warName>${war.name}</warName>
                    <failOnMissingWebXml>true</failOnMissingWebXml>
                    <archive>
                        <addMavenDescriptor>true</addMavenDescriptor>
                        <forced>true</forced>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <packageName>true</packageName>
                            <useUniqueVersions>true</useUniqueVersions>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                        </manifest>
                        <manifestEntries>
                            <Build-Time>${maven.build.timestamp}</Build-Time>
                            <Archetype>${archetypeArtifactId}</Archetype>
                            <Archetype-Version>${archetypeVersion}</Archetype-Version>
                        </manifestEntries>
                    </archive>
                    <webResources>
                        <resource>
                            <filtering>true</filtering>
                            <directory>src/main/webapp</directory>
                            <includes>
                                <include>**/web.xml</include>
                            </includes>
                        </resource>
                    </webResources>
                    <warSourceDirectory>src/main/webapp</warSourceDirectory>
                    <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <warFile>${project.build.directory}/${war.name}.war</warFile>
                    <url>${tomcat.url}</url>
                    <server>${tomcat.server}</server>
                    <path>${tomcat.webpath}</path>
                </configuration>
                <executions>
                    <execution>
                        <phase>deploy</phase>
                        <goals>
                            <goal>deploy</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</profile>

来自gitlab-ci.yml

variables:
  MAVEN_OPTS: "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
  MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"

# Cache downloaded dependencies and plugins between builds.
cache:
  paths:
    - /root/.m2/repository/

stages:
  - build
  - deploy

# Run deploy 
deploy:staging:
  stage: deploy
  script:
    - 'mvn $MAVEN_CLI_OPTS -Dsonar.branch=$CI_BUILD_REF_NAME deploy -am -P deploy-stage'
  only:
    - staging
  image: maven:3.3.9-jdk-8

1 个答案:

答案 0 :(得分:2)

正如Apache Tomcat documentation所说:

  

字符串比较用于确定版本顺序。

这与Maven工件版本的比较完全不同。通过字符串比较,2.0.2的版本总是大于2.0.10甚至是2.0.15000等。

我想您的pom.xml中有这样的内容:

<properties>
  <buildTimestamp>${maven.build.timestamp}</buildTimestamp>
  <maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format>
</properties>
<build>
  <finalName>${project.artifactId}##${project.version}_${maven.build.timestamp}</finalName>
</build>

您可以将其更改为:

<finalName>${project.artifactId}##${maven.build.timestamp}_${project.version}</finalName>

产生的文件名类似WebappName##201901010000_0.2.10-SNAPSHOT.war

通过这种方式,最新的时间戳构建将作为当前活动的应用程序版本进行部署。

或者,您可以保留.war文件名的版本架构,而使用context.xml的版本化文件名部署应用程序:

apache-tomcat/conf/Catalina/localhost/WebappName##201901010000.xml 内容:

<Context docBase="/path/to/WebappName##0.2.10-SNAPSHOT_201901010000.war" path="/WebappName"/>

在Apache Tomcat Manager中,它将在应用程序版本列中显示为版本201901010000。再次,由时间戳生成的最新版本将被部署为当前活动的应用程序版本,而与Maven工件版本无关,因为部署版本字符串是从.xml文件名而不是.war文件名获取的。