Maven2 总结

Maven:基于java的项目管理工具。——管理项目之间的依赖;管理二进制库;编译、测试、打包、部署(即构建);跨平台;


插件和目标:mvn archetype:generate

生命周期:mvn clean install site

坐标:项目标识、仓库目录

依赖:jar版本(版本冲突——依赖仲裁)


maven所有功能都是使用插件实现,需从特定的地址下载插件包;

两个仓库:本地仓库和远程服务器仓库,第一次运行maven会从远程仓库下载antifact(jar包)和插件到本地仓库中;仓库用于存放artifact;

坐标用来唯一标识一个antifact。坐标由DgroupId、DantifactId、Dversion和Dpackage组成。

maven对于项目目录结构、测试用例命名方式等内容都有既定的规则。


eclipse的maven插件:m2eclipse。eclipse默认是运行在JRE上,m2eclipse的一些功能要求使用JDK。安装m2eclipse时,可能会运到一些错误,解决方法是配置eclipse安装目录的eclipse.ini文件,添加vm配置指向JDK。

%M2_HOME%/conf/下的setting.xml文件(全局)

localRepository:可更改本地仓库地址;

<mirrors>标签下<mirror>:可设置maven远程仓库服务器地址;

maven默认的一个远程仓库:http://repo1.maven.org/maven2

%USER_HOME%/.m2/下的setting.xml文件(用户)

pom.xml文件(当前项目)

dependency:定义依赖;

repositories:定义资源地址,所有的依赖包从此地址下载;

plugin:定义插件;

pluginRepositories:定义插件地址;

packaging:定义此工程将要打包后的类型;

name:定义此工程显示的名字;


1、Maven In Action

(1)设置JAVA_HOME、M2_HOME、PATH环境变量,配置settings.xml文件,修改本地仓库地址。maven版本采用2.2.1.

(2)通过命令行创建maven工程

创建maven的普通java项目:mvn archetype:create -DgroupId=packagename -DartifactId=projectname

创建maven的java web项目:mvn archetype:create -DgroupId=packagename -DartifactId=webprojectname -DarchetypeArtifactId=maven-archetype-webapp

如:mvn archetype:create -DgroupId=org.cendy -DartifactId=demo -Dversion=1.0 -DarchetypeArtifactId=maven-archetype-webapp

(3)切换到目录,运行mvn eclipse:myeclipse。

(4)使用import——existing projects into workspace,导入到myeclipse后,建立目录:src/main/java、src/main/resources、src/test/java、src/test/resources、src/main/webapp。

(5)重新执行mvn eclipse:myeclipse,使用此命令后,将会设置源代码目录和单元测试目录的输出目录。且webapp可以部署到tomcat中进行调试(因为是myeclipse工程)

(6)在pom.xml文件中,添加依赖。

(7)打包:mvn package,若要跳过单元测试:mvn package -Dmaven.skip.test=true。

(8)将打包后的结果安装到本地仓库:mvn install

注:通过Existing Projects into Workspace导入是myeclipse工程(前提是首先执行mvn eclipse:myeclipse命令);而通过Existing Maven Projects导入是maven工程;两者略有不同。若是maven工程,webapp不能直接部署到tomcat中进行调试

maven安装最佳实践

a、设置MAVEN_OPTS环境变量,值为-Xms128m -Xmx512m。Java默认的最大可用内存往往不能满足maven运行的需要。

b、配置用户范围settings.xml。

c、不要使用IDE内嵌的maven

在eclipse中使用外部maven:windows——preferences——maven——installation,点击add,选择maven安装目录M2_HOME,添加完毕后选择这一个外部的maven。

d、设置eclipse M2_REPO classpath变量

preferences——java——build path——class variables——new..... ,设置M2_REPO指向maven的本地仓库。

ps:这一步也可以在preferences——....——maven——user settings中设置setting.xml文件的具体位置;

2、TIPS

(1)安装配置maven

