我发现在同一命令行调用中运行mvn install并覆盖POM中定义的属性时,不会更新安装到本地存储库的POM中已定义属性的值,这会导致打包的工件与POM文件不同步。例如,考虑两个模块,模块一和模块二,具有以下POM
module-one 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.0</modelVersion>
<groupId>org.myorg.test</groupId>
<artifactId>module-one</artifactId>
<version>1.0</version>
模块二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.0</modelVersion>
<groupId>org.myorg.test</groupId>
<artifactId>module-two</artifactId>
<version>1.0</version>
<properties>
<module.one.version>1.0</module.one.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.myorg.test</groupId>
<artifactId>module-one</artifactId>
<version>${module.one.version}</version>
</dependency>
</dependencies>
在模块上运行mvn install一个POM会将module-one:1.0安装到本地存储库。现在,如果您编辑模块一个POM并将版本设置为2.0并运行mvn install将module-one:2.0安装到您的本地存储库。
现在在module-two pom上运行mvn install -Dmodule.one.version = 2.0将导致将module-two:1.0安装到本地存储库。但是,检查构建的JAR并打开清单文件将显示以下内容
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Build-Jdk: 1.6.0_26
Class-Path: module-one-2.0.jar
但是在本地存储库中使用这个构建的jar的POM仍将引用对module-one的依赖:1.0,因为属性将保持原来的定义
<properties>
<module.one.version>1.0</module.one.version>
</properties>
...
<dependencies>
<dependency>
<groupId>org.myorg.test</groupId>
<artifactId>module-one</artifactId>
<version>${module.one.version}</version>
</dependency>
</dependencies>
这是正确的行为吗?或者应该以不同的方式解析属性module.one.version吗?
由于
答案 0 :(得分:1)
是的,这就是maven的工作原理。因此,我总是在pom中定义属性的默认值,并在settings.xml
或命令行或配置文件中覆盖它们。感谢存储库中的pom有更大的机会为团队中的其他开发人员顺利工作。