问题: 在Nexus上禁用重新部署时,如何发布具有2个独占配置文件的maven项目?
示例(已修改):
我有一个maven项目MyArtifact,在pom.xml
(P1和P2)中有2个配置文件,它们生成2个不同的耳朵。每个配置文件都会将maven-ear-plugin
配置为包含不同的模块,并自动生成application.xml
。生成的工件是MyArtifact-1.0-P1.ear
(2个战争模块)和MyArtifact-1.0-P2.ear
(3个战争模块)。
问题1(重新部署到nexus):
mvn deploy -P P1
”时,一切顺利(战争和pom部署到Nexus)mvn deploy -P P2
”错误时! Nexus抱怨重新部署pom.xml。问题2(maven-release-plugin):
当使用maven-release-plugin
发布多个配置文件时,maven会做很多事情(签出和标记CSM,更新pom版本,转向标记,提交到CSM等等)。至少为每个配置文件执行重新发布/重新标记是没有效率也不实际的。
答案 0 :(得分:7)
简单的回答。这是不可能的。问题是基于在这种关系中使用的配置文件是邪恶的。
这类事情的解决方案是创建一个Maven构建,它可以生成两个war文件,这是这个构建的结果。
我假设您对不同的环境有不同的属性,如下所示:
.
|-- pom.xml
`-- src
|-- main
| |-- java
| |-- resources
| |-- environment
| | |-- test
| | | `-- database.properties
| | |-- qa
| | | `-- database.properties
| | `-- production
| | `-- database.properties
| `-- webapp
这意味着你需要在你的情况下创建两个war文件,它只在属性文件的内容上有所不同。在上面有三个环境。
您需要的是每个环境的汇编描述符,例如:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>test</id>
<formats>
<format>war</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>true</unpack>
<useProjectArtifact>true</useProjectArtifact>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<outputDirectory>WEB-INF</outputDirectory>
<directory>${basedir}/src/main/environment/test/</directory>
<includes>
<include>**</include>
</includes>
</fileSet>
</fileSets>
</assembly>
在这种情况下适当执行maven-assembly-plugin,如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>test</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>${project.basedir}/src/main/assembly/test.xml</descriptor>
</descriptors>
</configuration>
</execution>
<execution>
<id>qa</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>${project.basedir}/src/main/assembly/qa.xml</descriptor>
</descriptors>
</configuration>
</execution>
<execution>
<id>production</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>${project.basedir}/src/main/assembly/production.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
这将导致单次运行maven:
mvn package
生成三个不同的war文件,其中包含不同的属性文件或具有不同内容的文件。 这是没有配置文件的解决方案,它可以完美地工作,并将部署三个不同的war文件,命名如下:
这就是解决问题所需的结果。
答案 1 :(得分:0)
呀!
使用配置文件时,我使用了maven <executions>
功能:我拥有的每个配置文件都执行了1次。每次执行都必须在不同的工作文件夹中生成资源。每个工件都有不同的分类器。部署maven时会找到3个工件(pom,ear,ear)并将它们部署到Nexus中。
以下是示例。请让我知道你有任何问题:
<plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<executions>
<execution>
<!-- Disable default execution -->
<id>default-ear</id>
<phase>none</phase>
</execution>
<execution>
<!-- Disable default execution -->
<id>default-generate-application-xml</id>
<phase>none</phase>
</execution>
<execution>
<!-- execution for profile P1 -->
<id>P1</id>
<goals>
<goal>ear</goal>
<goal>generate-application-xml</goal>
</goals>
<configuration>
<!-- Different working directory for each profile (very important) -->
<workDirectory>target/P1</workDirectory>
<defaultLibBundleDir>APP-INF/lib</defaultLibBundleDir>
<generateApplicationXml>true</generateApplicationXml>
<displayName>MyArtifactLibraryP1</displayName>
<!-- Different classifier for each profile (very important) -->
<classifier>P1</classifier>
<modules>
<jarModule>
<groupId>com.example</groupId>
<artifactId>MyWar1</artifactId>
<includeInApplicationXml>true</includeInApplicationXml>
</jarModule>
<jarModule>
<groupId>com.example</groupId>
<artifactId>MyWar2</artifactId>
<includeInApplicationXml>true</includeInApplicationXml>
</jarModule>
</modules>
</configuration>
</execution>
<execution>
<id>P2</id>
<goals>
<goal>ear</goal>
<goal>generate-application-xml</goal>
</goals>
<configuration>
<workDirectory>target/P2</workDirectory>
<defaultLibBundleDir>APP-INF/lib</defaultLibBundleDir>
<generateApplicationXml>true</generateApplicationXml>
<displayName>MyArtifactLibraryP2</displayName>
<classifier>P2</classifier>
<modules>
<jarModule>
<groupId>com.example</groupId>
<artifactId>MyWar1</artifactId>
<includeInApplicationXml>true</includeInApplicationXml>
</jarModule>
<jarModule>
<groupId>com.example</groupId>
<artifactId>MyWar2</artifactId>
<includeInApplicationXml>true</includeInApplicationXml>
</jarModule>
<jarModule>
<groupId>com.example</groupId>
<artifactId>MyWar3</artifactId>
<includeInApplicationXml>true</includeInApplicationXml>
</jarModule>
</modules>
</configuration>
</execution>
</executions>
</plugin>