您的位置:首页 > 职场人生

Maven最佳实践 推荐

2009-09-28 11:04 507 查看
本文不想讨论Maven是什么、能做什么、我们选择Maven有什么好处……本文只是提出在公司大规模开发环境中使用Maven技术的一个案例、一次实践、一种思路,供大家借鉴和参考。至于是不是“最佳”?当然不是!因为没有“最佳”,只有“更佳”:-)
POM,不得不说一下
对Maven而言,POM(Poject Object,项目对象)文件就是一个项目的全部,再不需要其他的配置文件来描述项目了!当在 cmd / shell 中执行mvn、对改项目进行package或其他操作时,只要 cd 到pom文件所在的目录即可,当然,前提是需要将mvn配置在系统路径中。
POM结构
POM文件通常只包括 5 个部分,建议按照这个顺序配置:
基本配置
引用root-pom - 这个很重要,后面会说明
开发者信息 - “猩猩苦苦”干了半天,总要留个名吧
构建配置 - 包括必要的插件配置
依赖配置 - 核心的核心,很多人使用Maven就混乱在这里,本文将提到如何在root-pom上做文章并解决之
除了以上5个部分,项目还可适当增加1个 <modules> 结点,其他结点没有强力的理由,建议谨慎增加。
整体示例
view plaincopy to clipboardprint?
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<!-- 基本配置 -->
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample</groupId>
<artifactId>sample-commons-mvc</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>sample-commons-mvc</name>
<!-- 引用 Root POM -->
<parent>
<groupId>com.sample</groupId>
<artifactId>sample-root-pom</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 开发者 -->
<developers>
<developer>
<name>zhangsan</name>
<email>zhangsan@sample.com</email>
</developer>
</developers>

<!-- 构建配置(只添加本项目特有的) -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Rose>applicationContext</Rose>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<!-- 依赖配置 -->
<dependencies>
<!-- 第三方依赖,不需要指定版本号,不需要写scope -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</dependency>
<dependency>
<groupId>net.user</groupId>
<artifactId>user-api</artifactId>
</dependency>
<!-- 对组织内的依赖,需要指定版本号,以及可能的scope -->
<dependency>
<groupId>com.sample</groupId>
<artifactId>sample-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<!-- 基本配置 -->
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample</groupId>
<artifactId>sample-commons-mvc</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>sample-commons-mvc</name>
<!-- 引用 Root POM -->
<parent>
<groupId>com.sample</groupId>
<artifactId>sample-root-pom</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 开发者 -->
<developers>
<developer>
<name>zhangsan</name>
<email>zhangsan@sample.com</email>
</developer>
</developers>

<!-- 构建配置(只添加本项目特有的) -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Rose>applicationContext</Rose>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<!-- 依赖配置 -->
<dependencies>
<!-- 第三方依赖,不需要指定版本号,不需要写scope -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</dependency>
<dependency>
<groupId>net.user</groupId>
<artifactId>user-api</artifactId>
</dependency>
<!-- 对组织内的依赖,需要指定版本号,以及可能的scope -->
<dependency>
<groupId>com.sample</groupId>
<artifactId>sample-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

