1、依赖管理(Dependency management)
下面的例子中,你会注意到每个依赖的版本号(version)直接写死,而且定义在应用级别pom文件中:
<dependencies> <dependency> <groupId>com.nimbusds</groupId> <artifactId>nimbus-jose-jwt</artifactId> <version>2.26</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.2</version> </dependency> </dependencies>
<dependencyManagement> <dependencies> <dependency> <groupId>com.nimbusds</groupId> <artifactId>nimbus-jose-jwt</artifactId> <version>2.26</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.2</version> </dependency> </dependencies> </dependencyManagement>
一旦你在dependencyManagement部分定义了依赖(如上面代码所示),用到时候,只需配置依赖的groupId和artifactId部分。如某个应用级别的pom所引用父pom定义管理dependencyManagement所管理的依赖时:
<dependencies> <dependency> <groupId>com.nimbusds</groupId> <artifactId>nimbus-jose-jwt</artifactId> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency> </dependencies>
这个管理也可以用到pom文件中pluginss部分。
2、定义父pom模块。
在多模块项目中,共享者许多pom中的配置,比如依赖的版本号、插件、属性部分、仓库部分等。
最好的方法是只定义一份管理它们,这就需要创建单独的父模块及pom文件。
比如:http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/parent/pom.xml。
有些项目把父pom文件放到根目录(并不是父模块中)。效果一样,第一种方法比较常用。
3、pom属性(POM properties)
Maven应用中pom文件内有6类属性。
• Built-in properties
• Project properties
• Local settings
• Environment variables
• Java system properties
• Custom properties
推荐用属性配置,而不是硬编码这些值。
如:
http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/distribution/pom.xml
project
<dependencies> <dependency> <groupId>org.apache.axis2</groupId> <artifactId>axis2-java2wsdl</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.apache.axis2</groupId> <artifactId>axis2-kernel</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.apache.axis2</groupId> <artifactId>axis2-adb</artifactId> <version>${project.version}</version> </dependency> </dependencies>
groupId 上面的还不是最完美的,进一步的改进如下:
<dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>axis2-java2wsdl</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>axis2-kernel</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>axis2-adb</artifactId> <version>${project.version}</version> </dependency> </dependencies>
下面列出了一些maven定义的项目相关的属性:
• project.version: This refers to the value of the version element of the project POM file
• project.groupId: This refers to the value of the groupId element of the project POM file
• project.artifactId: This refers to the value of the artifactId element of the project POM file
• project.name: This refers to the value of the name element of the project POM file
• project.description: This refers to the value of the description element of the project POM file
• project.baseUri: This refers to the path of the project's base directory
环境变量也可以用env前缀读取,比如${env.M2_HOME}会返回Maven home路径。${env.JAVA_HOME}返回java home路径。
Maven支持我们自定义属性,一把我们用于定义依赖版本号。如下:
<properties> <rampart.version>1.6.1-wso2v10</rampart.version> <rampart.mar.version>1.6.1-wso2v10</rampart.mar.version> <rampart.osgi.version>1.6.1.wso2v10</rampart.osgi.version> </properties>
我们就可以这样用了:
<dependency> <groupId>org.apache.rampart.wso2</groupId> <artifactId>rampart-core</artifactId> <version>${rampart.version}</version> </dependency>
未完,待续。。。。
4、避免重复的groupId和version,让它们继承自父pom。
在多模块maven项目中,多数模块(并不是全部)共享相同的groupId和version,所以,我们可以避免在子模块中重复,它们会从相应的父pom中继承。
例如:http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/pom.xml
<parent> <groupId>org.apache.axis2</groupId> <artifactId>axis2-parent</artifactId> <version>1.7.0-SNAPSHOT</version> <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>axis2-kernel</artifactId> <name>Apache Axis2 - Kernel</name>
6、学会使用Maven自带的插件功能及其它公司的插件。
7、发行一个版本,使用 Maven release plugin。
8、构建环境中控制或强迫使用常量时,用Maven enforcer plugin。比如Maven版本号、java版本号、操作系统环境参数和用户自定义规则。
9、避免使用不提供版本号的插件。
如果使用的插件没提供版本号,Maven会自动下载最新版本,但这会发生一些不确定的事情。你的项目可能这段时间使用这个最新版本正常工作,隔断时间,最新版本升级了,可能导致不确定性行为。
10、避免覆盖Maven项目默认的文件结构。
11、开发过程中使用SNAPSHOT版本。
12、去掉没用的依赖。
Maven dependency 插件可以分析项目中哪些依赖没用到。
maven-dependency-plugin 没有定义在超级pom(super pom)文件内,所以你必须显示的定义在你的项目pom文件中:
<plugin> <artifactId>maven-dependency-plugin</artifactId> <version>2.0</version> </plugin>
你可以使用命令 mvn dependency:analyze分析。
(最新版本Maven 好像不用配置就能用)
参考:Mastering Apache Maven 3
Enhance developer productivity and address exact enterprise build requirements by extending Maven