Maven最佳实践
来源:互联网 发布:复杂网络的混沌同步 编辑:程序博客网 时间:2024/06/05 08:43
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最佳实践
- maven nexus 最佳实践
- MAVEN 安装最佳实践
- maven nexus 最佳实践
- maven nexus 最佳实践
- maven最佳实践
- maven最佳实践
- Maven最佳实践
- Maven最佳实践-distributionManagement
- maven安装最佳实践
- Maven最佳实践:Maven仓库
- Maven最佳实践:Maven仓库
- Maven最佳实践:Maven仓库
- Maven最佳实践:Maven仓库
- Maven最佳实践:Maven仓库
- Maven最佳实践:Maven仓库
- Maven最佳实践:Maven仓库
- Maven最佳实践:Maven仓库
- Android即时聊天系统--随聊APP之接口定义
- sencha grid templatecolumn模板列和actioncolumn
- Java关键字final
- unity3d easytouch教程
- 学习HTML5 canvas第一天
- Maven最佳实践
- RedHat5安装gstreamer过程记录
- wsdl2h解析器和soapcpp2编译器选项介绍
- win7下上帝模式
- Hadoop集群_MapReduce初级案例
- 使用gsoap进行soap开发
- C++解析一段以;分隔的字符串
- 【Android UI】ViewPager禁止滚动
- getMeasuredHeight()与getHeight的区别