Maven 提倡使用一个共同的标准目录结构,Maven 使用约定优于配置的原则,大家尽可能的遵守这样的目录结构。如下所示:
目录 | 目的 |
---|---|
${basedir} | 存放pom.xml和所有的子目录 |
${basedir}/src/main/java | 项目的java源代码 |
${basedir}/src/main/resources | 项目的资源,比如说property文件,springmvc.xml |
${basedir}/src/test/java | 项目的测试类,比如说Junit代码 |
${basedir}/src/test/resources | 测试用的资源 |
${basedir}/src/main/webapp/WEB-INF | web应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面 |
${basedir}/target | 打包输出目录 |
${basedir}/target/classes | 编译输出目录 |
${basedir}/target/test-classes | 测试编译输出目录 |
Test.java | Maven只会自动运行符合该命名规则的测试类 |
~/.m2/repository | Maven默认的本地仓库目录位置 |
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件。
执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。
OM 中可以指定以下配置:
<modelVersion>4.0.0modelVersion>
<groupId>com.companyname.project-groupgroupId>
<artifactId>projectartifactId>
<version>1.0version>
project>
所有 POM 文件都需要 project 元素和三个必需字段:groupId,artifactId,version。
节点 | 描述 |
---|---|
project | 工程的根标签。 |
modelVersion | 模型版本需要设置为 4.0。 |
groupId | 这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.companyname.project-group 拥有所有的和银行相关的项目。 |
artifactId | 这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置。 |
version | 这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。例如:com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1 |
父(Super)POM是 Maven 默认的 POM。
所有的 POM 都继承自一个父 POM(无论是否显式定义了这个父 POM)。
父 POM 包含了一些可以被继承的默认设置。
因此,当 Maven 发现需要下载 POM 中的 依赖时,它会到 Super POM 中配置的默认仓库 http://repo1.maven.org/maven2 去下载。
Maven 构建生命周期定义了一个项目构建跟发布的过程。
一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的:
阶段 | 处理 | 描述 |
---|---|---|
验证 validate | 验证项目 | 验证项目是否正确且所有必须信息是可用的 |
编译 compile | 执行编译 | 源代码编译在此阶段完成 |
测试 Test | 测试 | 使用适当的单元测试框架(例如JUnit)运行测试。 |
包装 package | 打包 | 创建JAR/WAR包如在 pom.xml 中定义提及的包 |
检查 verify | 检查 | 对集成测试的结果进行检查,以保证质量达标 |
安装 install | 安装 | 安装打包的项目到本地仓库,以供其他项目使用 |
部署 deploy | 部署 | 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程 |
为了完成 default 生命周期,这些阶段(包括其他未在上面罗列的生命周期阶段)将被按顺序地执行。
Maven 有以下三个标准的生命周期:
在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行
构建配置文件是一系列的配置项的值,可以用来设置或者覆盖 Maven 构建默认值。
构建配置文件大体上有三种类型:
类型 | 在哪定义 |
---|---|
项目级(Per Project) | 定义在项目的POM文件pom.xml中 |
用户级 (Per User) | 定义在Maven的设置xml文件中 (%USER_HOME%/.m2/settings.xml) |
全局(Global) | 定义在 Maven 全局的设置 xml 文件中 (%M2_HOME%/conf/settings.xml) |
Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。
在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。
Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。
Maven 仓库有三种类型:
第一步:修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加内容如下:
<mirrors>
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
第二步: pom.xml文件里添加:
<repositories>
<repository>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>falseenabled>
snapshots>
repository>
repositories>
Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件实现的。
Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Maven 插件通常被用来:
下面是一些常用插件的列表:
插件 | 描述 |
---|---|
clean | 构建之后清理目标文件。删除目标目录。 |
compiler | 编译 Java 源文件。 |
surefile | 运行 JUnit 单元测试。创建测试报告。 |
jar | 从当前工程中构建 JAR 文件。 |
war | 从当前工程中构建 WAR 文件。 |
javadoc | 为工程生成 Javadoc。 |
antrun | 从构建过程的任意一个阶段中运行一个 ant 任务的集合。 |
Maven 使用原型 archetype 插件创建项目。
要创建一个简单的 Java 应用,我们将使用 maven-archetype-quickstart 插件。
命令行输入一下命令,可以在本地磁盘构建一个机遇maven的Java应用项目
mvn archetype:generate
"-DgroupId=com.companyname.bank"
"-DartifactId=consumerBanking"
"-DarchetypeArtifactId=maven-archetype-quickstart"
"-DinteractiveMode=false"
参数说明:
添加以下依赖到 pom.xml 文件中:
<dependencies>
<dependency>
<groupId>ldapjdkgroupId>
<artifactId>ldapjdkartifactId>
<version>1.0version>
<scope>systemscope>
<systemPath>${basedir}\src\lib\ldapjdk.jarsystemPath>
dependency>
dependencies>
使用版本控制系统 Maven 来管理一个基于 web 的项目。
使用 maven-archetype-webapp 插件可以创建一个简单的 Java web 应用。
Maven 目录结构是标准的,各个目录作用如下表所示:
文件夹结构 | 描述 |
---|---|
projectName | 包含 src 文件夹和 pom.xml 文件。 |
src/main/webapp | 包含 index.jsp 文件和 WEB-INF 文件夹. |
src/main/webapp/WEB-INF | 包含 web.xml 文件 |
src/main/resources | 包含图片、properties资源文件。 |
<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.0http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId />
<groupId />
<version />
<relativePath />
parent>
<modelVersion>4.0.0modelVersion>
<groupId>asia.banseongroupId>
<artifactId>banseon-maven2artifactId>
<packaging>jarpackaging>
<version>1.0-SNAPSHOTversion>
<name>banseon-mavenname>
<url>http://www.baidu.com/banseonurl>
<description>A maven project to study maven.description>
<prerequisites>
<maven />
prerequisites>
<issueManagement>
<system>jirasystem>
<url>http://jira.baidu.com/banseonurl>
issueManagement>
<ciManagement>
<system />
<url />
<notifiers>
<notifier>
<type />
<sendOnError />
<sendOnFailure />
<sendOnSuccess />
<sendOnWarning />
<address />
<configuration />
notifier>
notifiers>
ciManagement>
<inceptionYear />
<mailingLists>
<mailingList>
<name>Demoname>
<post>[email protected]post>
<subscribe>[email protected]subscribe>
<unsubscribe>[email protected]unsubscribe>
<archive>http:/hi.baidu.com/banseon/demo/dev/archive>
mailingList>
mailingLists>
<developers>
<developer>
<id>HELLO WORLDid>
<name>banseonname>
<email>[email protected]email>
<url />
<roles>
<role>Project Managerrole>
<role>Architectrole>
roles>
<organization>demoorganization>
<organizationUrl>http://hi.baidu.com/banseonorganizationUrl>
<properties>
<dept>Nodept>
properties>
<timezone>-5timezone>
developer>
developers>
<contributors>
<contributor>
<name />
<email />
<url />
<organization />
<organizationUrl />
<roles />
<timezone />
<properties />
contributor>
contributors>
<licenses>
<license>
<name>Apache 2name>
<url>http://www.baidu.com/banseon/LICENSE-2.0.txturl>
<distribution>repodistribution>
<comments>A business-friendly OSS licensecomments>
license>
licenses>
<scm>
<connection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
connection>
<developerConnection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
developerConnection>
<tag />
<url>http://svn.baidu.com/banseonurl>
scm>
<organization>
<name>demoname>
<url>http://www.baidu.com/banseonurl>
organization>
<build>
<sourceDirectory />
<scriptSourceDirectory />
<testSourceDirectory />
<outputDirectory />
<testOutputDirectory />
<extensions>
<extension>
<groupId />
<artifactId />
<version />
extension>
extensions>
<defaultGoal />
<resources>
<resource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
resource>
resources>
<testResources>
<testResource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
testResource>
testResources>
<directory />
<finalName />
<filters />
<pluginManagement>
<plugins>
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
execution>
executions>
<dependencies>
<dependency>
......
dependency>
dependencies>
<inherited />
<configuration />
plugin>
plugins>
pluginManagement>
<plugins>
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
execution>
executions>
<dependencies>
<dependency>
......
dependency>
dependencies>
<goals />
<inherited />
<configuration />
plugin>
plugins>
build>
<profiles>
<profile>
<id />
<activation>
<activeByDefault />
<jdk />
<os>
<name>Windows XPname>
<family>Windowsfamily>
<arch>x86arch>
<version>5.1.2600version>
os>
<property>
<name>mavenVersionname>
<value>2.0.3value>
property>
<file>
<exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
exists>
<missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
missing>
file>
activation>
<build>
<defaultGoal />
<resources>
<resource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
resource>
resources>
<testResources>
<testResource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
testResource>
testResources>
<directory />
<finalName />
<filters />
<pluginManagement>
<plugins>
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
execution>
executions>
<dependencies>
<dependency>
......
dependency>
dependencies>
<goals />
<inherited />
<configuration />
plugin>
plugins>
pluginManagement>
<plugins>
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
execution>
executions>
<dependencies>
<dependency>
......
dependency>
dependencies>
<goals />
<inherited />
<configuration />
plugin>
plugins>
build>
<modules />
<repositories>
<repository>
<releases>
<enabled />
<updatePolicy />
<checksumPolicy />
releases>
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
snapshots>
<id />
<name />
<url />
<layout />
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<enabled />
<updatePolicy />
<checksumPolicy />
releases>
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
snapshots>
<id />
<name />
<url />
<layout />
pluginRepository>
pluginRepositories>
<dependencies>
<dependency>
......
dependency>
dependencies>
<reports />
<reporting>
......
reporting>
<dependencyManagement>
<dependencies>
<dependency>
......
dependency>
dependencies>
dependencyManagement>
<distributionManagement>
......
distributionManagement>
<properties />
profile>
profiles>
<modules />
<repositories>
<repository>
<releases>
<enabled />
<updatePolicy />
<checksumPolicy />
releases>
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
snapshots>
<id>banseon-repository-proxyid>
<name>banseon-repository-proxyname>
<url>http://192.168.1.169:9999/repository/url>
<layout>defaultlayout>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
......
pluginRepository>
pluginRepositories>
<dependencies>
<dependency>
<groupId>org.apache.mavengroupId>
<artifactId>maven-artifactartifactId>
<version>3.8.1version>
<type>jartype>
<classifier>classifier>
<scope>testscope>
<systemPath>systemPath>
<exclusions>
<exclusion>
<artifactId>spring-coreartifactId>
<groupId>org.springframeworkgroupId>
exclusion>
exclusions>
<optional>trueoptional>
dependency>
dependencies>
<reports>reports>
<reporting>
<excludeDefaults />
<outputDirectory />
<plugins>
<plugin>
<groupId />
<artifactId />
<version />
<inherited />
<configuration />
<reportSets>
<reportSet>
<id />
<configuration />
<inherited />
<reports />
reportSet>
reportSets>
plugin>
plugins>
reporting>
<dependencyManagement>
<dependencies>
<dependency>
......
dependency>
dependencies>
dependencyManagement>
<distributionManagement>
<repository>
<uniqueVersion />
<id>banseon-maven2id>
<name>banseon maven2name>
<url>file://${basedir}/target/deployurl>
<layout />
repository>
<snapshotRepository>
<uniqueVersion />
<id>banseon-maven2id>
<name>Banseon-maven2 Snapshot Repositoryname>
<url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshoturl>
<layout />
snapshotRepository>
<site>
<id>banseon-siteid>
<name>business api websitename>
<url>
scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web
url>
site>
<downloadUrl />
<relocation>
<groupId />
<artifactId />
<version />
<message />
relocation>
<status />
distributionManagement>
<properties />
project>
常用
parent 父项目的坐标。
modelVersion POM模型版本
groupId 项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。
artifactId 构件的标识符,它和group ID一起唯一标识一个构件。
packaging 项目产生的构件类型,例如jar、war、ear、pom。
version 项目当前版本,格式为:主版本.次版本.增量版本-限定版本号
name 项目的名称, Maven产生的文档用
url 项目主页的URL, Maven产生的文档用
description 项目的详细描述, Maven 产生的文档用。
build 构建项目需要的信息
profiles 在列的项目构建profile,如果被激活,会修改构建处理
modules 模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径
repositories 发现依赖和扩展的远程仓库列表
pluginRepositories 发现插件的远程仓库列表,这些插件用于构建和报表
dependencies 该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。
dependencyManagement 继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖(必须描述group ID和 artifact
ID信息),如果group ID和artifact ID以外的一些信息没有描述,则通过group ID和artifact ID 匹配到这里的依赖,并使用这里的依赖信息。
properties 以值替代名称,Properties可以在整个POM中使用,也可以作为触发条件(见settings.xml配置文件里activation元素的说明)。
1、dependencies与dependencyManagement
dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。