Maven 实战要点

来源:互联网 发布:整形模拟软件 编辑:程序博客网 时间:2024/05/22 01:36
1
Maven 实战要点
2
文档信息(Document Info)
目录
文档信息(Document Info)...............................................2
修订信息(Revise Info).....................................................3
附件信息(Attachment Info).............................................4
1. 概述............................................................................ 6
1.1. 目的.................................................................... 6
1.2. 范围.................................................................... 6
2. 准备................................................................................ 6
3. Maven 构成..............................................................6
3.1. Maven 项目文件结构...................................6
3.2. src..................................................................6
4. m2eclipse.........................................................7
5. Maven 多模块.................................................7
6. 常用指令........................................................ 8
7. 常用pom 配置................................................8
7.1. 设置发布服务器.......................................... 8
7.2. 设置编译级别.............................................. 9
7.3. 设置发布java-doc....................................... 9
7.4. 设置发布java-source........................................10
7.5. 设置自动发布到Tomcat.................................. 10
7.6. 自动下载源码和Javadoc................................. 10
7.6.1. 配置方法................................................. 11
7.6.2. 命令行方法.............................................11
7.7. 通过Profile 切换发布到不同的环境..............12
7.7.1. 准备.........................................................12
7.7.2. 更新pom 设置..........................................12
7.7.3. 更新项目资源...........................................12
7.7.4. 发布...........................................................12
8. 最佳实践........................................................................ 13
9. FAQ................................................................................. 13
9.1. 解决webapp 项目启动丢失依赖...................... 13
9.2. 如何解决跨项目的依赖冲突.............................14
9.3. 远程依赖升级但本地无法更新.........................14
9.4. 独立Maven 项目依赖维护注意的问题............15
9.5. 找不到类的问题................................................. 15
9.6. cannot read zip file entry 的问题.........................15
3
1. 概述
1.1. 目的
让团队成员更快更好的在项目中使用Maven。
1.2. 范围
所有使用Maven管理项目的工程师。
2. 准备
强烈建议你在看下去之前花上1 个小时通读一遍Maven in action.pdf
Maven in action.pdf
3. Maven 构成
3.1. Maven 项目文件结构
pom.xml
src
target(install 以后才存在)
除此之外都不是Maven 的文件
3.2. src
src/main/java
4
src/main/resourse
src/test/java
src/test/resourse
src/main/webapp(只有packaging 属性为war 时)
其他的目录都不是Maven 的有效目录
4. m2eclipse
导入eclipse 时会根据pom.xml 自动生成工程文件.setting,.classpath 和.project,这
些配置文件都是eclipse 的,不是maven 的!
不要在eclipse 中手动修改eclipse 的设置,包含编译版本,src 路径,输出路径等!
建议通过工程右键Maven 中的Update Project Configuration 来应用pom 中的设置,例如
编码,编译级别等。
如果是webapp 项目,可以使用maven 的eclipse 插件来转换成本地的webapp 工程。
每次修改过pom 文件后,必须重新生成工程。
不要svn 提交更新任何eclipse 的设置文件!
这个插件不是特别稳定,经常会遇到无法更新设置,无法删除旧文件等问题,如果
遇到问题太多的话,建议直接通过maven 命令行来操作。
5. Maven 多模块
父模块packaging 一定是pom。
子模块根目录默认是父模块二级文件夹。
副模块的设置会自动传递给子模块,所以一般情况下所有的设置(所有的依赖)都
要放到父模块。
模块默认的编译不会包含Lib,所以不用担心体积和速度问题,引用的都是本地的
仓库。
5
6. 常用指令
mvn clean install
每次更新代码后
mvn eclipse:clean eclipse:eclipse -Dwtpversion=1.5
更新webapp 工程
mvn site-deploy
生成站点并且发布
mvn clean install deploy
发布构建
tomcat:deploy
首次发布到该服务器
tomcat:redeploy
重复发布更新到该服务器
请先按照7.5 章节在pom 中增加配置。
如果遇到OutOfMemoryError 异常导致发布失败,参照
http://springsfeng.iteye.com/blog/1168416 中方法3 设置即可解决。
以上的mvn 在m2eclipse 中均可以省略,并且可以保存为一个run 项目重用。
6
7. 常用pom 配置
7.1. 设置发布服务器
<distributionManagement>
<snapshotRepository>
<id> Internal-Snapshot </id>
<name> Internal-Snapshot</name>
<url> http://******/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
<repository>
<id> Internal-Release </id>
<name> Internal-Release</name>
<url> http:// ******/nexus/content/repositories/releases/</url>
</repository>
</distributionManagement>
建议放到super pom 中。
7.2. 设置编译级别
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<inherited>true</inherited>
<version>2.3.2</version>
<configuration>
7
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
建议放到super pom 中。
7.3. 设置发布java-doc
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
建议独立模块发布使用。
7.4. 设置发布java-source
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.2</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
建议独立模块发布使用。
8
7.5. 设置自动发布到Tomcat
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<url>http:// ******/manager/html</url>
<server>Tomcat</server>
<path>/${project.name}</path>
</configuration>
</plugin>
</plugins>
建议测试阶段使用,放到webapp 工程的pom 中。
7.6. 自动下载源码和Javadoc
前提是这个dependency 是有sources 或者javadoc 的。
7.6.1. 配置方法
在dependency 标签中加入classifier,值为sources 或者javadoc,例如
<dependency>
<groupId>me.gall.androidbox</groupId>
<artifactId>androidbox-common</artifactId>
<version>0.0.6-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
<classifier>javadoc</classifier>
</dependency>
或者
<dependency>
<groupId>me.gall.androidbox</groupId>
<artifactId>androidbox-common</artifactId>
<version>0.0.6-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
<classifier>sources</classifier>
</dependency>
9
优点是可以只下载某一个依赖的源码或者javadoc。
缺点是两者只能写一个,如果只需要一个的话推荐配置方法。
7.6.2. 命令行方法
下载源码
mvn dependency:sources
下载javadoc
mvn dependency:resolve -Dclassifier=javadoc
两者也可以合并成一句,推荐合并使用
mvn dependency:sources dependency:resolve -Dclassifier=javadoc
优点是同时可以下载源码和javadoc。
缺点是要一次性下载所有依赖的源码或javadoc,下载时间比较长,占用空间
比较大,而且大部分都没用。
7.7. 通过Profile 切换发布到不同的环境
7.7.1. 准备
首先请确认你已经从svn 上下载了最新的settings.xml 并且应用到了你本地的
maven 配置中。这个配置中已经包含了all,local,development 和production 四个
profile。
all:通用配置,默认激活,切换其他配置也是需要激活的。
local:本地环境配置,默认激活,当切换到以下配置时需要禁用。
development:测试环境配置,默认不激活,根据需要激活。
production:生产环境配置,默认不激活,根据需要激活。
7.7.2. 更新pom 设置
在项目(一般是需要发布的webapp 项目)的pom 的build 节点中添加
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
该设置的作用为过滤resource 文件夹内的所有文件,并且替换指定的属性(在
settings.xml 中已经配置好了profiles.active 这个属性)。
10
7.7.3. 更新项目资源
接下来准备需要根据不同环境下的资源,这里以数据源配置为例。
在同一项目resource 目录中新建dataSource-local.xml,
dataSource-development.xml 和dataSource-production.xml 三个配置文件,分别配置
对应的数据源bean。
删除项目中原先配置的数据源bean,替换为
<import resource="classpath:dataSource-${profiles.active}.xml" />
7.7.4. 发布
发布时指定使用的profile,即可把profiles.active 这个变量替换成指定的profile
对应的名称。
发布到本地环境
tomcat:deploy [-Pall,local]
发布到测试环境
tomcat:deploy -Pall,development
发布到生产环境
tomcat:deploy -Pall,production
强烈建议保存以上发布参数为run configuration。
8. 最佳实践
团队必须统一使用最新的setting.xml。
务必配置好自己的开发环境和Maven 的集成,比如JDK,M2_REPO 等。
一般情况下,开发工程师不需要修改pom.xml,通过项目的Owner 来维护。
当pom 发生变更时,必须全局重新clean 并且install 一次。
手动提交更新源码时,建议先clean 一次。
9. FAQ
9.1. 解决webapp 项目启动丢失依赖
Q:从SVN 上checkout 项目到PC 上,需要经过clean,install,以及将webapp 工程从
maven 项目变成eclipse 项目,具体指令是:“eclipse:clean ”以及“eclipse:eclipse –
Dwtpversion=1.5”,但是容器运行的时候发现没有依赖?具体表现为ClassNotFound 异
常。
A:在eclipse 中找到webapp 工程,右键properties 属性,选中Deployment Assembly 选项,
11
查看工程引用,将报红叉的项目remove,然后重新add 相应项目,问题解决。
9.2. 如何解决跨项目的依赖冲突
Q:项目开发过程中,需要被外部项目依赖(就是外部项目需要调用本项目的接口),
但不知本项目中所依赖包结构,导致包冲突问题?例如接口一致的两套实现。
A:首先,在需要被引用的项目中,修改pom.xml 中修改依赖包的版本,版本要保
持一致;其次,由于不知会出现版本冲突问题,在服务器上已经有了本项目的版本了,
如果直接修改pom.xml 然后deploy,服务器上本项目的版本虽然被改变了,但是因为
其他人没有清除本地缓存中的版本号相同的lib,所以引用也枉然。建议修改被引用项
目的项目版本。例如:原本的版本为0.0.1 版本,现在可以修改为0.0.2 版本,注意这版
本是项目pom.xml 的版本。这样修改了是不够的;还需要将主项目也就是管理被引用
项目的主项目版本。主项目也需要相应升级版本号,升级方法参照被引用项目升级方法。
好了,一切就绪,点击主项目右键run as ,选中“maven build..”项,注意是“maven build…”
而不是“maven build”项,然后在对话框的Goals 栏目中输入deploy 指令,点击run ,
OVER。
9.3. 远程依赖升级但本地无法更新
Q:某个依赖在服务器上有更高的版本,但是本地改写了pom 以后,一直提示
Missing artifact xxx
A:在本地执行install 的时候加上-U 的参数,强制从服务器端下载某个版本的依赖
12
即可解决。
9.4. 独立Maven 项目依赖维护注意的问题
Q:有时候你可能需要抽象出自己代码中可以复用的部分作为一个独立的模块,可
以被其他的项目使用,这个时候每次修改都需要升级一下版本号发布到服务器,给初期
的联调带来不便,如何解决?
A:在这种情况下,应该考虑先通过发布到svn,其他人checkout svn 上面的工程
通过本地方式联调,等到项目联调到一个稳定的状态,再通过发布maven 依赖的方式
来使用。
9.5. 找不到类的问题
Q:两种情况,在编辑器中出现import 不到某个类(红线),或者运行时ClassNotFound
异常
A:第一种情况和Maven 无关,是eclipse 的工程设置未更新的原因,解决方法为
刷新(Refresh)该项目,如果仍然没有效果,清理(clean)该项目,等待eclipse 自动
重建项目,即可解决。第二种情况先判断是否修改过pom.xml 文件,如果有修改过,
则需要在父项目中全局的clean 并且install 一次,即可解决。如果没有的话请尝试情况
一的解决方式。如果仍然没有解决,可以尝试问题9.1 的解决方法。
9.6. cannot read zip file entry 的问题
Q:install 构建项目时提示complie 过程中找不到类并提示cannot read zip file entry。
例如错误:读取C:\Users\lianggf\.m2\repository\org\apache\ant\ant\1.8.2\ant-1.8.2.jar 时出
错;cannot read zip file entry
A:原因一般有两种,该jar 包未下载完全或者因为svn 的版本管理问题,可以尝
试在项目上右键Team/小组选择clean/清理项目,如果仍然无法解决,则进入本地仓
库....m2\repository 下删除提示的jar,重新构建工程即可。
原创粉丝点击