官方首页下载maven,本机中要有JAVA_HOME环境变量,新建M2_HOME环境变量。windows会首先在当前目录中寻找可执行文件或脚本,若没找到,windows会接着遍历环境变量path中定义的路径。

新的环境变量配置需要新的cmd窗口才能生效。

(2)

bin目录:包含mvn运行的脚本。运行mvn命令实际上是执行了java命令。

lib目录:包含maven运行时需要的java类库。maven本身是分模块开发的。

boot目录:只包含一个文件。是一个类加载器框架,maven使用该框架加载自己的类库。

conf目录:修改setting.xml文件,就能在机器上全局地定制maven的行为。

(3)

(4)POM(project object model)

定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等。

modelVersion:指定当前POM模型的版本,对于maven 2及maven 3来说,它只能是4.0.0。

groupId:定义项目属于哪个组,这个组一般和项目所在的组织或公司存在关联。

artifactId:定义了当前maven项目在组中唯一的ID。

version:指定项目当前的版本。

packaging:定义maven项目的打包方式。

name:声明了一个对于用户更为友好的项目名称。

项目主代码会被打包到最终的构件中,测试代码只在运行测试时用到,不会被打包。默认情况下,maven约定项目主代码位于src/main/java目录。默认情况下,maven构建的所有输出都在target/目录中;maven项目中默认的测试代码目录是src/test/java。

maven会自动访问中央仓库http://repo1.maven.org/maven2/,下载需要的文件。


一个典型的单元测试包含三个步骤:

a、准备测试类及数据;

b、执行要测试的方法;

c、检查结果;

所有要执行测试的方法都以test开头。


maven的核心插件之一——compiler插件默认只支持java 1.3,需要在maven-compiler-plugin.pom中配置该插件使其支持Java 5。

pom中没有指定打包类型,默认打包类型为jar。将项目主代码打包到target/输出目录中。

安装是将jar包安装到maven的本地仓库中,这样可以被其它的maven项目引用。

默认打包生成的jar是不能直接运行的,因为带有main方法的类信息不会添加到manifest中。为了生成可执行的jar文件,需要借助maven-shade-plugin。配置好后执行java -jar target\***.jar文件,就可以运行了。


(5)scope依赖范围

maven在编译项目主代码时需要使用一套classpath,在编译和执行测试时使用另一套classpath,实际运行maven项目时又会使用一套classpath。

依赖范围就是用来控制依赖与这三种classpath的关系。


若依赖范围为test,表示该依赖只对测试有效,即该依赖只会被加入到测试代码的classpath中。只对测试classpath有效。

默认值为compile,表示该依赖对主代码和测试代码都有效。对于编译、测试、运行三种classpath都有效。

provided:对于编译和测试classpath有效,但在运行时无效。典型的例子就是servlet-api。

runtime:对于测试和运行classpath有效,但编译主代码时无效。

system:该依赖与三种classpath的关系和provided相同。但是,使用system范围的依赖时必须通过systemPath元素显式指定依赖文件的路径,是本地的、maven仓库之外的类库文件。慎用。


maven会解析各个直接依赖的POM,将必要的间接依赖,以传递性依赖的形式引入到当前的项目中。


不能依赖重复,因此依赖调解第一原则:路径最近者优先;第二原则:第一声明者优先;


GreenMail是开源的邮件服务测试套件,可使用该套件来测试邮件的发送。SMTP表示是接收邮件的服务器。


(6)使用Archetype生成项目骨架

在maven2中,使用mvn archetype:generate命令,因为没有指定archetype插件的版本,maven会自动去下载最新的版本而可能会得到不稳定的snapshot版本。但在maven3中,即使用户没有指定版本,maven也只会解析最新的稳定版本。

若是maven2,最好使用mvn org.apche.maven.plugins:maven-archetype-plugin:2.0-alpha-5:generate。


(7)m2eclipse简单使用

Mylyn:任务管理框架。


导入maven项目:略;

Materialize Maven Projects能让用户导入第三方的maven项目。


创建maven项目:

