禁用重新部署时如何maven释放多个配置文件项目

时间:2013-04-16 15:42:00

标签: maven maven-2 maven-3 nexus

问题: 在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)

  1. 当我执行“mvn deploy -P P1”时,一切顺利(战争和pom部署到Nexus)
  2. 当我执行“mvn deploy -P P2”错误时! Nexus抱怨重新部署pom.xml。
  3. 问题2(maven-release-plugin)

    当使用maven-release-plugin发布多个配置文件时,maven会做很多事情(签出和标记CSM,更新pom版本,转向标记,提交到CSM等等)。至少为每个配置文件执行重新发布/重新标记是没有效率也不实际的。

2 个答案:

答案 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. 的artifactId版本-test.war
  2. 的artifactId版本-qa.war
  3. 的artifactId版本-production.war
  4. 这就是解决问题所需的结果。

答案 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>