1

问题:当在 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”时,一切正常(war 和 pom 部署到 Nexus)
  2. 当我执行“ mvn deploy -P P2”错误!Nexus 抱怨重新部署 pom.xml。

问题2(maven-release-plugin)

当使用maven-release-pluginto release 来发布多个配置文件时,maven 会做很多事情(签出和标记 CSM、更新 pom 版本、转向标记、提交到 CSM 等)。至少必须为每个配置文件执行重新发布/重新标记既不高效也不实用。

4

2 回答 2

8

简单的回答。这是不可能的。问题是基于在这种关系中使用了邪恶的配置文件。

此类事情的解决方案是创建一个 Maven 构建,它能够生成两个作为此构建结果的 war 文件。

我假设您对不同的环境有不同的属性,如下所示:

.
|-- pom.xml
`-- src
    |-- main
    |   |-- java
    |   |-- resources
    |   |-- environment
    |   |   |-- test
    |   |   |   `-- database.properties
    |   |   |-- qa
    |   |   |   `-- database.properties
    |   |   `-- production
    |   |       `-- database.properties
    |   `-- webapp

这意味着您需要在您的情况下创建两个仅在属性文件内容上有所不同的战争文件。在上面有三个环境。

您需要的是每个环境的程序集描述符,例如:

<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 文件,命名如下:

  1. artifactId-version-test.war
  2. artifactId-version-qa.war
  3. artifactId-version-production.war

这就是您解决问题所需的结果。

于 2013-04-16T15:58:28.000 回答
1

是的!

为了使用配置文件,我正在使用 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>
于 2013-06-12T08:04:26.963 回答