这可能是重复的,因为我无法想象我们是第一个遇到这种情况的人,但是我似乎找不到它。
因此,我们正在使用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
答案 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文件名获取的。