开始mvn.docx
《开始mvn.docx》由会员分享,可在线阅读,更多相关《开始mvn.docx(23页珍藏版)》请在冰豆网上搜索。
开始mvn
如何构建MVN工作环境
1.构建mvn仓库
Maven仓库------就是放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源。
此外,由于Maven仓库中所有的JAR都有其自己的坐标,该坐标告诉Maven它的组ID,构件ID,版本,打包方式等等,因此Maven项目可以方便的进行依赖版本管理。
你也不在需要提交JAR文件到SCM仓库中,你可以建立一个组织层次的Maven仓库,供所有成员使用。
本地仓库vs.远程仓库
本地仓库:
运行Maven的时候,Maven所需要的任何构件都是直接从本地仓库获取的。
如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
Maven缺省的本地仓库地址为${user.home}/.m2/repository 。
也就是说,一个用户会对应的拥有一个本地仓库。
修改本地仓库有这么几种方式
1.可以自定义本地仓库的位置,修改${user.home}/.m2/settings.xml :
如:
D:
\java\repository
2.在运行时指定本地仓库位置:
mvncleaninstall-Dmaven.repo.local=/home/juven/myrepo/
Maven中央仓库:
安装好Maven之后,我们可以建立一个简单的项目,配置一些简单的依赖,然后运行mvncleaninstall,项目就构建好了。
我们没有手工的去下载任何jar文件,这一切都是因为Maven中央仓库的存在,当Maven在本地仓库找不到需要的jar文件时,它会查找远程仓库,而一个原始的Maven安装就自带了一个远程仓库——Maven中央仓库。
超级POM:
我可以找到这个文件:
${M2_HOME}/lib/maven-2.0.10-uber.jar ,打开该文件,能找到超级POM:
\org\apache\maven\project\pom-4.0.0.xml ,它是所有MavenPOM的父POM,所有Maven项目继承该配置,你可以在这个POM中发现如下配置
1.安装mvn
首先从apachemaven下载
http:
//maven.apache.org/download.html
如果是window系统,设置环境变量
假设:
C:
\Users\tobrien>setM2_HOME=D:
\Java\apache-maven-3.0.4
C:
\Users\tobrien>setPATH=%PATH%;%M2_HOME%\bin
安装后,运行cmd,输入mvn–v来验证安装是否成功
输入mvnhelp:
system会打印系统环境以及下载maven-help-plugin包括pom文件和jar,在用户目录下能找到.m文件
比如我的C:
\Users\dell\.m2
里面maven所有的构件都存放在该仓库里面。
Settings.xml:
该文件是一些配置文件,比如http代理信息,你可以在
$M2_HOME/conf/settings.xml(全局的)找到,然后复制到C:
\Users\dell\.m2(当前用户范围的)中。
2.安装仓库
对很多公司来说,jar这类的依赖不可能直接从中央仓库获取,公司内部需要自己构建仓库。
一些流行且免费的Maven仓库工具有:
标准Maven代理codehaus—— http:
//maven-proxy.codehaus.org/
DeadsimpleMavenProxy(DSMP)- http:
//www.pdark.de/dsmp/
Proximity- http:
//proximity.abstracthorizon.org/
Artifactory- http:
//www.jfrog.org/sites/artifactory/latest/
还有一个Nexus(有免费的版本)
http:
//www.sonatype.org/nexus/archived
Nexus安装:
(下载OOS版本)
A.以管理员身份运行bat文件,并安装成windowsservice
默认访问地址;
http:
//localhost:
8081/nexus
用户名+密码:
B.配置
点击Repositories,右边显示的列表中有个type类型,值有group,hosted,proxy,virtual;这里我们不关心virtual,只介绍下另外三种类型:
hosted:
本地仓库,通常我们会部署自己的构件到这一类型的仓库。
proxy:
代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。
group:
仓库组,用来合并多个hosted/proxy仓库,通常我们配置maven依赖仓库组。
(1)创建本地仓库(hosted):
Nexus预定义了3个本地仓库,分别为Releases,Snapshots,和3rdParty。
这三个仓库都有各自明确的目的。
Releases用于部署我们自己的release构件。
Snapshots用于部署我们自己的snapshot构件。
3rdParty用于部署第三方构件,有些构件如Oracle的JDBC驱动,我们不能从公共仓库下载到,我们就需要将其部署到自己的仓库中。
目前我们先创建EpRelease和EpSnapshots两个库,其中EpRelease是正式发布的库;而EpSnapshots是不稳定版本发布的库
(2)Central库为中央仓库,默认DownloadRemoteIndexes是false,如果需要更新需要打开。
Maven默认链接到中央仓库,这里我们通过在setting.xml上面配置使maven连接到本地仓库Nexus中。
配置片段:
(3)部署构件至Nexus
Nexus提供了两种方式来部署构件,你可以从UI直接上传,也可以配置Maven部署构件:
通过NexusUI部署:
有时候有个jar文件你无法从公共Maven仓库找到,但是你能从其它得到这个jar文件(甚至是POM),那么完全可以将这个文件部署到Nexus中.
点击左边导航栏的"Repository",在右边的仓库列表中选择一个仓库,如“3rdParty”,然后会看到页面下方有四个tab,选择最后一个“Upload”,你会看到构件上传界面。
选择你要上传的构件,并指定POM,(或者手工编写GAV等信息),最后点击Upload,该构件就直接被部署到了Nexus的"3rdParty"仓库中。
通过Maven部署:
如果将自己开发的模板放入Nexus,让其他人自由地通过POM来获取?
可以通过Maven部署,下面以casClient为例
1.编写POM
POM(projectObjectModel项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等。
坐标:
在Mvn世界中有大量的构件,mvn通过坐标元素groupid,artifactId,version,packaging,classifier来确定当前的唯一构件,比如当需要使用Java5平台上TestNG的5.8版本时,就可以告诉Maven:
”groupId=org.testng;artifactId=testing;version=5.8;classifier=jdk15”
他主要要素有groupid,artifactid 和version三个,这三个要素定义了一个项目基本的坐标。
Groupid:
定义了项目属于哪个组,这个组往往和项目所在的组织或者公司存在关联
Artifactid:
定义了当前Maven项目在组中的唯一ID
Version:
指定当前版本
另外:
Packaging:
该元素定义Maven项目的打包方式,默认为jar方式
Classifier:
用来帮助定义构建输出的一些附属构件,通常需要相应的插件来配合完成。
备注:
默认情况下,Maven假设项目的主代码位于src/main/java目录;测试代码默认目录是src/test/java
2.目前casClient已经有了现成的build.xml,我们需要编写pom文件来调用,pom文件放在根目录下,这里晒一晒该xml:
xmlversion="1.0"encoding="UTF-8"?
>
//maven.apache.org/POM/4.0.0"xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="http:
//maven.apache.org/POM/4.0.0http:
//maven.apache.org/maven-v4_0_0.xsd">
4.0.0
ep-cas-client
ep-cas
1.0
compile
org.apache.maven.plugins
maven-antrun-plugin
compile
compile
run
此外,需要在build.xml文件中添加
否则会出现错误。
最后指向mvn能和ant命令一样,成功打包casClient.jar
如果需要部署到Nexus需要做两件事
第一步:
配置地址:
需要在POM上添加
EpRelease
EPRelease
http:
//localhost:
8081/nexus/content/repositories/EpRelease/
EPSnapshots
EPSnapshots
http:
//localhost:
8081/nexus/content/repositories/EPSnapshots/
第二步:
加上论证,需要在setting.xml文件上加上
EpRelease
admin
admin123
EPSnapshots
admin
admin123
然后执行mvndeploy,执行成功后,刷新Nexus会发现BrowseIndex已经存在了CasClient,如图:
(后来发现打的jar是空的,最后还是简单把这个client改成maven结构)
至此,我们的jar能够放入Nexus中。
(4)从Nexus获取jar:
下面我以easyUi框架为例子来,来构建相应的MVN项目。
A.前面EesyUI的是用ant目录构建的,那么我们需要先用mvn的archetype来生成一个mvn的项目骨架。
如果是Maven3,执行mvnarchetype:
generate
如果是Maven2,最好执行mvnorg.apache.maven.plugins:
maven-archetype-plugin:
2.0-alpha-5:
generate
执行mvnarchetype:
generate
可以看到系统会列出所有的archetype的插件,
[INFO]GeneratingprojectinInteractivemode
[INFO]Noarchetypedefined.Usingmaven-archetype-quickstart(org.apache.maven.archetypes:
maven-archetype-quickstart:
1.0)
Choosearchetype:
1:
remote->com.agilejava.docbkx:
docbkx-quickstart-archetype(-)
2:
remote->com.alibaba.citrus.sample:
archetype-webx-quickstart(-)
3:
remote->com.cedarsoft.open.archetype:
multi(-)
4:
remote->com.cedarsoft.open.archetype:
simple(-)
…….
182:
remote->org.apache.maven.archetypes:
maven-archetype-archetype(Anarchetypewhichcontainsasamplearchetype.)
183:
remote->org.apache.maven.archetypes:
maven-archetype-j2ee-simple(AnarchetypewhichcontainsasimplifedsampleJ2EEapplication.)
184:
remote->org.apache.maven.archetypes:
maven-archetype-marmalade-mojo(-)
185:
remote->org.apache.maven.archetypes:
maven-archetype-mojo(AnarchetypewhichcontainsasampleasampleMavenplugin.)
186:
remote->org.apache.maven.archetypes:
maven-archetype-plugin(AnarchetypewhichcontainsasampleMavenplugin.)
187:
remote->org.apache.maven.archetypes:
maven-archetype-plugin-site(AnarchetypewhichcontainsasampleMavenpluginsite.Thisarchetypecanbelayereduponan
existingMavenpluginproject.)
188:
remote->org.apache.maven.archetypes:
maven-archetype-portlet(AnarchetypewhichcontainsasampleJSR-268Portlet.)
189:
remote->org.apache.maven.archetypes:
maven-archetype-profiles(-)
190:
remote->org.apache.maven.archetypes:
maven-archetype-quickstart(AnarchetypewhichcontainsasampleMavenproject.)
191:
remote->org.apache.maven.archetypes:
maven-archetype-site(AnarchetypewhichcontainsasampleMavensitewhichdemonstratessomeofthesupporteddocumenttypeslike
APT,XDoc,andFMLanddemonstrateshowtoi18nyoursite.Thisarchetypecanbelayered
uponanexistingMavenproject.)
192:
remote->org.apache.maven.archetypes:
maven-archetype-site-simple(AnarchetypewhichcontainsasampleMavensite.)
193:
remote->org.apache.maven.archetypes:
maven-archetype-webapp(AnarchetypewhichcontainsasampleMavenWebappproject.)
…..
大概看上去有5百多个archetype
屏幕提示:
Chooseanumberorapplyfilter(format:
[groupId:
]artifactId,casesensitivecontains):
190:
我们选择183回车后
需要分别填写自己的groupId通常是公司的域名,和artifactId,以及package
这里需要注意的是,本身archetype插件也是有这两个要素的,比如183的那行,org.apache.maven.archetypes表示groupId;maven-archetype-j2ee-simple表示artifactId
命令后,看到的文件目录结构为:
看上去好像不太符合我们的,那我们用193的maven-archetype-webapp试试看
http:
//docs.codehaus.org/display/MAVENUSER/Archetypes+List
列出部分archetypes
B.接下来就要把原来项目的数据往现有的骨架上进行添加,并修改相应的pom等配置文件
1.通过mvndependency:
list(tree)分析依赖包很重要,有一个这里的经验在中央仓库里面可能会直接有ehcache目录但是不正确应该是看net.sf下面的,我估计是历史遗留的问题。
2.POM:
//maven.apache.org/POM/4.0.0"xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="http:
//maven.apache.org/POM/4.0.0http:
//maven.apache.org/maven-v4_0_0.xsd">
4.0.0
ep-easyui-webapp
ep-easyui-webapp
war
1.0-SNAPSHOT
ep-easyui-webappMavenWebapp
http:
//maven.apache.org
javax.servlet.jsp
jsp-api
2.0
javax.servlet.jsp.jstl
jstl-api
1.2
org.springframework
spring-webmvc
2.5.6
org.springframework
spring
2.5.6
antlr
antlr
2.7.6
c3p0
c3p0
0.9.1.2
backport-util-concurrent
backport-util-concurrent
3.1
cglib
cglib-nodep
2.1_3
commons-beanutil