我有一个类似于
的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文件中的版本,以使用正确的模块版本进行构建。
感谢您的帮助拉尔夫。基本上这就是我想要实现的目标:
我要做的是创建一个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
由于
答案 0 :(得分:3)
您可能希望使用依赖项范围而不是更新pom:http://docs.codehaus.org/display/MAVEN/Dependency+Mediation+and+Conflict+Resolution#DependencyMediationandConflictResolution-DependencyVersionRanges
答案 1 :(得分:3)
对于问题“编辑”部分中描述的场景,我建议将所有war文件放在一个:multi模块项目中。