基本配置
view plaincopy to clipboardprint?
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample</groupId>
<artifactId>sample-xxx-yyy</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar/war/pom</packaging>
<name>sample1/sample2-xxx-yyy</name>
<url>http://repos.sample.com</url>
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample</groupId>
<artifactId>sample-xxx-yyy</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar/war/pom</packaging>
<name>sample1/sample2-xxx-yyy</name>
<url>http://repos.sample.com</url>
说明:
artifactId
sample-xxx-yyy,即:主工程名-第一功能说名-第二功能说明
version
如果只是对组织内使用的话,建议固定用一个版本:例如 1.0-SNAPSHOT
packaging
如上所示3选1,一般是 jar 或 war ,部分基础的 root-pom 可以为 pom
name
无特殊情况,同artifactId
引用Root POM
view plaincopy to clipboardprint?
<parent>
<groupId>com.sample</groupId>
<artifactId>sample-root-pom</artifactId>
<version>1.0-SNAPSHOT</version>
</paren
<parent>
<groupId>com.sample</groupId>
<artifactId>sample-root-pom</artifactId>
<version>1.0-SNAPSHOT</version>
</paren
这是很重要的一点:各个工程公用的配置,都可以统一的归于这个 root-pom,例如第三方的库的版本号、必需的本组织(第二方)依赖库……这样做的可以有效的避免依赖库版本的混乱 ,好好设计这个 root-pom 吧,依据总体规划的复杂度,你仍然可以对 root-pom 再进行分层,例如:
基础第三方库版本定义的pom
view plaincopy to clipboardprint?
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample</groupId>
<artifactId>sample-3rd-commons-versions</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>sample-3rd-commons-versions</name>
<url>http://maven.apache.org</url>
<properties>
<junit-version>4.6</junit-version>
<spring-mock-version>2.0.8</spring-mock-version>
<el-api-version>1.0</el-api-version>
<activation-version>1.1</activation-version>
<aopalliance-version>1.0</aopalliance-version>
<servlet-api-version>2.4</servlet-api-version>
<jsp-api-version>2.0</jsp-api-version>
...
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample</groupId>
<artifactId>sample-3rd-commons-versions</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>sample-3rd-commons-versions</name>
<url>http://maven.apache.org</url>
<properties>
<junit-version>4.6</junit-version>
<spring-mock-version>2.0.8</spring-mock-version>
<el-api-version>1.0</el-api-version>
<activation-version>1.1</activation-version>
<aopalliance-version>1.0</aopalliance-version>
<servlet-api-version>2.4</servlet-api-version>
<jsp-api-version>2.0</jsp-api-version>
...

基础第三方库的pom
view plaincopy to clipboardprint?
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.sample</groupId>
<artifactId>sample-3rd-commons-versions</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.sample</groupId>
<artifactId>sample-core</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${commons-logging-version}</version>
</dependency>
...
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.sample</groupId>
<artifactId>sample-3rd-commons-versions</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.sample</groupId>
<artifactId>sample-core</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${commons-logging-version}</version>
</dependency>
...
开发者
简单地写上负责人以及主要参与人员的名字信息,他人通过pom可以查看作者。
view plaincopy to clipboardprint?
<developers>
<developer>
<name>张三</name>
<email>san.zhang@sample.com</email>
</developer>
</developers>
<developers>
<developer>
<name>张三</name>
<email>san.zhang@sample.com</email>
</developer>
</developers>
构建配置
可以在相应的 root-pom 中配置一些常用的插件,如:
规定编译的源文件使用的是UTF-8编码
只编译 src/main/java 位置的源文件
将 src/main/java 中的 xml, properties, java 文件打包到jar中
……
某个项目特有的,如:要在MANIFEST文件中加入一个属性,应在该项目的 pom 中单独配置:
view plaincopy to clipboardprint?
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Name>value</Name>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Name>value</Name>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>

依赖配置
应该对第三方的依赖和对组织内(第二方)的依赖区别而待。
对第三方的依赖,不要写版本号,不需要写scope,因为这应该在相应的 root-pom 中指定:
view plaincopy to clipboardprint?
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</dependency>
<dependency>
<groupId>net.user</groupId>
<artifactId>user-api</artifactId>
</dependency>
..
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</dependency>
<dependency>
<groupId>net.user</groupId>
<artifactId>user-api</artifactId>
</dependency>
...

对组织内的依赖,建议统一一个固定版本号(1.0-SNAPSHOT),这会减少很多协作上的麻烦:
view plaincopy to clipboardprint?
...
<dependency>
<groupId>com.sample</groupId>
<artifactId>sample-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.sample.xxx</groupId>
<artifactId>xxx-adapter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.sample.ccc</groupId>
<artifactId>ccc-util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
...
<dependency>
<groupId>com.sample</groupId>
<artifactId>sample-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.sample.xxx</groupId>
<artifactId>xxx-adapter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.sample.ccc</groupId>
<artifactId>ccc-util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
一些其他建议
<distributionManagement> 及 <repository> 的配置,放在合适的 root-pom 中定义吧。
在相应的 root-pom 中配置 maven 的默认结构、build/resources/resouce 等配置项。还可以包括诸如 .svn 文件不会被打到jar中等细节。
在相应的 root-pom 中配置 defaultGoal ,建议为 install,即 $ mvn 等价于 $mvn install 。
还有一些更好的实践?希望你能告诉我:-)
< type="text/javascript">
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 休闲