分享使用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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值