分享一点,使用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. **博客链接中的具体问题**:虽然没有提供具体描述,但通常博主会在文章中详细描述遇到的问题及解决方案。访问给定的博客链接(https://donald-draper.iteye.com/blog/2375487)可以获取更详细的解决步骤。 综上...
通常,开发者会在博客中分享他们遇到的问题、解决方案,以及如何优化Maven构建过程的经验。例如,他们可能会讨论如何自定义Maven插件,如何设置Maven仓库,或者如何使用Maven的多模块项目结构来组织复杂的项目。 ...
【标题】"第一个实现的jbpm的例子以及遇到的问题解决方案" jbpm是一个开源的工作流管理系统,用于设计、执行和管理业务流程。本示例主要讲解如何从零开始搭建一个基于jbpm的简单工作流应用,并分享在实践中遇到的...
#### 遇到的问题及解决方案 - **依赖失败**:有时可能会遇到依赖失败的情况,建议先清理本地Maven缓存(`mvn clean`),然后重新下载依赖。 - **JDK版本要求**:使用GitHub上传插件时,需要确保JDK版本为1.8及以上...
本文将详细探讨Maven的两个具体版本——3.6.1和3.6.2,以及在使用过程中可能遇到的问题和解决方案。 一、Maven 3.6.1简介 Maven 3.6.1是Apache Maven项目发布的一个稳定版本,它在前一个版本的基础上进行了若干改进...
12. 处理问题和调试:分享在使用Idea和Maven过程中可能遇到的问题及解决方案,如解决依赖冲突、处理编译错误等。 13. 实战演练:提供一个实际的案例,一步步演示创建、配置、运行和部署一个完整的基于Maven的Web...
它还涉及到Maven的使用和仓库管理策略、批处理脚本的编写和命令行操作技巧,以及如何解决实际开发中遇到的问题。对于那些频繁使用Maven的Java开发者来说,这个话题提供了一个实用且有效的解决方案,帮助他们更加高效...
这表明他们具备了解决复杂集成问题的能力,并能够分享自己的经验和解决方案。对于初学者来说,这是一个极好的学习资源,可以帮助他们快速理解和掌握Maven和SSM框架的整合技巧。 总之,Maven+SSM框架整合是Java开发...
- **实战技巧:** 分享了许多实际开发中遇到的问题及解决方案,增加了书籍的实用价值。 总结,《Maven实战》不仅是一本详细介绍Maven理论和实践的书籍,更是一部深入浅出、实战性强的技术手册。无论你是初学者还是...
总的来说,Maven和Nexus的结合使用为Java开发团队提供了高效、稳定且易于管理的依赖解决方案。通过在本地搭建Nexus仓库,可以显著提高开发效率,降低网络问题对构建的影响。同时,Eclipse中的Maven集成使得项目创建...
- 将错误信息复制到搜索引擎中,可以找到其他开发者遇到并解决类似问题的经验分享。 - 这种方法对于快速定位问题非常有效,尤其是在面对一些较为罕见的错误时。 3. **检查代码或配置** - 根据错误信息,仔细检查...
6. **README.md** - 提供了项目的简介、如何运行以及可能遇到的问题和解决方案。 通过分析这些文件,开发者可以了解到如何设置Maven项目,配置Spring MVC,编写控制器,定义模型,以及如何组织服务和数据访问层。...
在ITEYE这样的技术社区,博主通常会详细介绍技术实现、使用场景、优势以及可能遇到的问题和解决方案。 从标签“源码”和“工具”我们可以推断,这个代码生成器可能包含可供下载和研究的源代码,并且是一个实用的...
本文将详细介绍如何在 Linux 和 Windows 上安装 Nexus 3,并分享一些安装过程中可能遇到的问题及解决方案。 ### 一、Linux 系统上的安装 1. **下载 Nexus 3 安装包**: 首先从 Sonatype 官方网站获取 Nexus 3 的...
Broadleaf是一个基于Java的高级电子商务解决方案,它提供了丰富的功能,包括商品管理、订单处理、促销策略等。本篇文章将针对安装过程中可能遇到的问题进行详细探讨,并提供解决方法。 首先,安装 Broadleaf 通常...
在IT行业中,我们经常遇到各种问题,其中之一就是“Missing artifact”错误,这通常发生在Maven项目中,当Maven尝试构建或编译项目时,它找不到依赖的JAR包或库。这个问题通常与`pom.xml`文件有关,它是Maven项目的...
- **模型规划存在的问题**:讨论了在规划模型设计过程中可能遇到的问题,如区分问题事实与规划实体、确定规划变量等。 - **使用Solver**:讲解了如何使用Solver接口来解决问题,包括如何设置解决策略、如何处理错误...
标题中的“ANT构建的一个问题”指的是在使用Apache Ant工具进行软件构建时遇到的特定问题。Apache Ant是一个Java库和命令行工具,其任务是驱动构建过程。它通过XML定义的构建文件来描述构建步骤,使得开发者可以自动...