`
xiao_2012_wei
  • 浏览: 30328 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

分享使用maven过程中遇到的问题,以及解决方案

阅读更多
分享一点,使用maven过程中遇到的问题,以及解决方案。欢迎大家指教和补充。

背景:
         相信大多数开发人员都遇到过这个问题,如果lib下面存在两个jar包,那么启动server可能报错的。在本地开发环境,通常我们的做法,删除一个。
         先描述下,我们的工程里面lib下面的jar包哪来的呢?这个大家肯定不陌生,利用maven的插件,复制maven依赖的jar包到src/main/webapp/WEB-INF/lib下面。
其实这个是本地调试用,测试环境发布war包到tomcat,打出的war里面,其实是不需要执行该功能的。恰恰相反,如果执行了,还会出问题。请继续往下看……
         再来说下测试环境通过hudson或者jenkins编译打包的情况,其实和本地打出的war包是一样的,maven插件<artifactId>maven-war-plugin</artifactId>进行打包。这里特别之处就是snapshot版本的jar包。Snapshot即为快照版,是不稳定的jar版本,好处就在于jar包提供者修复bug等,重新提交jar包,不需要更改版本号,调用者就能从maven中获取最新的jar包。(注:版本号中的SNAPSHOT必须为大写)

         简单说下原理:maven会根据模块的版本号(pom文件中的version)中是否带有-SNAPSHOT来判断是快照版本还是正式版本。如果是快照版本,那么在mvn deploy时会自动发布到快照版本库中,而使用快照版本的模块,在不更改版本号的情况下,直接编译打包时,maven会自动从镜像服务器上下载最新的快照版本。maven都会将SNAPSHOT改成一个当前时间的timestamp,比如B-1.0-SNAPSHOT.jar到nexus中后,会成为这个样子:B-1.0-20081017-020325-13.jar。Maven在处理B的SNAPSHOT依赖时,会根据这样的timestamp下载最新的jar。

        所以如果在pom中再加上:
                                     <execution>
                                                        <id>copy-lib</id>
                                                        <phase>generate-resources</phase>
                                                        <goals>
                                                                 <goal>copy-dependencies</goal>
                                                        </goals>
                                                        <configuration>
                                                                 <outputDirectory>src/main/webapp/WEB-INF/lib</outputDirectory>
                                                        </configuration>
                                               </execution>
Snapshot版本的jar包在lib下面就会存在两个了。 哎呀,终于搞清楚原理了……

那么该如何处理呢? 
为了测试人员顺利编译、打包,最简单的做法就是,直接把上面这段plugin中的execution注掉,这样打出的war包,lib下面是看不到snapshot的jar,只有带时间戳的,即最新的jar包。但是开发人员怎么办? 本地环境必须要执行这个命令的,否则无法启动server的。傻办法就是 本地把注释打开,不要提交上去。 呵呵,我也经常这么玩,但是不是很容易忘记。有点不靠谱!
         那有没有靠谱的方法?
         把前面的execution注掉以后,然后在pom中project里面加入一段profiles:  不过也有前提,就是maven的settings文件必须是标准化的,主要是为了能识别开发环境。<!--复制依赖包到/WEB-INF/lib下  仅开发环境执行  -->
         <profiles>
                   <profile>
                            <id>dev</id>
                            <build>
                                     <plugins>
                                               <plugin>
                                                        <groupId>org.apache.maven.plugins</groupId>
                                                        <artifactId>maven-dependency-plugin</artifactId>
                                                        <version>${maven-dependency-plugin.version}</version>
                                                        <executions>
                                                                 <execution>
                                                                           <id>copy-lib</id>
                                                                           <phase>generate-resources</phase>
                                                                           <goals>
                                                                                    <goal>copy-dependencies</goal>
                                                                           </goals>
                                                                           <configuration>
                                                                                    <outputDirectory>src/main/webapp/WEB-INF/lib</outputDirectory>
                                                                           </configuration>
                                                                 </execution>
                                                        </executions>
                                               </plugin>
                                     </plugins>
                            </build>
                   </profile>
         </profiles>
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics