摘自 http://www.cnblogs.com/youzhibing/p/5427130.html
以备删除
前言
项目中用到了maven,而且用到的内容不像利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)用的那么简单;maven的核心是pom.xml,那么我就它来谈谈那些不同的地方;
给我印象最深的就是如下四个元素:modules、parent、properties、import。
modules
从字面意思来说,module就是模块,而pom.xml中的modules也正是这个意思,用来管理同个项目中的各个模块;如果maven用的比较简单,或者说项目的模块在pom.xml没进行划分,那么此元素是用不到的;不过一般大一点的项目是要用到的。
1.需求场景
如果我们的项目分成了好几个模块,那么我们构建的时候是不是有几个模块就需要构建几次了(到每个模块的目录下执行mvn命令)?当然,你逐个构建没问题,但是非要这么麻烦的一个一个的构建吗,那么简单的做法就是使用聚合,一次构建全部模块。
2.具体实现
a.既然使用聚合,那么就需要一个聚合的载体,先创建一个普通的maven项目account-aggregator,如下图:
因为是个聚合体,仅仅负责聚合其他模块,那么就只需要上述目录,该删除的就删了;注意的是pom文件的书写(红色标明的):
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.youzhibing.account</groupId> <artifactId>account-aggregator</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>Account Aggrregator</name> <url>http://maven.apache.org</url> <modules>
<!-- 模块都写在此处 --> <module>account-register</module> <module>account-persist</module> </modules> </project>
b.创建子模account-register、account-persist:右击account-aggregator,new --> other --> Maven,选择Maven Module,创建moven模块。
c.创建完成后,项目结构如下,那么此时account-aggregator可以收缩起来了,我们操作具体子模块就好了。
d.注意点,当我们打开包结构的子模块的pom文件时,发现离预期的多了一些内容,我们坐下处理就好了。
e.那么编码完了之后,我们只需要构建account-aggregator就好了,所有的子模块都会构建。
parent
继承,和java中的继承相当,作用就是复用
1.需求场景
若每个子模块都都用的了spring,那么我们是不是每个子模块都需要单独配置spring依赖了?,这么做是可以的,但是我们有更优的做法,那就是继承,用parent来实现。
2.具体实现
a.配置父pom.xml
我就用聚合pom来做父pom,配置子模块的公共依赖。
父(account-aggregator)pom.xml :
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.youzhibing.account</groupId> <artifactId>account-aggregator</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>Account Aggrregator</name> <url>http://maven.apache.org</url> <modules> <!-- 模块都写在此处 --> <module>account-register</module> <module>account-persist</module> </modules> <dependencies> <!-- 配置共有依赖 --> <!-- spring 依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.0.2.RELEASE</version> </dependency> <!-- junit 依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> </dependencies> </project>
b.account-register的pom.xml :
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.youzhibing.account</groupId> <artifactId>account-aggregator</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> <!-- 与不配置一样,默认就是寻找上级目录下得pom.xml --> </parent> <artifactId>account-register</artifactId> <name>account-register</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- 配置自己独有依赖 --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.3</version> </dependency> <dependency> <groupId>com.icegreen</groupId> <artifactId>greenmail</artifactId> <version>1.4.1</version> <scope>test</scope> </dependency> </dependencies> </project>
c.account-persist的pom.xml :
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.youzhibing.account</groupId> <artifactId>account-aggregator</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <artifactId>account-persist</artifactId> <name>account-persist</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- 配置自己独有依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.0.2.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.16</version> </dependency> </dependencies> </project>
d.依赖的jar包全部ok,需要做的则是在各个模块中进行代码开发了!
3.依赖管理
继承可以消除重复,那是不是就没有问题了? 答案是存在问题,假设将来需要添加一个新的子模块account-util,该模块只是提供一些简单的帮助工具,不需要依赖spring、junit,那么继承后就依赖上了,有没有什么办法了? 有,maven已经替我们想到了,那就是dependencyManagement元素,既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。在dependencyManagement元素下得依赖声明不会引入实际的依赖,不过它能够约束dependencies下的依赖使用。
在父pom.xml中配置dependencyManagement元素
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.youzhibing.account</groupId> <artifactId>account-aggregator</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>Account Aggrregator</name> <url>http://maven.apache.org</url> <modules> <!-- 模块都写在此处 --> <module>account-register</module> <module>account-persist</module> </modules> <dependencyManagement> <dependencies> <!-- 配置共有依赖 --> <!-- spring 依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.0.2.RELEASE</version> </dependency> <!-- junit 依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> </project>
account-persist的pom.xml(account-register也一样) :
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.youzhibing.account</groupId> <artifactId>account-aggregator</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <artifactId>account-persist</artifactId> <name>account-persist</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- spring 依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <!-- junit 依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.0.2.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.16</version> </dependency> </dependencies> </project>
使用这种依赖管理机制似乎不能减少太多的POM配置,就少了version(junit还少了个scope),感觉没啥作用呀;其实作用还是挺大的,父POM使用dependencyManagement能够统一项目范围中依赖的版本,当依赖版本在父POM中声明后,子模块在使用依赖的时候就无须声明版本,也就不会发生多个子模块使用版本不一致的情况,帮助降低依赖冲突的几率。如果子模块不声明依赖的使用,即使该依赖在父POM中的dependencyManagement中声明了,也不会产生任何效果。
import
import只在dependencyManagement元素下才有效果,作用是将目标POM中的dependencyManagement配置导入并合并到当前POM的dependencyManagement元素中,如下就是讲account-aggregator中的dependencyManagement配置导入并合并到当前POM中。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.youzhibing.account</groupId>
<artifactId>account-aggregator</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
properties(Maven属性)
通过<properties>元素用户可以自定义一个或多个Maven属性,然后在POM的其他地方使用${属性名}的方式引用该属性,这种做法的最大意义在于消除重复和统一管理。
Maven总共有6类属性,内置属性、POM属性、自定义属性、Settings属性、java系统属性和环境变量属性;
1.内置属性
两个常用内置属性 ${basedir} 表示项目跟目录,即包含pom.xml文件的目录;${version} 表示项目版本
2.POM属性
用户可以使用该类属性引用POM文件中对应元素的值。如${project.artifactId}就对应了<project> <artifactId>元素的值,常用的POM属性包括:
${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/
${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java/
${project.build.directory} : 项目构建输出目录,默认为target/
${project.outputDirectory} : 项目主代码编译输出目录,默认为target/classes/
${project.testOutputDirectory}:项目测试主代码输出目录,默认为target/testclasses/
${project.groupId}:项目的groupId
${project.artifactId}:项目的artifactId
${project.version}:项目的version,与${version} 等价
${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}-${project.version}
3.自定义属性
如下account-aggregator的pom.xml,那么继承了此pom.xml的子模块也可以用此自定义属性
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.youzhibing.account</groupId> <artifactId>account-aggregator</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>Account Aggrregator</name> <url>http://maven.apache.org</url> <modules> <!-- 模块都写在此处 --> <module>account-register</module> <module>account-persist</module> <module>account-another</module> </modules> <properties> <!-- 定义 spring版本号 --> <spring.version>4.0.2.RELEASE</spring.version> <junit.version>4.7</junit.version> </properties> <dependencyManagement> <dependencies> <!-- 配置共有依赖 --> <!-- spring 依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <!-- junit 依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> </project>
4.Settings属性
与POM属性同理,用户使用以settings. 开头的属性引用settings.xml文件中的XML元素的值。
5.Java系统属性
所有java系统属性都可以用Maven属性引用,如${user.home}指向了用户目录。
6.环境变量属性
所有环境变量属性都可以使用以env. 开头的Maven属性引用,如${env.JAVA_HOME}指代了JAVA_HOME环境变量的的值。
聚合与继承的关系
1.聚合主要是为了方便快速构建项目,继承主要是为了消除重复配置;
2.对于聚合模块而言,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在;对于继承的父pom而言,它不知道有哪些子模块继承它,但那些子模块都必须知道自己的父POM是什么;
3.聚合POM与继承中的父POM的packaging都必须是pom;同时,聚合模块与继承中的父模块除了POM外,都没有实际的内容
结束语
maven越来越流行,这方面的资料也是越来越多,《Maven实战》给我的感觉就相当不错,本博客的内容大多取自其中;网上资料也越来越多,就博客园中就有不少;
相关推荐
Maven 概念 Maven 是一款基于 Java 语言的项目管理工具软件,主要用于解决项目开发中遇到的问题,例如项目模块化、jar 包依赖管理、版本控制等。Maven 项目对象模型(POM)可以通过一小段描述信息来管理项目的构建...
** Maven 概念详解 ** Maven 是一个强大的项目管理和构建工具,主要用于Java应用程序的开发。它通过提供一套标准化的项目对象模型(Project Object Model,POM),简化了项目的构建、依赖管理和文档生成过程。Maven...
#### 一、引言与Maven概念 - **Maven概述**:Maven是一种项目管理和理解工具,旨在通过一套标准流程来简化项目的构建过程。 - **约定优于配置(Convention Over Configuration)**:Maven采用了一套默认规则和约定,...
#### 一、引言与 Maven 概念 **1.1 Maven 是什么?** Maven 是一个项目管理和理解工具。它包含了一个项目对象模型(POM),一组标准集合,一个项目生命周期,一个依赖管理系统以及其他用于管理项目构建、报告和文档化...
1. **Maven概念与架构**:Maven是一个基于项目对象模型(Project Object Model, POM)的项目管理工具。它使用XML格式的POM文件来描述项目信息、依赖关系以及构建过程。Maven的核心架构包括仓库系统、生命周期、插件...
#### 一、Maven 概念 **Maven** 是由 Apache 软件基金会支持的一款开源项目管理和综合工具。它通过定义项目对象模型(Project Object Model,简称 POM)的方式,实现了项目的构建、报告和文档等管理工作的标准化。 ...
1. **Maven 概念模型** - **项目对象模型 (POM)**: POM 是 Maven 的核心,它通过 `pom.xml` 文件定义项目的基本信息,如项目坐标(groupId, artifactId, version),项目依赖,构建目标等。 - **依赖管理系统**: ...
Apache Maven 是一个强大的项目管理和构建...了解并熟练使用这些Maven概念和操作,将大大提高Java开发的效率和项目的可维护性。通过阅读提供的PDF文档,开发者可以深入理解Maven的各个方面,并将其应用到实际项目中。
"Maven 基础概念及使用" Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。它可以将项目分成多个模块,方便开发。通过配置 Maven,可以使用大量的工具和 jar ...
本篇文章将深入介绍 Maven 的资源依赖及其相关概念,帮助开发者更好地理解和使用 Maven。 ### 一、什么是构建? 在软件开发中,构建(Build)是指将源代码转换成可执行程序或库的过程,这通常包括编译、打包、测试...
#### 一、Maven 概念及作用 - **定义**: Maven 是一款基于 Java 平台的项目构建与依赖管理工具。它通过一系列的规范和自动化流程帮助开发者高效地进行项目的构建、测试、打包等工作,并有效管理项目的依赖关系。 -...
#### 一、引言与Maven概念 - **Maven概述**:Maven是一种项目管理和理解工具,旨在通过一套标准流程来简化项目的构建过程,提供了一种清晰的项目对象模型(POM),使得开发者能够以一种简单的方式来构建和管理复杂的...
maven概念讲解,本地仓库搭建,和本地仓库,远程仓库的关系等等
`maven_parent`是一个特殊的Maven概念,它是Maven项目的一个父POM(Project Object Model),用于定义共用的配置和依赖,为子项目提供模板,避免重复配置,提高开发效率。 1. Maven的POM:POM是Maven的核心概念,它...
- **Maven概念**:Maven是一个项目管理和综合工具,它集成了构建工具,提供了一种标准化的方式来构建和管理Java项目。 - **约定大于配置**:Maven通过预定义的目录结构简化了项目配置,比如src/main/java用于源代码...
**Maven 的核心概念** 1. **项目对象模型 (Project Object Model, POM)**: POM是Maven的核心,它是XML格式的文件,包含了项目的基本信息,如项目名称、版本、依赖、构建目标等。 2. **坐标**: Maven使用一组唯一的...
如果你是初学者,还需要了解一些基本的Maven概念,如依赖管理、生命周期和插件。一旦你熟悉了这些,就可以利用这个压缩包中的资源来快速启动你的Java项目。例如,你可以创建一个简单的Java应用,或者一个基于Spring ...