Maven 开 发 规 范
转自:http://blog.csdn.net/gaoqiao1988/article/details/52620376
目 录
1.Maven简介... 4
1.1什么是 Maven?... 4
1.2 Maven 能够帮助我们干什么?... 4
2.Maven深入了解... 5
2.1 Maven 概念模型... 5
2.2 Pom全景图... 5
2.3 Maven中pom.xml关键词... 6
2.4 Maven 常见命令... 10
2.5 Maven的默认生命周期... 11
2.6 Maven 标准目录结构... 13
2.7 Maven依赖查询... 15
2.8 Maven中/.m2/settings.xm配置介绍... 16
3 使用Nexus搭建Maven私服... 17
3.1私服简介... 17
3.2 使用Nexus搭建私服... 18
3.3 项目私服配置... 26
Maven是Apache的一个顶级的项目:http://maven.apache.org/
Maven这个单词来自于意第绪语(犹太语),意为知识的积累,最早在JakataTurbine项目中它被用来简化项目的构建过程。当时有很多项目,它们的Ant build文件仅有细微的差别,而JAR文件都由CVS来维护。于是Maven创始者开始了Maven这个项目,该项目的清晰定义包括,一种很方便的发布 项目信息的方式,以及一种在多个项目中共享JAR的方式。
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(ProjectLifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
Maven 包含一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。
此外,Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件,等等。
简言之,Maven 可以帮助我们完成以下工作:
Tips: groupId,artifactId和version这三个元素定义了一个项目的基本坐标,在Maven项目中,任何jar,pom或war都是以基于这些基本坐标进行区分的。
补充:1、建议在parent的pom中使用好pluginManagement和dependencyManagement,而子项目引用即可;
2、使用参数,方便管理版本和重要参数;
3、明显不用的dependency要exclude掉(使用exclusion),避免过多垃圾;
4、合理设置子项目
pluginManagement是表示插件声明,即在项目中的pluginManagement下声明了插件,maven不会加载该插件,pluginManagement声明可以被继承。
pluginManagement的一个使用案例是当有父子项目的时候,父项目中可以利用pluginManagement声明子项目中需要用到的插件, 之后,当某个或者某几个子项目需要加载该插件的时候,就可以在子项目中plugins节点只配置 groupId 和 artifactId就可以完成插 件的引用。
pluginManagement主要是为了统一管理插件,确保所有子项目使用的插件版本保持一致,类似的还有dependencies和dependencyManagement。
2.3.1 pom中依赖配置
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<classifier></classifier>
<systemPath></systemPath>
<scope></scope>---------------依赖范围
<type></type>-----------------依赖的类型
<optional></optional>---------标记依赖是否可选
<exclusions></exclusions>-----排除传递依赖
</dependency>
pom.xml中简写:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.10.RELEASE</version>
</dependency>
pom 依赖调解原则:①第一原则,路径近者优先原则
②第二原则,第一声明者优先原则
2.3.2 pom中使用第三方仓库
<distributionManagement>
<repository>
<id>releases</id>
<url>http://182.92.3.15:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://182.92.3.15:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
2.3.3 编译Java代码插件
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
2.3.4处理资源文件插件
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
2.3.5 源码打包插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
2.3.6 生成javadoc文档包的插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.8</version>
<configuration>
<outputDirectory>target\javadoc</outputDirectory>
<reportOutputDirectory>target\javadoc</reportOutputDirectory>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
2.3.7 测试插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.7.2</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
2.3.8 Tomcat插件
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
</plugin>
2.3.9 一些比较常用的插件(Maven仓库搜索引擎:http://search.maven.org/ )
①maven-archetype-plugin
使用交互式的方式提示用户输入必要的信息以创建项目, 如由一个产品需要交付给很多客户进行二次开发,你就可以为他们提供一个Archtype,帮助他们快速上手。
http://maven.apache.org/archetype/maven-archetype-plugin/
②maven-assembly-plugin
制作项目分发包,该分发包可能包含了项目的可执行文件、源代码、readme、平台脚本等等。
http://maven.apache.org/plugins/maven-assembly-plugin/
③maven-dependency-plugin
帮助分析项目依赖
http://maven.apache.org/plugins/maven-dependency-plugin/
④maven-enforcer-plugin
创建一系列规则强制遵守,设定Java版本、设定Maven版本、禁止某些依赖、禁止SNAPSHOT依赖。只要在一个父POM配置规则,然后让大家继承,当规则遭到破坏的时候,Maven就会报错。除了标准的规则之外,还可以扩展该插件,编写自己的规则。有助于保持项目构建稳定
http://maven.apache.org/plugins/maven-enforcer-plugin/
⑤maven-help-plugin
一个小巧的辅助工具, help:system可以打印所有可用的环境变量和Java系统属性。help:effective-pom和help:effective-settings,它们分别打印项目的有效POM和有效settings, maven-help-plugin的describe目标可以帮助你描述任何一个Maven插件的信息.
http://maven.apache.org/plugins/maven-help-plugin/
⑥versions-maven-plugin
命令 mvn versions:set -DnewVersion=1.1-SNAPSHOT 就能把所有模块的版本更新到1.1-SNAPSHOT。display-dependency-updates能知道项目依赖有哪些可用的更新;类似的display-plugin-updates能知道可用的插件更新;然后use- latest-versions能自动将所有依赖升级到最新版本。最后,可以使用 mvn versions:commit 提交,不满意的话也可以使用 mvn versions:revert 进行撤销。
http://mojo.codehaus.org/versions-maven-plugin/
mvn archetype:create |
创建Maven项目 |
mvn compile |
编译源代码 |
mvn test-compile |
编译测试源代码 |
mvn test |
运行应用程序中的单元测试 |
mvn install |
在本地Respository中安装jar |
mvn eclipse:eclipse |
生成eclipse项目文件 |
mvn idea:idea |
生成idea项目 |
mvn jetty:run |
启动jetty服务 |
mvn tomcat:run |
启动tomcat服务 |
mvn clean |
清除项目目录中的生成结果 |
mvn site |
生成项目相关信息的网站 |
mvn package |
根据项目生成的jar |
mvn deploy |
根据项目发布到私服 |
mvn clean package -Dmaven.test.skip=true |
清除以前的包后重新打包,跳过测试类 |
mvn -X compile dependency: tree -Dverbose >a.log |
检查Jar包版本冲突, a.log文件里查找 是否有"omitted for conflict with",如果有,则表示jar包有版本冲突 |
Default Lifecycle |
生命周期阶段 |
描述 |
第一套生命周期: Clean Lifecycle 在进行真正的构建之前进行一些清理工作。 |
||
pre-clean |
执行项目清理前所需要的工作。 |
|
clean |
清理上一次build项目生成的文件。 |
|
post-clean |
执行完成项目清理所需的工作。 |
|
第二套生命周期: Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。 |
||
validate |
验证 |
确保当前配置和 POM 的内容是有效的。这包含对 pom.xml 文件树的验证。 |
initialize |
初始化 |
在执行构建生命周期的主任务之前可以进行初始化。 |
generate-sources |
生成源码 |
代码生成器可以开始生成在以后阶段中处理或编译的源代码。 |
process-sources |
处理源码 |
提供解析、修改和转换源码。常规源码和生成的源码都可以在这里处理。 |
generate-resources |
生成资源 |
生成非源码资源。通常包括元数据文件和配置文件。 |
process-resources |
处理资源 |
处理非源码资源。修改、转换和重定位资源都能在这阶段发生。 |
compile |
编译 |
编译源码。编译过的类被放到目标目录树中。 |
process-classes |
处理类 |
处理类文件转换和增强步骤。字节码交织器和常用工具常在这一阶段操作。 |
generate-test-sources |
生成测试源码 |
为编译内容生成测试源代码。 |
process-test-sources |
处理测试源码 |
在编译前对测试源码执行任何必要的处理。在这一阶段,可以修改、转换或复制源代码。 |
generate-test-resources |
生成测试资源 |
允许生成与测试相关的(非源码)资源。 |
process-test-resources |
处理测试资源 |
可以处理、转换和重新定位与测试相关的资源。 |
test-compile |
测试编译 |
编译单元测试的源码。 |
process-test-classes |
对测试编译生成的文件做后期处理(需Maven2.0.5及以上) |
|
test |
测试 |
运行编译过的单元测试并累计结果。 |
prepare-package |
执行打包前的所有操作(需Maven2.1及以上) |
|
package |
打包 |
将可执行的二进制文件打包到一个分布式归档文件中,如 JAR 或 WAR。 |
pre-integration-test |
前集成测试 |
准备集成测试。这种情况下的集成测试是指在一个受到一定控制的模拟的真 |
integration-test |
集成测试 |
执行真正的集成测试。 |
post-integration-test |
后集成测试 |
解除集成测试准备。这一步涉及测试环境重置或重新初始化。 |
verify |
检验 |
检验可部署归档的有效性和完整性。过了这个阶段,将安装该归档。 |
install |
安装 |
将该归档添加到本地 Maven 目录。这一步让其他可能依赖该归档的模块可以使用它。 |
deploy |
部署 |
将该归档添加到远程 Maven 目录。这一步让这个工件能为更多的人所用。 |
第三套生命周期: Site Lifecycle 生成项目报告,站点,发布站点。 |
||
pre-site |
执行一些生成项目站点文档前的准备工作。 |
|
site |
生成项目站点的文档。 |
|
post-site |
执行需完成站点生成的工作,如站点部署的准备工作。 |
|
site-deploy |
向制定的web服务器部署站点生成文件。 |
Tips: ①Maven有三套相互独立的生命周期
②运行任何一个阶段的时候,它前面的所有阶段都会被运行
好的目录结构可以 使开发人员更容易理解项目,为以后的维护工作也打下良好的基础。Maven2根据业界公认的最佳目录结构,为开发者提供了缺省的标准目录模板。Maven2的标准目录结构如下:
src/main/java |
源码目录 |
src/main/resources |
主资源目录 |
src/main/filters |
资源过滤文件目录 |
src/main/assembly |
Assembly descriptors |
src/main/config |
配置文件目录根 |
src/main/scripts |
Application/Library scripts |
src/main/webapp |
Web资源目录(jsp,js,css) |
src/test/java |
测试代码目录 |
src/test/resources |
测试所需资源目录 |
src/test/filters |
测试资源过滤文件目录 |
src/site |
与site相关的资源目录 |
LICENSE.txt |
Project's license |
NOTICE.txt |
Notices and attributions required by libraries that the project depends on |
README.txt |
Project's readme |
使用目录模板,可以使 pom.xml 更简洁。因为 Maven2 已经根据缺省目录,预定义了相关的动作,而无需人工的干预。以 resources 目录为例:
这些动作在 Maven1 中,是需要在 maven.xml 中使用<preGoal>或<postGoal>来完成的。如今,完全不需要在pom.xml中指定就能够自动完成。在src和 test都使用resources,方便构建和测试,这种方式本就已是前人的经验。通过使用Maven2,使这个经验在开发团队中得到普及。
创建标准目录模板,可以通过如下命令:
mvn archetype:create -DgroupId=com.codeline.commons -DartifactId=codelineCommons
groupId和artifactId的含义与Maven1中的含义一样,参数artifactId的值会作为项目根目录的名字。除了建立相应的目录之外,Maven2还会创建缺省的pom.xml。
Maven2也考虑到:不同类型的项目需要拥有不同的目录结构。如创建web项目,可以使用命令:
mvn archetype:create -DgroupId=com.mycompany.app
-DartifactId=my-webapp
-DarchetypeArtifactId=maven-archetype-webapp
Tips:新版本中archetype:create命令已经过期,需要使用archetype:generate来进行替换
查询地址:http://mvnrepository.com
可以通过该网站查询所需要的依赖包格式
私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。
我们可以使用专门的 Maven 仓库管理软件来搭建私服,比如:Apache Archiva,Artifactory,Sonatype Nexus。这里我们使用 Sonatype Nexus。
3.2.1下载Nexus
Nexus 专业版是需要付费的,这里我们下载开源版 Nexus OSS。Nexus 提供两种安装包,一种是包含 Jetty 容器的 bundle 包,另一种是不包含容器的 war 包。下载地址:http://www.sonatype.org/nexus/go
3.2.2 安装Nexus
解压安装包nexus-3.0.1-01-win64.zip
修改数据存储路径,文件目录:bin/nexus.vmoptions
进入etc/org.sonatype.nexus.cfg进行修改IP、端口, 访问根目录
修改完相关配置文件后,打开命令提示符:cmd,进入/nexus-3.0.1-01/bin目录,命令:
执行 nexus.exe /run
打开浏览器,访问:http://localhost:8081/nexuz-zip/
点击右上角 Sign in,使用默认用户名:admin ,密码:admin123 登录,
创建用户
3.2.3 Nexus预置的仓库
创建maven仓库
pepositories说明:
maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar
maven-releases:私库发行版jar
maven-snapshots:私库快照(调试版本)jar
maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。
点击左侧 Repositories 链接,查看 Nexus 内置的仓库:
Nexus 的仓库分类:
· hosted 宿主仓库:主要用于部署无法从公共仓库获取的构件(如 Oracle 的 JDBC 驱动)以及自己或第三方的项目构件;
· proxy 代理仓库:代理公共的远程仓库;
· virtual 虚拟仓库:用于适配 Maven 1;
·group 仓库组:Nexus 通过仓库组的概念统一管理多个仓库,这样我们在项目中直接请求仓库组即可请求到仓库组管理的多个仓库。
3.2.4 添加宿主仓库- hosted repository
仓库创建完毕
Tips: 配置hosted repository时,一般会配置3个hosted repository,分别是3rd party、Snapshots、Releases,分别用来保存第三方jar,项目组内部的快照、项目组内部的发布版
只是Deployment Policy这个选项,一般Snapshots会配置成允许,而Releases和3rd party会设置为禁止
配置proxy repository
代理中央Maven仓库,当PC访问中央库的时候,先通过Proxy下载到Nexus仓库,然后再从Nexus仓库下载到PC本地。这样的优势只要其中一个人从中央库下来了,以后大家都是从Nexus私服上进行下来,私服一般部署在内网,这样大大节约的宽带。
Remote Storage: 代理的地址,Maven地址为:https://repo1.maven.org/maven2/
开源中国仓库地址:http://maven.oschina.net/content/groups/public/
Tips: 如果出现某些Maven插件找不到依赖的库的问题,请修改代理地址,Maven3启动了新的中央仓库: http://repo.maven.apache.org/maven2/
原先Nexus安装好时已经自动创建了一个代理仓库,可以直接通过搜索栏搜索到自己想找的项目
配置group repository
group其实是一个虚拟的仓库,通过对实体仓库(proxy、hosted)进行聚合,对外暴露一个统一的地址 ,需要将选中的仓库纳入组内才可进行管理
此时已经可以看到纳入的仓库中的内容
需要在maven文件夹下.m2/settings.xml中新增配置,可以将内部仓库设置成镜像仓库
3.2.5 配置Maven使用私服
私服搭建成功,我们就可以配置 Maven 使用私服,以后下载构件、部署构件,都通过私服来管理。
在 settings.xml 文件中,为所有仓库配置一个镜像仓库,镜像仓库的地址即私服的地址:
项目中需要配备地址:
maven的setting文件中需要配备授权仓库的帐户与访问地址:
Tips:id需要配置相同
Tips:如果为Snapshots 时,需要在发布的项目版本后追加,如果为Release,则不需要追加,即可发布项目-命令:deploy -e
项目发布完成后可以在私服管理页面查看