Maven 开 发 规 范
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
1.Maven简介
1.1什么是 Maven?
Maven是Apache的一个顶级的项目:http://maven.apache.org/
此外,Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件,等等。
1.2 Maven能够帮助我们干什么?
2.Maven深入了解
2.1 Maven概念模型
2.2 Pom全景图
2.3 Maven中pom.xml关键词
- Project:
- 任何你想 build 的事物,Maven都会把它们当作是一个 Project。
- 这些 Project 被定义为 POM(Project Object Model)。
- 一个 Project 可以依赖其他的project,一个 project 也可以有多个子project组成。
- POM:
- POM(pom.xml) 是 Maven 的核心文件,它是指示 Maven 如何工作的元数据文件,类似 ant 的 build.xml 文件。
- pom.xml 文件应该位于每个 Project 的根目录。
- GroupId:
- 公司名或组织名。
- ArtifactId:
- 构建出来的文件名,一般来说,这个也是project名。
- Packaging:
- 项目打包的类型,可以是将jar、war、rar、ear、pom。
- Version:
- 项目的版本,项目的唯一标识由 groupId+artifactId+packaging+versionz 组成。
- Dependency:
- 为了能够 build 或运行,一个典型的java project会依赖其他的包,在Maven中,这些被依赖的包就被称为 dependency。
- Plugin:
- Maven是有插件组织的,它的每一个功能都是由插件提供的,主要的插件是由 java 来写的,但是他也支持 beanshell 和 ant 脚本编写的插件。
- Repository:
- 仓库用来存放artifact的,可以是本地仓库,也可以是远程仓库,Maven是由一个默认的仓库.
- 本地仓库在setting.xml中的<localRepository>中设置
- Snapshot:
- 工程中可以(也应该)有这样一个特殊的版本:这个版本可以告诉Maven,该工程正在处于开发阶段,会经常更新(但还为发布)。当其他工程依赖此类型的artifact时,Maven会在仓库中寻找该artifact的最新版本,并自动下载、使用该最新版本。
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。
<scope></scope>---------------依赖范围
<type></type>-----------------依赖的类型
<optional></optional>---------标记依赖是否可选
<exclusions></exclusions>-----排除传递依赖
</dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.10.RELEASE</version>
<url>http://182.92.3.15:8081/nexus/content/repositories/releases</url>
<url>http://182.92.3.15:8081/nexus/content/repositories/snapshots</url>
<artifactId>maven-compiler-plugin</artifactId>
<artifactId>maven-resources-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<outputDirectory>target\javadoc</outputDirectory>
<reportOutputDirectory>target\javadoc</reportOutputDirectory>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
2.3.9 一些比较常用的插件(Maven仓库搜索引擎:http://search.maven.org/ )
使用交互式的方式提示用户输入必要的信息以创建项目, 如由一个产品需要交付给很多客户进行二次开发,你就可以为他们提供一个Archtype,帮助他们快速上手。
http://maven.apache.org/archetype/maven-archetype-plugin/
制作项目分发包,该分发包可能包含了项目的可执行文件、源代码、readme、平台脚本等等。
http://maven.apache.org/plugins/maven-assembly-plugin/
http://maven.apache.org/plugins/maven-dependency-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/
2.4 Maven常见命令
mvn archetype:create |
创建Maven项目 |
mvn compile |
编译源代码 |
mvn test-compile |
编译测试源代码 |
mvn test |
运行应用程序中的单元测试 |
mvn install |
在本地Respository中安装jar |
生成eclipse项目文件 |
|
mvn idea:idea |
生成idea项目 |
启动jetty服务 |
|
mvn tomcat:run |
启动tomcat服务 |
mvn clean |
清除项目目录中的生成结果 |
mvn site |
生成项目相关信息的网站 |
根据项目生成的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包有版本冲突 |
2.5 Maven的默认生命周期
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有三套相互独立的生命周期
②运行任何一个阶段的时候,它前面的所有阶段都会被运行
2.6 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 目录为例:
- src/main/resources,负责管理项目主体的资源。在使用Maven2执行compile之后,这个目录中的所有文件及子目录,会复制到target/classes目录中,为以后的打包提供了方便。
- src/test/resources,负责管理项目测试的资源。在使用Maven2执行test-compile之后,这个目录中的所有文件及子目录,会复制到target/test-classes目录中,为后续的测试做好了准备。
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
-DarchetypeArtifactId=maven-archetype-webapp
Tips:新版本中archetype:create命令已经过期,需要使用archetype:generate来进行替换
2.7 Maven依赖查询
可以通过该网站查询所需要的依赖包格式
2.8 Maven中/.m2/settings.xm配置介绍
- localRepository:自定义本地库路径,默认在/.m2中
- interactiveMode:
- offline:是否每次编译都去查找远程中心库
- pluginGroups:插件组,例如:org.mortbay.jetty
- proxies:通过代理访问外部库
- servers:集成认证服务
- mirrors:镜像库,可以指定内部中心库
- profiles:个性配置,需要在Activation标签中激活
- activeProfiles:表示激活的profile
3 使用Nexus搭建Maven私服
3.1私服简介
我们可以使用专门的 Maven 仓库管理软件来搭建私服,比如:Apache Archiva,Artifactory,Sonatype Nexus。这里我们使用 Sonatype Nexus。
3.2 使用Nexus搭建私服
Nexus 专业版是需要付费的,这里我们下载开源版 Nexus OSS。Nexus 提供两种安装包,一种是包含 Jetty 容器的 bundle 包,另一种是不包含容器的 war 包。下载地址:http://www.sonatype.org/nexus/go
修改数据存储路径,文件目录:bin/nexus.vmoptions
进入etc/org.sonatype.nexus.cfg进行修改IP、端口, 访问根目录
修改完相关配置文件后,打开命令提示符:cmd,进入/nexus-3.0.1-01/bin目录,命令:
打开浏览器,访问:http://localhost:8081/nexuz-zip/
点击右上角 Sign in,使用默认用户名:admin ,密码:admin123 登录,
maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar
maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。
点击左侧 Repositories 链接,查看 Nexus 内置的仓库:
Nexus 的仓库分类:
· hosted 宿主仓库:主要用于部署无法从公共仓库获取的构件(如 Oracle 的 JDBC 驱动)以及自己或第三方的项目构件;
· proxy 代理仓库:代理公共的远程仓库;
·group 仓库组:Nexus 通过仓库组的概念统一管理多个仓库,这样我们在项目中直接请求仓库组即可请求到仓库组管理的多个仓库。
3.2.4 添加宿主仓库- hosted repository
只是Deployment Policy这个选项,一般Snapshots会配置成允许,而Releases和3rd party会设置为禁止
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其实是一个虚拟的仓库,通过对实体仓库(proxy、hosted)进行聚合,对外暴露一个统一的地址 ,需要将选中的仓库纳入组内才可进行管理
需要在maven文件夹下.m2/settings.xml中新增配置,可以将内部仓库设置成镜像仓库
私服搭建成功,我们就可以配置 Maven 使用私服,以后下载构件、部署构件,都通过私服来管理。
在 settings.xml 文件中,为所有仓库配置一个镜像仓库,镜像仓库的地址即私服的地址:
maven的setting文件中需要配备授权仓库的帐户与访问地址:
Tips:如果为Snapshots 时,需要在发布的项目版本后追加,如果为Release,则不需要追加,即可发布项目-命令:deploy -e
Maven 开 发 规 范相关推荐
- Maven 开 发 规 范
Maven 目 录 1.Maven简介... 4 1.1什么是 Maven?... 4 1.2 Maven 能够帮助我们干什么?... 4 2.Maven深入了解... 5 2.1 M ...
- 在oracle 中编写一个程序,用VC 开 发 基 于ORACLE 数 据 库 应 用 程 序 的 两 种 方 法...
用VC 开 发 基 于ORACLE 数 据 库 应 用 程 序 的 两 种 方 法 北 京 航 空 航 天 大 学 计 算 机 科 学 与 工 程 系 黎 杰 麦 中 凡 ---- 1. 引 言 -- ...
- 最新整理,9月阿里巴巴软测面试题158题(测试技术+开 发及环境搭建类+人力资源+答案解析)建议收藏~
前言 做软件测试工程师,没有人敢小觑 技术的重要性,现在出去面试,无论什么公司,都要跟你扯一扯 你的技术,扯一扯你掌握的知识点,如果啃不下来,很可能就与大厂失之交臂. 9月阿里巴巴面试题笔记答案我已经 ...
- 程 序 测 试 规 范
第一部分 应用程序测试 第一章 界面测试 界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象.而且设计良好的界面能够引导用户自己完成相应的操作,起到向导的作用.同时界 ...
- maven 开发布署
小项目布署:简单说说 1:添加环境变量 1.1)HAIBAO_ENV=development development是指定config目录下面引用哪个文件,比如config目录下面有个名字叫devel ...
- ACE 开 发 环 境 构 建 笔 记
///Windows/ **************构建ACE: 1.下载,解压缩ACE包,设置环境变量PATH包含$ACE_ROOT$/bin 2.设置$ACE_ROOT$/ace/config.h ...
- Maven:你还在手动导包吗?带你了解Maven的前世今生(尚硅谷详细笔记)
文章目录 一.吐槽: 二.为什么要用Maven? 2.1 真的需要吗? 2.2 究竟为什么? 三.什么是Maven? 3.1 Maven 简介 3.2 什么是构建 3.3 构建过程的几个主要环节 3. ...
- Java开发面试题——很有帮助的
面试题 一.Java 1.运行机制 1)Java跨平台原理 Java实现跨平台是JVM(Java虚拟机)起的作用.如果是C/C++的编译方式,一旦换了一个平台,那么就需要重新编译一份对应的可执行代码, ...
- 学生开python语言课程_【免费下载】公开课Python 程序语言入门 教案
公开课: Python 程序语言入门 教学的目的与要求: · 让学生了解什么是编程及对编程提起浓厚的学习兴趣: · Python Shell . GUI 和 Prompt (提示符)的理解: · 学会 ...
最新文章
- MPB:南农成艳芬组-​瘤胃厌氧真菌代谢产物的检测方法
- HDU 2149.Public Sale-巴什博奕
- json为全局变量 vue_vue 设置全局变量、指定请求的 baseurl
- Angular6_服务端渲染SSR
- c++数据结构队列栈尸体_数据结构-第三章:栈和队列(栈的应用、括号匹配、表达式转换)...
- 20145321 《Java程序设计》第4周学习总结
- jQuery Mobile中按钮button的data-*选项
- 几种常见的程序命名规则
- mysql存储脚本实例_Mysql存储过程中游标的用法实例
- C++对象数组的实例学习
- MySQL高级进阶(三)、InnoDB存储引擎详解
- 关于嵌入式Linux做底层还是应用,要掌握什么技能
- 西门子plc电源开关如何选型
- 国仁老猫:新人怎么做好一场直播带货;首先需要明白以下几点即可。
- 手游如何做到不滚服而又能获得良好的收益?
- php项目怎么分工,路德维希·冯·贝塔郎菲 Ludwig von Bertalanffy
- 全民Python时代已经到来
- HDU n^n求最高位
- 基于Cookie-Editor与curl实现跨设备的文件下载
- 初创公司多产品线分红篇