在弹出的New Maven Project对话框中,使用默认的选项,不要选择create a simple project选项,这样就能使用maven archetype。可以选择maven-archetype-quickstart。

有四个Archetype Catalog可供选择,一般来说,只需要选择Internal,然后选择maven-archetype-quickstart。


运行mvn命令:

在maven项目或pom.xml上右击,选择run as,就能看见常用的maven命令。可选择maven build以自定义maven运行命令。


添加maven依赖的一般做法是:先搜索得到依赖的坐标,然后配置项目的pom.xml文件。

添加依赖:

在项目上或pom.xml上右击,选择maven,再选择add dependency添加依赖。在弹出的对话框中,只需要输入关键字。

添加依赖后,若m2eclipse没有自动将依赖更新至项目的构建路径,用户可以强制m2eclipse更新,即在项目或pom.xml上右击,选择maven,再选择update dependencies。


maven有一个Effective POM的概念,表示一个合并整个继承结构所有信息的POM。在m2eclipse的POM编辑器中,有专门的Effective POM,由于这是一个由其它POM合并而来的文件,因此无法直接进行修改。


m2eclipse能自动下载并使用依赖的源码包。该功能的前提是依赖提交了相应的源码包到maven仓库。

在项目上或pom.xml上右击,选择maven,选择download sources让m2eclipse为当前项目的依赖下载源码包。


(8)maven依赖最佳实践

a、排除传递性依赖:exclusion,而直接引用此传递性依赖;

b、归类依赖:好处是只需要修改一处,避免重复;

c、优化依赖

查看当前项目的已解析依赖:mvn dependency:list

查看当前项目的依赖树:mvn dependency:tree

mvn dependency:analyze分析当前项目的依赖。只会分析编译主代码和测试代码需要用到的依赖,运行时需要的依赖它发现不了。


(9)仓库

在maven中,任何一个依赖插件项目构建的输出,都可称为构件

通过仓库可以统一存储所有maven项目共享的构件,实际的maven项目不再各自存储其依赖文件,只需要声明这些依赖的坐标,在需要时,maven会自动根据坐标找到仓库中的构件并使用(将依赖加入到classpath中)。


仓库分为本地仓库和远程仓库。首先会查看本地仓库,然后去远程仓库查找。

