Maven最佳实践

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>

         假设,在多模块maven项目中,每个模块的pom文件中都有一些相同的依赖,当你升级 依赖的版本号时,你必须改动所有的pom文件。利用合适的  dependency management, 我们可以解决上面遇到的问题。如果是多模块项目,最好在父pom文件中引入dependency management,配置元素。如下面的配置就放在多模块父pom中:


<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>

        当你升级或降级依赖版本号时,只需改动 dependencyManagement部分的版本号即可(如果groupId变了,都得改动,如jetty最近的版本就不一样了)。

 这个管理也可以用到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>

         所有的版本号都配置用属性 (上面用的是maven定义的project属性,非自定义属性),而非硬编码。当maven处理这部分定义时,会先找当前pom属性定义部分,找不到就寻找父pom文件。

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>

    上面的配置去掉了groupId硬编码部分。

    下面列出了一些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>

5、学会使用Maven profiles。

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


    

你可能感兴趣的:(Maven最佳实践)