持续不断地学习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里面很难去区分两个不命名的项目。

  1. 译者注: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

  1. 需要注意的是,每一个需要junit的子项目必须还要声明对junit的依赖。关于版本和scope的信息就可以被省略掉,这样的话就可以在避免重复的同时保证整个项目使用相同的依赖了。
  2. 子项目的pom文件如下
  3. ```xml```
  4. <dependencies>
  5. <dependency>
  6. <groupId>junit</groupId>
  7. <artifactId>junit</artifactId>
  8. </dependency>
  9. </dependencies>

在开发时用SNAPSHOT

SNAPSHOT版本是一种使用习惯,它带来了显而易见的好处,具体如下:

它降低了资源的需求。比如,它降低了Nexus服务器对磁盘空间的使用;

它减轻了独立项目生成带来的频繁变化。比如,有一个A项目依赖B项目,两个项目同时在开发。A项目可以声明一个B项目的SNAPSHOT版本的依赖,这样在B每次构建的时候A项目就不用每次都修改它的依赖了。

用maven的依赖插件的分析结果来帮助你识别项目中的依赖管理问题

maven依赖插件(Maven Dependency Plugin)的analyze 目标可以识别一个项目中关于依赖的两类问题:

  1. 直接就使用但未声明的依赖;(项目可以编译因为它也得到了所需的依赖)
  2. 声明了但没有使用的依赖。

你可以设置如果有任何依赖相关的警告时构建失败,参见: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 最佳实践的更多相关文章

  1. Maven最佳实践:版本管理

    什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基本用 ...

  2. Maven最佳实践:管理依赖

    From:http://juvenshun.iteye.com/blog/337405 Maven最佳实践:管理依赖 "If I have seen further it is by sta ...

  3. Maven最佳实践:版本管理【转】

    什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基本用 ...

  4. Maven最佳实践:Maven仓库(转)

    转自:http://juvenshun.iteye.com/blog/359256 什么是Maven仓库 在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/li ...

  5. 【转】Maven最佳实践:划分模块

    转自:http://juvenshun.iteye.com/blog/305865 “分天下为三十六郡,郡置守,尉,监” —— <史记·秦始皇本纪> 所有用Maven管理的真实的项目都应该 ...

  6. Maven最佳实践:划分模块

    http://juvenshun.iteye.com/blog/305865 ************************************* "分天下为三十六郡,郡置守,尉,监& ...

  7. (转)Maven最佳实践:划分模块

    “分天下为三十六郡,郡置守,尉,监” —— <史记·秦始皇本纪> 所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作多模块 ...

  8. Maven最佳实践-distributionManagement

    分发构件至远程仓库 mvn install 会将项目生成的构件安装到本地Maven仓库,mvn deploy 用来将项目生成的构件分发到远程Maven仓库.本地Maven仓库的构件只能供当前用户使用, ...

  9. MAVEN最佳实践:模块划分

    转自:http://juvenshun.iteye.com/blog/305865 所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作 ...

随机推荐

  1. [转]MSI安装程序中的文件替换

    原文链接:http://teach.hanzify.org/article/652-1233562028.html 前言 最近有汉化朋友问起如何不重新制作MSI文件,而直接用汉化好的文件替换MSI安装 ...

  2. AJAX 缓存

     cache   默认为true,   从浏览器里读取缓存.   提高性能   设置为false,则每次从方法获取,不进缓存

  3. 《转》Unity3D研究院之UGUI一个优化效率小技巧

    无意间发现了一个小技巧.如下图所示,可以发现UGUI的Image组件的RaycastTarget勾选以后会消耗一些效率,为了节省效率就不要勾选它了,不仅Image组件Text组件也有这样的问题. 一般 ...

  4. java基础-注释

    注释是一种形式的元数据,提供了非程序自身的数据,注释对于被注释的代码没有直接的影响. 本文主要概括注释的使用,java平台(SE)预定义的注释,类型注释是如跟可插入类型系统连用达到更强的类型检查的,以 ...

  5. Codeforces Round #345 (Div. 1) A. Watchmen

    A. Watchmen time limit per test 3 seconds memory limit per test 256 megabytes input standard input o ...

  6. Codeforces CF#628 Education 8 A. Tennis Tournament

    A. Tennis Tournament time limit per test 1 second memory limit per test 256 megabytes input standard ...

  7. Hadoop 学习资料集锦

    Hadoop 资料 虾皮系列教程. Sqoop 资料 官方安装文档. 浪迹天涯博客. 瀚海星空博客. ……

  8. Linux tricks

    Environment Settings Path Globally set path is in /etc/profile; or the user's .bash_profile for part ...

  9. ThinkPHP框架的一些基础应用

    这是俺滴师傅给俺传授了的知识,特在此分享. TP框架,做PHP开发的都应该有所耳闻.下面,我们就来说说入口文件的生成: 创建新项目时,首先,在目录文件下创建一个新的文件夹.然后将Thinkphp框架文 ...

  10. apache+php 安装

    Apache和PHP的版本分别为: httpd-2.4.9-win64-VC11.zip php-5.6.9-Win32-VC11-x64.zip 下载地址: php-5.6.9-Win32-VC11 ...