搭建 Nexus2.7.2-03 Maven3.1.1 JAVA Project 管理 第一节:Nexus 研究汇总 1 Nexus 概念、作用 仓库管理器有两个服务目的:首先它的角色是一个高度可配置的介于你的组织与公开Maven仓库之间的代理,其次它为你的组织提供了一个可部署你组织内部生成 的构件
搭建 Nexus2.7.2-03 + Maven3.1.1 JAVA Project 管理
第一节:Nexus 研究汇总
1 Nexus 概念、作用
仓库管理器有两个服务目的:首先它的角色是一个高度可配置的介于你的组织与公开Maven仓库之间的代理,其次它为你的组织提供了一个可部署你组织内部生成
的构件的地方。代理Maven仓库有很多好处。对于一开始使用Maven的情况来说,通过为所有的来自中央Maven仓库的构件安装一个本地的缓存,你将加速组织内部的
所有构建.
2 Nexus 安装
1):官方下载http://www.sonatype.org/nexus/ 安装包,包下载分二种1:含有JETTY WEB容器的BUNDLE包 2:不含WEB容器的WAR包
2):解压,以当前根目录D:\ThridFarme为例:
打开:${NEXUS_HOME}\bin\jsw\windows-x86-64,依次运行install-nexus.bat、start-nexus.bat,运行nexus
官网说明: Open Nexus Professional in a Web Browser,ifyou accept all of the defaults, Nexus Professional can be accessed by pointingyour browser at http://localhost:8081/nexus and entering in the following trialcredentials:
username: admin password: admin123
3 Nexus 管理操作
即http://localhost:8081/nexus管理,暂缺
第二节:Maven3 研究汇总
1 Maven3 概念、作用
Maven3概念:
Maven是基于项目对象模型(POM),通过一小段描述信息来管理项目的构建,也是报告和文档的软件项目管理工具; 它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(DependencyManagement System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。使用Maven时,用一个明确定义的项目对象模型来描述你的项目,Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
Maven 有一个项目生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的目标步骤,直到到达你指定的生命周期,过程中Maven会运行许多默认的插件目标,像编译compile和创建JAR(jar) 文件类似工作。
Maven3作用:
Maven能够很方便管理项目的构建、项目报告、生成站点、管理JAR文件等等。
MAVEN概念模型:
图1
POM简介:包含了四类描述和配置项目
1) POM关系:一个项目很少孤立存在;它会依赖于其它项目,可能从父项目继承POM设置,它要定义自身的坐标,可能还会包含子模块。
2)构建设置:在这一部分,我们自定义Maven构建的默认行为。我们可以更改源码和测试代码的位置,可以添加新的插件,可以将插件目标绑定到生命周期,我们还可以自定
义站点生成参数。
3)总体信息:它包含了一个项目的而名称,项目的URL,发起组织,以及项目的开发者
贡献者列表和许可证。
4)构建环境:构建环境包含了一些能在不同使用环境中 激活的profile。例如,在开发过程中你可能会想要将应用部署到一个而开发服务器上,而在产品环境中你会需要将
应用部署到产品服务器上。构建环境为特定的环境定制了构建设置,通常它还会
由~/.m2中的自定义settings.xml补充。
图2
2 Maven3 核心流程
2.1maven管理的目标:工程(Software Project)
图3
软件工程的唯一标识是由团体标识的约定ID(groupId)、单独项目的唯一标识符(artifactId)、版本(version) 共同决定;
PackageType:每个工程都有一个打包类型,可以是jar, war, ear 或 pom,打包类型决定工程最终产物的类型,其中pom类型用于构件多模块工程。
工程之间有两种关系:依赖(dependency)和聚合()
依赖:是类与类之间的连接. 表示一个类依赖于另一个类的定义. 依赖关系总是单向的 。可以简单的理解,就是一个类A使用到了另一个类B
图4
关联(association)关系: 表示类与类之间的联接, 体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,它使一个类知道另一个类的属性和方法. 关联可以使用单箭头表示单向关联, 使用双箭头或不使用箭头表示双向关联, 关联有两个端点, 在每个端点可以有一个基数, 表示这个关联的类可以有几个实例. 常见的基数(0..1:0、0..*、1、1..*)
图5
聚合: 关联关系的一种特例, 是强的关联关系. 聚合是整体和个体之间的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;
图6
图7
(2)maven可以指定依赖的作用范围(scope),包括以下几种:
图8
compile范围(默认):编译范围依赖,在编译,测试和运行中都依赖于类包,在所有的classpath中可用,同时它们也会被打包。
test范围: JUnit测试范围(test)的依赖,运行compiler:testCompile和surefire:test目标的时候才会将POM依赖JAR包被加入classpath中
provided范围:已提供范围依赖,开发过程只有在编译(classpath)和测试时需要一个类库,而该类库在运行的时候由容器提供,它们不是传递性的,也不会被打包,不会被捆绑在构建的输出中,可用于排除WAR文件中特定的依赖。如Servlet API的JAR文件包不会在web应用WEB-INF/lib目录下生成。
Runtime:运行时范围依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC驱动实现。
system(系统范围):system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个systemPath元素。
(不推荐使用的,应该尽量从公共或定制的Maven仓库中引用依赖)。
Maven如何解决依赖关系的传递性可能导致依赖的版本、scope等发生冲突问题? maven提供了仲裁机制(最短路径原则、依赖的排除 、依赖的显示声明)。
查看项目依赖关系树:mvn dependency:tree
前面提到pom类型用于于构件多模块工程,这体现了project之间的一种聚合关系:将一系列小的模块聚合成整个产品。
通过聚合后的工程可以同时管理每个相关模块的构建、清理、文档等工作。 聚合关系通过在子工程中指定一个pom类型的project作为父project来定义。
图9
图10
maven将工程(Project)的构建过程理解为不同的生命周期(LifeCycle)和阶段(Phase)。 在工程的构建过程中,存在着不同的生命周期,这些生命周期互相独立,之间也没有一定的顺序关系。 每个生命周期又划分为不同的阶段(Phase)。阶段之间有明确的顺序关系, 同一生命周期内的阶段必须按顺序依次执行。
maven内置了三个生命周期,并为每个生命周期内置了一些阶段。下面列举出maven内置的生命周期及主要的阶段:
图11
· default:构建(Build)
1. validate:验证项目是否正确,所有必需的信息是否可用。
2. compile:编译项目中的代码。
3. test:用相关的单元测试框架测试编译后的代码,这些运行的测试并不会随项目打包和布署。
4. package:将编译后的代码打包成相应的格式文件,如jar包。
5. integration-test: 如果需要在一个综合环境中运行我们的测试,这个阶段将会运行和布署项目到该环境中。
6. verify: 检查项目的包是否正确和符合要求。
7. install:将包安装到本地maven仓库,可以让其他项目作为依赖使用该包。
8. deploy:将包发布到远程的maven仓库,并提供给其他开发者使用。
· clean:清理
1. pre-clean 准备清理
2. clean 执行清理工作
3. post-clean 执行清理后的后续工作
· site:生成项目文档和站点
1. pre-site 准备生成
2. site 生成项目站点和文档
3. post-site 执行生成文档后的后续工作
4. site-deploy 发布项目文档
更详细的phase说明参考: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference
再者像mvn package:此命令行并没有指定一个插件目标,而是指定了一个Maven生命周期阶段。阶段是在被Maven称为“构建生命周期”中的一个个步骤。生命周期是包含在一个项目构建中的一系列有序的阶段。
图12
图13
Maven中定义的工程周期和阶段只是抽象的概念,不涉及具体的功能。 具体的功能由插件(Plugin)实现。一个Maven插件是一个单个或者多个目标(Goal)的集合。Maven有一些简单但核心的插件,像Jar插件,它包含了一组创建JAR文件的目标,Compiler插件,它包含了一组编译源代码和测试代码的目标,或者Surefire插件,它包含一组运行单元测试和生成测试报告的目标。而其它的,更有专门的插件包括:Hibernate3插件,用来集成流行的持久化框架Hibernate。Maven也提供了自定义插件的能力。
图14
为了解耦插件的功能和工程阶段,实现高度的可配置性,maven规定插件只是实现目标的功能, 通过配置来决定在哪个阶段执行(Execution)哪些目标操作。 甚至可以把一个Goal绑定到多个Phase,以实现复用。
maven内置了一些默认的插件,并根据不同的工程packing类型在各个phase中默认绑定了一些goal。 下表中列出default生命周期中各阶段默认绑定的goal,其中goal按照管理使用plugin name:goalname的方式标记:
图15
Site:
最后需要说明的是,maven的插件是一种packaging类型为maven-plugin的project, 可以使用maven project的依赖,配置插件等等一切特性。
Maven仓库是通过结构来定义的,一个Maven仓库是项目构件的一个集合,这些构件存储在一个目录结构下面,它们的格式能很容易的被Maven所理解。在一个Maven仓库中,所有的东西存储在一个与Maven项目坐标十分匹配的目录结构中。你可以打开浏览器,然后浏览中央Maven仓库http://repo1.maven.org/maven2/ 来看这样的结构。
Maven仓库的标准是按照下面的目录格式来存储构件,相对于仓库的根目录:
/
Maven从远程仓库下载构件和插件到你本机上,存储在你的本地Maven仓库里。一旦
Maven已经从远程仓库下载了一个构件,它将永远不需要再下载一次,因为maven会首
先在本地仓库查找插件,然后才是其它地方。
项目依赖于一些既不免费也不公开的包。在这种情况下,你需要要么在你组织的网络里安装一个定制的仓库,要么手动的安装这些依赖。默认的远程仓库可以被替换,或者增加一个你组织维护的自定义Maven仓库的引用。
仓库可以分为本地库(local)和远程库(remote)。本地库通常位于本机的~/.m2/repository文件夹, 远程库最常见的是maven中央库,此外也会有一些私服库用于企业内部。
图16
概念 |
说明 |
LifeCycle |
生命周期,maven内置default,sie,clean三个生命周期 |
Phase |
阶段,每个生命周期有不同的阶段 |
Plugin |
插件,实现实际的构建功能 |
Goal |
一个插件可以实现多个goal,goal具备具体的功能 |
Execution |
通过配置,决定在某个Phase执行哪些Goal |
Project |
maven管理的目标:软件工程,小的工程可以聚合成大工程 |
PackageType |
为了便于管理工程,按照构建目标区分成不同的工程类型,如jar,war,ear等 |
Dependency |
依赖,project之间存在依赖关系 |
DependencyScope |
maven对依赖定义了不同的作用范围 |
Management |
可以配置一个工程如何管理依赖关系 |
Repository |
仓库,存放包,分为本地库和远程库 |
Build |
构建的动作。使用maven管理工程,主要是指定将project构建到某个phase |
见:http://blog.csdn.net/jun55xiu/article/category/1439861
验证安装:mvn -version
1)创建一个Project
mvn archetype:create -DgroupId=com.mycompany.app
-DartifactId=my-app-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
mvn archetype:generate 固定格式OR create
-DgroupId 组织标识(包名)
-DartifactId项目名称
-DarchetypeArtifactId 原型ArchetypeId:maven-archetype-quickstart,创建一个JavaProject;maven-archetype-webapp,创建一个WebProject
-DinteractiveMode 是否使用交互模式
2)命令
编译源代码 mvn compile
编译测试代码mvn test-compile
清空mvn clean
运行测试 mvn test
生产站点目录并打包 mvn site-deploy
安装当前工程的输出文件到本地仓库 mvn install
打包 mvn package
先清除再打包mvn clean package
打成jar包mvn jar:jar
生成eclipse项目mvneclipse:eclipse
查看帮助信息mvn help:help
查看maven有哪些项目类型分类 mvn archetype:create -DarchetypeCatalog=intrenal
3)构建一个简单Java项目
mvn archetype:create -DgroupId=cn.luxh.app-DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart-DinteractiveMode=false
4)构建一个简单JAVA WEB项目
mvn archetype:create -DgroupId=cn.luxh.app -DartifactId=my-web-app -DarchetypeArtifactId=maven-archetype-webapp -DinteractivMode=false
回车
cd :/%roo%/my-web-app/,执行:mvn package
构建成功后,my-web-app项目target目录/my-web-app.war
集成tomcat、Jetty发布运行,需要配置pom.xml
Tomcat:
my-web-app
org.codehaus.mojo
tomcat-maven-plugin
1.1
8080
UTF-8
http://192.168.0.95:8080/manager/html
tomcat6
Jetty:
my-web-app
org.mortbay.jetty
maven-jetty-plugin
执行:mvn tomcat:run jetty:run 就可以在8080端口上访问应用
5)标准的Maven JAVA项目生成框架
6)Maven的默认设置
在某个项目基础目录执行命令:$ mvn help:effective-pom
见‘Maven Dafalut pom.xml’
7)Maven 齐全POM配置文件要素说明
见‘maven_POM.xml详解’
见‘搭建Maven私服_并配置Nexus环境(完美版本).pdf’
后期完善
注:maven个人推荐书籍:Maven权威指南(中文版)以及官网(mvnex、mvnref英文版)