Maven 最佳实践

   用MAVEN有些日子了,基础的更细的东西请大家参考http://maven.apache.org/,这里就闪过了,只是分享经验...

 

   首先还是白一句,MAVEN的学习曲线比较高,但是带来的益处非常的明显.特别是在项目的TEAM比较大, 多个小组协同工作的时候.而且你可以深刻的理解一些工程之间的横向关系.为你定义一些工程之间的依赖有很好的帮助.为什么要这么做? 可以参考spring, hibernate的发展历史.为什么Spring到后面有如此多的包-spring-*.jar…

 

本地服务器

 

   先用过Artifactory,Nexus.为什么要换?主要ECLIPSE MAVEN PLUGIN(个人经验建议不要使用插件,使用命令行)跟在Artifactory一起工作的时候有个奇怪的问题.每次更新的自产jar,它的索引都无法自动更新.需要登陆ADMIN后重建索引.然后在ECLIPSE插件里面UPDATE INDEX,但还是不能找到这个JAR.实在无法忍受,改试Nexus,Eclipse Maven Plug-in一起工作得不错.INDEX更新及时.顺便说下,INDEX在实际中的作用,MAVEN查找依赖包,就是依靠这个INDEX文件来查询.如果你使用Eclipse Maven Plug-in的话,有个默认的选项,启动时启动INDEX更新.这个主要用来跟MAVEN官方网站上的INDEX文件来同步。这个文件比较大,都长到几十M.

如果要列一下ArtifactoryNexus到底谁好用点?其实两者各有千秋.

     Artifactory:

        · 可以帮你生成本地的Settings文件,这个是非常有用的,MAVEN本地的一个配置文件,SERVER相关的配置都在这 里.Nexus似乎专业版才提供这个功能.

       · 默认给你一个WEB APP(JETTY),做了一些跟WINDOWS结合的工作.可以注册NT SERVICE, 比较方便 在WINDOWS下工作, 当然它也可以在LINUX上工作.Nexus就一个WAR, WAR可以在哪里工作, 它就可以.

    Nexus

       ·  用户管理更强大,有丰富的ROLE,USER定义.

我比较喜欢NEXUSWEB风格,再说,它帮我解决了INDEX问题.

 

配置

 

   个人认为配置是MAVEN学习曲线比较高的主要原因之一.

$MAVEN_HOME$/conf下面有个settings.xml文件,本地MAVEN跟服务器通信,还有本地的仓储位置都在这个文件里面配置, 详细的介绍, 可以打开这个文件, 看注释.

然后到每个POM文件,它是你这个工程的一切信息的源泉(除了代码).换句话说,我们应该把工程的元信息交给POM文件去管理.什么是工程的元信息(主要指ECLIPSE里面的工程)?比如:

       1.       工程类型是Java Standard Project, Dynamic Web Project(DWP), Enterprise Application Project...这个对应Eclipse 工程下面的settings 目录以及.project 文件[小技巧:一般根据POM.xml生成这些文件的时候,使用mvn eclipse:clean eclipse:eclipse就可以了,但是对于DWP工程需要加特殊的参数mvn eclipse: clean eclipse: eclipse -Dwtpversion=2.0或者-Dwtpversion=R7 ,这样你的工程才会被eclipse认成DWP工程,方便你加到server里面做开发,调试]

       2.       工程依赖信息以及继承(包含依赖工程以及jar).对应.classpath文件. 工程还能继承?OUT,这个可以有.为什么你可以定义抽象类,就不能定义抽象工程呢?它在某些情况下是优于组合的.多的不说,设计工程的时候想想如何设计类的. Maven如何做到这点的?其实还是POM.xml.所有的POM.xml都是继承mavenSuper POM,具体参考http://maven.apache.org/pom.html#The_Super_POM 

       3.       MAVEN版本号,这个对应你生成的JAR包所带的版本号.这个是MAVEN承诺的版本依赖管理的基础.其实大家在搭建本地环境的时候(换电脑?),都会有这样的苦恼

   §  重复工作,工程之间依赖要重新一个一个的加,jar包也是,想深入调试某些开源jar,发现要去每个网站上面下载source.[Maven下运行mvn dependency: sources, 所有能在服务器找到的source,全部下来

   §  跑了半天,发现JAR版本不统一(不是吧,大家都是jdom.jar,他的1.1.2,我的1.1.1, 怎么都长成jdom.jar,很多Jar provider也不称职,MANIFEST.MF里面提供的信息通常都灰常的不准确)[Maven为每个jar生成版本号,根本上避免这个问题]

 

       4.       工程目录的约定规则.Maven在根据POM文件生成工程目录时,是按照约定来做的,比如src/main/java/….,也是插件方式实现的,如果需要自己的结构就无法享受MAVEN带来的好处了.所以它的原则是,如果你按照我的说法,我就可以提供什么什么,否则你还是走老路吧.

 

使用

 

2种方式

       1)MAVEN自带的命令,相对稳定,推荐.具体的命令使用,比如一些基本的goal, phase概念,请参考http://maven.apache.org/guides/getting-started/index.html.其实这方面没什么花头,结果跟ANT类似.

        2)Maven for eclipse plug-in功能强大,其实也是调用maven的命令,IDE结合比较好,比如打包,更新依赖但是个人感觉不是很稳定.当依赖是指定的版本范围的时候,插件总是需要检查范围内所有的POM文件,非常耗时.

猜你喜欢

转载自bluemeteorolite.iteye.com/blog/1285571