中央仓库是maven核心自带的远程仓库,在默认配置下,当本地仓库没有时,会从中央仓库下载。(http://repo1.maven.org/maven2)

私服是另一种特殊的远程仓库,是在局域网内架设的一个私有仓库服务器,用其代理所有外部的远程仓库。当maven需要下载构件时,会请求私服,若私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为maven的下载请求提供服务。

还有很多其它公开的远程仓库,如Java.net:http://download.java.net/maven/2/和JBoss:http://repository.jboss.com/maven2/等。


建立私服是用好maven关键的一步。最流行的maven私服软件:Nexus。


任何一个仓库声明的id必须是唯一的;当构件被部署到maven仓库中时,会同时部署对应的校验和文件。


在setting.xml中,servers元素及其server子元素配置仓库认证信息,这里关键是id元素,setting.xml中server元素的id必须与pom中需要认证的repository元素id完全一致。因为正是这个id将认证信息与仓库配置联系在一起。


部署至私服(远程仓库):pom.xml文件中配置distributionManagement元素。无论从远程仓库下载构件,还是部署构件至远程仓库,需要认证时,配置的方式相同。执行mvndeploy命令。


快照版本是不稳定的。当依赖版本为快照版本,maven会自动找到最新的快照


maven通过合并多个远程仓库及本地仓库的元数据maven-metadata.xml,就能计算出基于所有仓库的latest和release分别是什么,然后再解析具体的构件


(10)镜像

任何一个可以从仓库获得的构件,都能够从它的镜像中获取。通过mirror元素实现,其中mirrorOf若值为central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像。一般配置使用私服作为镜像。mirrorOf若值为*,表示该配置是所有maven仓库的镜像,任何对于远程仓库的请求都会转至该镜像。


(11)仓库搜索服务:根据关键字得到maven坐标。

a、Sonatype Nexus:地址是:http://repository.sonatype.org/

Nexus是开源maven仓库管理软件,Nexus提供关键字搜索、类名搜索、坐标搜索、校验和搜索等功能。搜索后,页面会列出构件的坐标及所属仓库。

b、Jarvana

c、MVNbrowser

d、MVNrepository


(12)

maven的生命周期就是为了对所有的构建过程进行抽象和统一。这个生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤。

maven的生命周期是抽象的,即生命周期本身不做任何实际的工作,实际的任务都交由插件完成。生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务。

maven拥有三套相互独立的生命周期,分别为clean、default和site。clean生命周期的目的是清理项目,default生命周期的目的是构建项目,site生命周期的目的是建立项目站点。这三套生命周期本身相互独立的。


自定义绑定插件目标:即自定义插件目标,然后将其与生命周期绑定。


获取插件信息:基本上所有的主要maven插件都来自Apache和Codehaus

一般通过阅读文档中的使用介绍和实例,就能在自己的项目中很好使用该插件。


maven是区别对待依赖的远程仓库和插件的远程仓库。


插件仓库元数据:可以剖析maven内部的插件解析机制;


(13)使用Nexus创建私服

Nexus是Java web应用。有两种安装包:一种是包含Jetty容器的Bundle包,一种是不包含web容器的war包。

Nexus默认管理员用户名和密码为admin/admin123.

Nexus包含了四种类型的仓库:group(仓库组)、hosted(宿主)、proxy(代理)和virtual(虚拟)


maven可以直接从宿主仓库下载构件,也可以从代理仓库下载,代理仓库会从远程仓库下载并缓存构件。为了方便,可以从仓库组下载构件,仓库组没有实际内容,它会转向其包含的宿主仓库或代理仓库获得实际构件。


创建宿主仓库:点击左边Repositories链接,选择add,选择hosted repository。

创建代理仓库:最重要的远程仓库的地址。

创建仓库组:仓库组所包含的仓库的顺序决定了仓库组遍历其所含仓库的次序。

有了远程仓库的索引,即使没有缓存远程仓库的构件,用户还是能在本地搜索和浏览构件的基本信息。


配置maven从Nexus下载构件:

setting.xml不支持直接配置repositories和pluginRepositories。但能让用户将仓库配置放到setting.xml中的Profile中。同时配置中使用activeProfile元素将nexus这个profile激活。此外,创建一个匹配任何仓库的镜像,镜像的地址为私服,这样,maven对任何仓库的构件下载请求都会转到私服中。


使用maven部署构件至Nexus的宿主仓库:

为了能部署构件,还需要在settings.xml中配置认证信息。


手动部署第三方构件至Nexus的宿主仓库:


Nexus是基于权限做访问控制的,每一个资源都有相应的权限来控制,用户执行特定的操作必须拥有必要的权限。管理员以角色的方式将权限赋予用户。


为项目分配独立的仓库:


(14)使用Hudson进行持续集成

持续集成要使用版本控制工具和持续集成服务器。Hudson是开源持续集成服务器软件。


持续集成就是快速且高频率地自动构建项目的所有源码,为项目成员提供反馈信息。


在本地运行构建并确认无误后,将更改提交到代码库。持续集成服务器每隔39分钟查询代码库一次,发现更新后,签出所有最新源代码,然后调用自动化构建工具(maven)构建项目,包括编译、测试、打包、部署等。


安装Hudson:

Hudson必须运行在JRE1.5或更高版本上。官网下载最新安装包,下载完成后得到hudson.war文件。

启动Hudson:在命令行直接运行hudson.war,即java -jar hudson.war。

待启动完成后,打开浏览器http://localhost:8080/访问。停止Hudson,命令行按下ctrl+c。

可以使用 - -httpPort指定Hudson运行端口,即java -jar hudson.war - - httpPort = 8082.

当然也可以将hudson.war部署到web容器中。


对于windows,可以安装Slik Subversion。选择安装类型时,要选择complete,否则默认的安装方式不会安装svnserve。

创建Subversion仓库:svnadmin create svn-repos \ aacount,此仓库为svn-repos。

然后将源码导入到仓库中。

启动svnserve服务:svnserve -d -r svn-repos - -listen -host 0.0.0.0

Subversion仓库用户权限配置:略。


Hudson系统设置:

a、配置JDK安装位置和maven安装位置,不要自动安装即Install automatically:


创建Hudson任务:配置任务的源码仓库、配置任务的构建触发、任务的构建配置等。


Hudson默认主页显示了当前服务器上所有集成任务的状态。

Hudson使用各种颜色表示任务当前状态:

蓝色:任务最近一次构建成功;

红色:任务最近一次的构建失败。

黄色:任务最近一次的构建成功了,但不稳定(有失败的测试)。

灰色:任务从未被执行过或被禁用了。


maven-surefire-plugin会在项目的target/surefire-reports目录下生成与Junit兼容的XML格式的测试报告。


默认情况下,Hudson使用用户目录下得.hudson/目录作为其工作目录。自定义工作目录:需设置HUDSON_HOME环境变量。

使用Hudson时应按照实际情况为其分配足够的磁盘空间,同时合理抛弃旧的构建记录。


(15)使用maven构建web应用

classes和lib目录在运行时被加入到classpath中。

必须为web项目显示指定打包方式为war。

web项目的类和资源文件默认位置是src/main/java和src/main/resources。测试类及测试资源文件的默认位置是src/test/java/和src/test/resources。还有一个web目录,默认位置是src/main/webapp/。

在src/main/webapp/目录下,必须包含一个子目录WEB-INF,该子目录必须要包含web.xml文件。


在web项目中,有一个finalName元素,该元素用来标识项目生成的主构件的名称,如<finalName>account</finalName>,此配置后,项目生成的war包名称变为account.war。


使用Cargo实现自动化部署:

Cargo是帮助用户实现web自动化部署的工具。它支持大部分的web容器。Cargo通过cargo-maven2-plugin提供maven集成,maven用户可使用该插件将web项目部署到web容器中。


部署至本地web容器

cargo-maven2-plugin的groupId是org.codehaus.cargo,它不属于官方的两个maven插件groupId,因此用户需要将其添加到settings.xml的pluginGroup元素中以方便命令行调用。只有这样,才能运行mvn cargo:start命令。

要将应用直接部署到现有的web容器中,需要配置Cargo使用existing模式。基于配置,然后运行mvn cargo:start,就能够看到在Tomcat的webapps子目录看到被部署的maven项目。


部署至远程web容器:

前提是拥有该容器的相应管理员权限。查阅Cargo文档。

有了配置后,运行mvn cargo:redeploy,就可以让Cargo部署应用了。若容器中已经部署了当前应用,Cargo会先卸载,然后重新部署。


可以使用jetty-maven-plugin来通过使用热部署实现快速的开发和测试。


(16)编写maven插件及编写Archetype


(17)灵活的构建:能让项目在不同的环境下都能成功构建。

典型的项目都会有开发环境、测试环境和产品环境。

Maven提供了属性、资源过滤以及profile三大特性来支持构建的灵活性。

maven属性:

在pom.xml中,<properties>元素下自定义maven属性。如:

<project>

<properties>

<my.prop>hello</my.prop>

</properties>

</project>

这样在pom.xml中其他地方使用${my.prop}时会被替换成hello。

maven用户可以在POM和资源文件中使用maven属性表示可能变化的量,通过不同的profile中的属性值和资源过滤特性为不同环境执行不同的构建。

在资源目录如src/main/resources中,在配置文件中将数据库配置的变化部分提取为maven属性,如:

database.jdbc.driverClass=${db.driver}

然后在pom文件的profile中定义这些属性的值,如

<project>

<profiles>

<profile>

<id></id>

<properties>

<db.driver>com.mysql.jdbc.Driver</db.driver>

</properties>

</profile>

</profiles>

</project>

,并且为资源目录开启属性过滤,即

<project>

<build>

<resources>

<resource>

<directory>src/main/resources</directory>

<filtering>true</filtering>

</resource>

</resources>

</build>

</project>

,最后只需要在命令行激活profile,maven就能在构建项目时使用profile中属性值替换数据库配置文件中的属性引用。如:

mvn clean install -Pdev,-P表示在命令行激活一个profile,这里激活了id为dev的profile。构建完成后,输出目录中的数据库配置就是开发环境的配置了。

maven属性默认只有在pom中才会被解析。因此需要让maven插件解析资源文件中的maven属性,即需要开启资源过滤。

资源文件位于src/main/resources/目录下,编译打包后位于WEB-INF/classes目录下。还有web资源文件,源码位于src/main/webapp/目录,经打包后位于WAR包的根目录。

web项目中要区分一般资源文件和web资源文件(如图片、css等),前者会在classpath中,通过maven-resources-plugin处理;后者不在classpath中,通过maven-war-plugin处理。


3、PS:

(1)设置HTTP代理

若是通过代理才能访问因特网,此时需要为maven配置HTTP代理,才能让它正常访问外部仓库。

在settings.xml中,添加:

<proxies>

<proxy>

.....

</proxy>

</proxies>



(2)手动安装jar包到本地仓库

如将本地D:\javacsv.jar包导入到本地maven仓库中:

mvn install:install-file -Dfile=D:\javacsv.jar -DgroupId=org.cendy -DartifactId=javacsv -Dversion=2.0 -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true

(2)下载当前项目依赖的源代码jar包并关联(默认安装在本地仓库)

a、mvn dependency:sources -DdownloadSources=true -DdownloadJavadocs=true或

mvn -DdownloadSources=true -DdownloadJavadocs=true eclipse:eclipse

b、若用m2eclipse插件,preferences——Maven,勾选“Download Artifact Sources”。重启eclipse,构建工程时,就会下载依赖的源码jar。

(3)mvn命令

mvn compile:编译源代码;

mvn test-compile:编译测试代码;

mvn test:运行测试用例;

mvn clean:清除产生的项目;

mvn eclipse:eclipse:生成eclipse项目;

mvn eclipse:myeclipse:生成myeclipse项目;

mvn install:install the package into the local repository;

mvn deploy:部署至私服;


(4)管理项目之间的依赖

5、Q&A

(1)为什么在私服中存在的某个版本的依赖,而Eclipse项目中引用该依赖不成功,报”miss ***.jar”错误?
在当前工程目录下运行”mvn eclipse:eclipse”,然后在Eclipse下刷新该工程。

(2)怎样在公共Maven仓库中寻找依赖?
可以使用下列搜索引擎:
http://repository.apache.org
http://www.artifact-repository.org
http://mvnrepository.com
http://www.mvnbrowser.com
http://www.jarvana.com
http://mavensearch.net

(3)Mojo是什么?
Mojo是Maven中一个普通的持久化对象。每一个Mojo都是Maven中的一个执行目标,一个插件一般包含一个或者多个相关的Mojo。

(4)配置仓库

要求项目的每个开发者必须在conf目录中配置存储库是不方便的,所以Maven可以同时查看多个存储库并且将它们全部配置在pom.xml文件中。让我们看看一个例子,它展示了如何在应用程序用使用多个存储库。在以下从pom.xml文件摘录的片断中,我们设置了两个存储库来让Maven寻找依赖项。 Ibiblio一直是默认的存储库,我们又添加了Planet Mirror作为后援存储库。我们也可以让团队使用的本地web服务器作为第二个存储库。

<repositories>
<repository>
<id>Ibiblio</id>
<name>Ibiblio</name>
<url>http://www.ibiblio.org/maven/</url>
</repository>
<repository>
<id>PlanetMirror</id>
<name>Planet Mirror</name>
<url>http://public.planetmirror.com/pub/maven/</url>
</repository>
</repositories>

(5)验证码图片

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值