Maven with Jenkins - 更新父pom版本的依赖项

时间:2012-03-12 15:42:37

标签: java maven build jenkins release-management

我有一个类似于

的pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>myApp</groupId>
  <artifactId>myAppId</artifactId>
  <packaging>war</packaging>
  <version>1.2-SNAPSHOT</version>
  <name>Maven Test Webapp</name>
  <url>http://maven.apache.org</url>

  <dependency>
      <groupId>com.manydesigns</groupId>
      <artifactId>portofino-war</artifactId>
      <version>3.1.10</version>
      <type>war</type>
      <scope>compile</scope>
  </dependency>

  </dependencies>
  <build>
    <finalName>TestName</finalName>
  </build>
</project>

如果我在上面的pom文件上运行'mvn release:prepare',则工件的版本会发生变化。即它变成

<version>1.2</version>

现在让我说我已经离开并更新了portofino-war应用程序,它是这个pom文件的依赖项。 portofino-war现在版本为3.1.11,但父pom文件指向版本3.1.10,如上所示。

如果构建新版本的portofino-war,我有什么方法可以更新父pom(通过Maven或Jenkins)文件?

由于

修改

该应用程序使用Maven覆盖 - http://maven.apache.org/plugins/maven-war-plugin/overlays.html从其他war文件构建war文件。这意味着如果构建了任何依赖模块,则必须构建父模块以生成最终的war文件。

问题在于,如果我构建任何模块,我必须手动更新父pom文件中的版本,以使用正确的模块版本进行构建。

编辑2

感谢您的帮助拉尔夫。基本上这就是我想要实现的目标:

我要做的是创建一个maven项目,它将基于几个模块构建一个war文件。假设模块具有以下结构:

第1单元

customerModule
    |-webapp
        |-jsp
            |-customer
                |-findCustomer.jsp
                |-addNewCustomer.jsp
                |-deleteCustomer.jsp
    |-src
        |-com
            |-mycompany
                |-customer
                    |-FindCustomerAction.java
                    |-AddCustomerAction.java
                    |-DeleteCustomer.java

单词数

productModule
    |-webapp
        |-jsp
            |-product
                |-productCustomer.jsp
                |-addNewProduct.jsp
                |-deleteProduct.jsp
    |-src
        |-com
            |-mycompany
                |-product               
                    |-FindProductAction.java
                    |-AddProductAction.java
                    |-DeleteProduct.java 

单词数

commonModule
    |-webapp
        |-css
            |-style.css
        |-jsp
            |-templates
                |-coreTemplate.jsp
    |-src
        com
            |-mycomany
                |-common
                    |-Logger.java
                    |-Access.java
    |-META-INF
        |-MANIFEST.MF
        |-context.xml
    |-WEB-INF
        |-lib
            |-oraclejdbc.lib
            |-log4j.lib
            |-common.lib
        |-struts-config.xml
        |-tiles-def.xml
        |-web.xml

所示的每个模块都将由不同的团队开发。每个团队生成一个war文件并将其安装在本地maven存储库中。作为示例,存储库可能看起来像这样

com
 |-customerModule
    |-customerModule.v2.1.war
    |-customerModule.v3.0.war
 |-productModule
    |-productModule.v3.0.war
    |-productModule.v3.1.war    
 |-commonModule
    |-commonModule.v0.5.war 
    |-commonModule.v3.0.war 

现在构建管理器使用上面的war文件来构建最终的可部署war文件。我原计划使用maven叠加来合并三个war文件。我测试了使用叠加层合并war文件,发现以下配置有效。即使用依赖项:

注意:这些依赖项位于commonModule pom文件

<dependency>
  <groupId>com</groupId>
  <artifactId>customerModule</artifactId>
  <version>3.0</version>
  <type>war</type>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>com</groupId>
  <artifactId>productModule</artifactId>
  <version>3.1</version>
  <type>war</type>
  <scope>compile</scope>
</dependency>

如果我然后构建commonModule模块,我最终得到一个war文件,其中包含Module1,Module2和Module3的所有内容。最终结果是这样的:

MyApp.war
    |-webapp
        |-css
            |-style.css
        |-jsp
            |-customer
                |-findCustomer.jsp
                |-addNewCustomer.jsp
                |-deleteCustomer.jsp
            |-product
                |-productCustomer.jsp
                |-addNewProduct.jsp
                |-deleteProduct.jsp     
            |-templates
                |-coreTemplate.jsp
    |-META-INF
        |-MANIFEST.MF
        |-context.xml
    |-WEB-INF
        |-lib
            |-oraclejdbc.lib
            |-log4j.lib
            |-common.lib
            |-customerModule.jar
            |-productModule.jar
        |-classes
            |-com
                |-mycomany
                    |-common
                        |-Logger.class
                        |-Access.class
        |-struts-config.xml
        |-tiles-def.xml
        |-web.xml   

以上工作但需要一些人工干预才能完整发布。以下是模块修改后会发生什么的示例

第1组更新模块1

- Team 1 makes changes to module 1 and check in changes into CVS    
- Team 1 installs module 1 onto the maven repository by issuing mvn:prepare and mvn:perform on module 1. This adds a new version of customerModule.war on to the local repository
- Team 1 updates the dependency version for module 1 in the pom file used to merge the war files (i.e. commonModule)
- Team 1 builds the deployable war file by building the commonModule. 

上面没有使用您建议的多模块项目,所以我试图了解版本控制如何与多模块项目一起使用。例如,假设多模块项目看起来像这样

MyApp
 |- productModule
    |-pom.xml
 |- customerModule
    |-pom.xml
 |- commonModule
    |-pom.xml
 |-pom.xml
  • 在每个子模块中添加版本号与在父版本号上添加版本号有什么不同?
  • 您说子模块将使用父版本。可以说父版本目前是版本3.4,它怎么会知道它应该使用productModule.war的3.1版本?
  • 最后,如果团队1对其中一个子模块进行了更改,他们是否仍需要构建它并在构建多模块项目之前将其作为单个产品部署到maven存储库中,或者这可以可以一步完成吗?
  • 如果我想制作补丁版本并不一定意味着使用特定模块的最新版本,这将如何工作?

由于

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

对于问题“编辑”部分中描述的场景,我建议将所有war文件放在一个:multi模块项目中。