Maven 最佳实践
持续不断地学习maven
Maven是一个很好的工具,但同时也拥有陡峭的学习曲线。因此,将 http://books.sonatype.com/mvnref-book/reference/ 加入到你的书签栏经常翻阅吧。
了解Maven的命令行选项
为了学习Maven的命令行选项,你可以执行mvn -?。下面是一些有用的选项:
-B : 在批处理模式下run maven,这个模式对在类似于Bamboo的可持续集成服务器上使用Maven会很有用处,因为这类系统不允许maven报告下载的进度
-e : 配置maven报告详细的错误信息,这对于在maven运行在一个类似于Atlassion Bamboo的可持续集成的服务器上调试问题很有帮助。
了解标准的Maven插件
在学习一个特定的maven插件的时候,打开这个maven插件的网站仔细阅读这个插件的目标的详细信息。
最好在artifacts和maven项目之间建立一对一的关系
比如,如果你的代码要创建三个jar包,那么最好就有三个maven的项目。如果这三个jar包文件使用了相同的代码,那么就创建第四个maven项目来保存这些代码,然后让原来的三个项目增加一个对公共代码的依赖。
命名你的项目
即使 <name data-preserve-html-node="true" data-preserve-html-node="true">
在pom.xml中可选的,你也使用它吧!不要想sonar一样只用一个项目名称。在IDE里面很难去区分两个不命名的项目。
译者注:Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具
将所有生成的artificts放到target目录
在你执行mvn clean的时候,target目录将会自动删除。因此target目录是个放置所有包括java的class文件、jar包、过程中的临时文件等生成物的最佳地点。maven的插件一般也会把他们临时生成的artifacts放到target目录。
在父pom文件中应用dependenceManagement部分来避免子项目中重复的依赖信息
maven的dependenceManagement允许父pom文件来定义那些可能被子项目重用的依赖。这会避免重复依赖;如果没有dependenceManagement,每个子项目都需要定义自己的依赖,这会包含重复的 版本信息、重复的scope信息、重复的依赖类型信息。比如,假设有个多模块的java项目都需要依赖Junit来做单元测试。为了表示这个项目对junit的依赖,父pom文件可以使用一个想下面的dependencyManagement:
xml
junit
junit
4.8.1
test
需要注意的是,每一个需要junit的子项目必须还要声明对junit的依赖。关于版本和scope的信息就可以被省略掉,这样的话就可以在避免重复的同时保证整个项目使用相同的依赖了。
子项目的pom文件如下
```xml```
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
在开发时用SNAPSHOT
SNAPSHOT版本是一种使用习惯,它带来了显而易见的好处,具体如下:
它降低了资源的需求。比如,它降低了Nexus服务器对磁盘空间的使用;
它减轻了独立项目生成带来的频繁变化。比如,有一个A项目依赖B项目,两个项目同时在开发。A项目可以声明一个B项目的SNAPSHOT版本的依赖,这样在B每次构建的时候A项目就不用每次都修改它的依赖了。
用maven的依赖插件的分析结果来帮助你识别项目中的依赖管理问题
maven依赖插件(Maven Dependency Plugin)的analyze 目标可以识别一个项目中关于依赖的两类问题:
- 直接就使用但未声明的依赖;(项目可以编译因为它也得到了所需的依赖)
- 声明了但没有使用的依赖。
你可以设置如果有任何依赖相关的警告时构建失败,参见:http://maven.apache.org/plugins/maven-dependency-plugin/examples/failing-the-build-on-dependency-analysis-warnings.html
使用未声明的依赖
有如下的假定:
A项目使用了来自B和C项目的类;
A只声明了一个B项目的依赖;
B项目也使用了C项目的类;
B项目声明了以一个C项目的依赖。
这种情况存在一个潜在的问题,因为A依赖B,B依赖C,A项目只有在B项目移除了对C项目的引用后才能编译。如果是SNAPSHOT版本的话问题将会更加严重。
当对A项目用mvn dependency:analyze进行分析时,maven将会有如下输出:
[WARNING] Used undeclared dependencies found:
[WARNING] com.avaya.ace.aaft:foundation_services_client_api:jar:6.2.0-SNAPSHOT:compile
A项目直接声明一个对C项目的引用就会解决这个问题。
没有使用的依赖声明
如果一个项目声明了一个依赖,但没有使用它,mvn dependency:analyze会有如下输出:
[WARNING] Unused declared dependencies found:
[WARNING] com.gigaspaces:gs-openspaces:jar:7.1.1-b4534:compile
在POM文件移除这个依赖声明就可以解决这个问题。
未使用的依赖一般是开发者没有搞清楚maven dependenceManagement的原理造成的。
使用maven依赖管理而不是写普通的代码
例如,如果一个Maven项目取决于由另一个Maven项目生成的zip文件,那么使用第二个项目创建一个Maven artifact、使用Maven的依赖,而不是使用相对路径
使用maven依赖管理而不是使用subversion的externals
比如,有一个Maven项目依赖的资源存储在另一个项目的存储库,那么使用第二个项目创建一个Maven artifact,然后使用Maven依赖来使第一个项目访问。
不要自己写maven的代码来复制或者解压文件
使用maven标准的插件来替代。
原文地址
http://www.kyleblaney.com/maven-best-practices/
Maven 最佳实践的更多相关文章
- Maven最佳实践:版本管理
什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基本用 ...
- Maven最佳实践:管理依赖
From:http://juvenshun.iteye.com/blog/337405 Maven最佳实践:管理依赖 "If I have seen further it is by sta ...
- Maven最佳实践:版本管理【转】
什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基本用 ...
- Maven最佳实践:Maven仓库(转)
转自:http://juvenshun.iteye.com/blog/359256 什么是Maven仓库 在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/li ...
- 【转】Maven最佳实践:划分模块
转自:http://juvenshun.iteye.com/blog/305865 “分天下为三十六郡,郡置守,尉,监” —— <史记·秦始皇本纪> 所有用Maven管理的真实的项目都应该 ...
- Maven最佳实践:划分模块
http://juvenshun.iteye.com/blog/305865 ************************************* "分天下为三十六郡,郡置守,尉,监& ...
- (转)Maven最佳实践:划分模块
“分天下为三十六郡,郡置守,尉,监” —— <史记·秦始皇本纪> 所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作多模块 ...
- Maven最佳实践-distributionManagement
分发构件至远程仓库 mvn install 会将项目生成的构件安装到本地Maven仓库,mvn deploy 用来将项目生成的构件分发到远程Maven仓库.本地Maven仓库的构件只能供当前用户使用, ...
- MAVEN最佳实践:模块划分
转自:http://juvenshun.iteye.com/blog/305865 所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作 ...
随机推荐
- Keras官方Example里Mnist-cnn的调试运行
问题:老板让测试运行Keras官网里的Mnist-cnn.py,结果从下载数据就是一路坑-- 当前环境:Ubuntu12.04.python2.7.Keras 1.1.1(不知道这个版本号对不对,在启 ...
- curl模拟post,get,put,delete
安装curl:https://curl.haxx.se/download.html 测试:tomcat默认禁用put,delete返回403 GET curl -HAccept:text/plain ...
- 4.4 多线程进阶篇<下>(NSOperation)
本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人"简书" 本文源码 Demo 详见 Github https://github.c ...
- oracle plsql 无法连接 报 ORA-12560: TNS:protocol adapter error
ORA-12560: TNS:protocol adapter error 添加一个环境变量,名为TNS_ADMIN,值为 tnsnames.ora 文件所在路径.比如我的本机为:D:/instant ...
- json相关的一些用法
一. json可以表示3种类型的值: 简单值 . 对象. 数组 表示对象时:>1. 没有变量的概念 ,所以不用申明变量 >2. 没有末尾结束 ...
- html中的图像动态加载问题
首先要说明下文档加载完成是什么概念 一个页面http请求访问时,浏览器会将它的html文件内容请求到本地解析,从窗口打开时开始解析这个document,页面初始的html结构和里面的文字等内容加载完成 ...
- Android之Json的学习
json数据包含json对象,json数组,对象是{ },数组是[ ], 数组里面还可以包含json对象,json对象之间是用逗号(,)隔开 形式如下: { "languages" ...
- #1094 : Lost in the City
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi gets lost in the city. He does not know where he is ...
- 使用C#和Excel进行报表开发(三)-生成统计图(Chart)
有的Web项目选用Excel作为报表方案,在服务器端生成Excel文件,然后传送到客户端,由客户端进行打印.在国内的环境下,相对PDF方式,Excel的安装率应该比pdf阅读器的安装率要高,同时,微软 ...
- PHP如何使用GeoIP数据库
1.首先下载GeoIP的IP库.参考<利用GeoIP数据库及API进行地理定位查询>.下载后解压,得到一个GeoIP.dat文件 2.新建一个文件geoip.inc.内容为 <?ph ...