Maven 是一个项目管理和整合工具。Maven 为开发者提供了一套完整的构建生命周期框架。开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置,因为 Maven 使用了一个标准的目录结构和一个默认的构建生命周期。
在有多个开发团队环境的情况下,Maven 能够在很短的时间内使得每项工作都按照标准进行。因为大部分的工程配置操作都非常简单并且可复用,在创建报告、检查、构建和测试自动配置时,Maven 可以让开发者的工作变得更简单。
Maven 能够帮助开发者完成以下工作:
总的来说,Maven 简化了工程的构建过程,并对其标准化。它无缝衔接了编译、发布、文档生成、团队合作和其他任务。Maven 提高了重用性,负责了大部分构建相关的任务。
Maven 的主要目的是为开发者提供
Maven 工程结构和内容被定义在一个 xml 文件中 - pom.xml,是 Project Object Model (POM) 的简称,此文件是整个 Maven 系统的基础组件。详细内容请参考 Maven POM 部分。
Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装 JDK。
maven 3.3要求JDK1.7及以上
windows下打开cmd命令h行,执行java命令:
java -version
以上为正确安装了jdk。
打开环境变量,在系统变量中新建,然后按下图输入:
然后在Path中添加%JDK_HOME%\bin,确定退出。
类似JDK环境变量配置。
1)
2)Path添加%M2_HOME%\bin
cmd中输入mvn -version
出现类似上图内容即安装并配置成功。
POM 代表工程对象模型。它是使用 Maven 工作时的基本组建,是一个 xml 文件。它被放在工程根目录下,文件命名为 pom.xml。
POM 包含了关于工程和各种配置细节的信息,Maven 使用这些信息构建工程。
POM 也包含了目标和插件。当执行一个任务或者目标时,Maven 会查找当前目录下的 POM,从其中读取所需要的配置信息,然后执行目标。能够在 POM 中设置的一些配置如下:
在创建 POM 之前,我们首先确定工程组(groupId),及其名称(artifactId)和版本,在仓库中这些属性是工程的唯一标识。
<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.0modelVersion>
<groupId>com.companyname.project-groupgroupId>
<artifactId>projectartifactId>
<version>1.0version>
project>
PS:每个工程只有一个文件。
节点 | 描述 |
---|---|
groupId | 这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.company.bank 拥有所有的和银行相关的项目。 |
artifactId | 这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置。 |
version | 这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。例如: com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1. |
所有的 POM 都继承自一个父 POM(无论是否显式定义了这个父 POM)。父 POM 也被称作 Super POM,它包含了一些可以被继承的默认设置。
Maven 使用 effective pom(Super pom 加上工程自己的配置)来执行相关的目标,它帮助开发者在 pom.xml 中做尽可能少的配置,当然这些配置可以被方便的重写。
查看 Super POM 默认配置的一个简单方法是执行以下命令:mvn help:effective-pom
建立一个pom.xml文件,填写上面的pom示例的内容。
结果如下:
Effective POM 的结果就像在控制台中显示的一样,经过继承、插值之后,使配置生效。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-insta
nce" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.x
sd">
<modelVersion>4.0.0modelVersion>
<groupId>com.companyname.project-groupgroupId>
<artifactId>projectartifactId>
<version>1.0version>
<properties>
<maven.compiler.compilerVersion>1.8maven.compiler.compilerVersion>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
properties>
<repositories>
<repository>
<snapshots>
<enabled>falseenabled>
snapshots>
<id>centralid>
<name>Central Repositoryname>
<url>https://repo.maven.apache.org/maven2url>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<updatePolicy>neverupdatePolicy>
releases>
<snapshots>
<enabled>falseenabled>
snapshots>
<id>centralid>
<name>Central Repositoryname>
<url>https://repo.maven.apache.org/maven2url>
pluginRepository>
pluginRepositories>
<build>
<sourceDirectory>C:\Users\fzhiy\Desktop\maven+junit\maven\src\main\javasourceDirectory>
<scriptSourceDirectory>C:\Users\fzhiy\Desktop\maven+junit\maven\src\main\scriptsscriptSourceDi
rectory>
<testSourceDirectory>C:\Users\fzhiy\Desktop\maven+junit\maven\src\test\javatestSourceDirectory
>
<outputDirectory>C:\Users\fzhiy\Desktop\maven+junit\maven\target\classesoutputDirectory>
<testOutputDirectory>C:\Users\fzhiy\Desktop\maven+junit\maven\target\test-classestestOutputDir
ectory>
<resources>
<resource>
<directory>C:\Users\fzhiy\Desktop\maven+junit\maven\src\main\resourcesdirectory>
resource>
resources>
<testResources>
<testResource>
<directory>C:\Users\fzhiy\Desktop\maven+junit\maven\src\test\resourcesdirectory>
testResource>
testResources>
<directory>C:\Users\fzhiy\Desktop\maven+junit\maven\targetdirectory>
<finalName>project-1.0finalName>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-pluginartifactId>
<version>1.3version>
plugin>
<plugin>
<artifactId>maven-assembly-pluginartifactId>
<version>2.2-beta-5version>
plugin>
<plugin>
<artifactId>maven-dependency-pluginartifactId>
<version>2.8version>
plugin>
<plugin>
<artifactId>maven-release-pluginartifactId>
<version>2.5.3version>
plugin>
plugins>
pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-pluginartifactId>
<version>2.5version>
<executions>
<execution>
<id>default-cleanid>
<phase>cleanphase>
<goals>
<goal>cleangoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-resources-pluginartifactId>
<version>2.6version>
<executions>
<execution>
<id>default-testResourcesid>
<phase>process-test-resourcesphase>
<goals>
<goal>testResourcesgoal>
goals>
execution>
<execution>
<id>default-resourcesid>
<phase>process-resourcesphase>
<goals>
<goal>resourcesgoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-jar-pluginartifactId>
<version>2.4version>
<executions>
<execution>
<id>default-jarid>
<phase>packagephase>
<goals>
<goal>jargoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-compiler-pluginartifactId>
<version>3.1version>
<executions>
<execution>
<id>default-compileid>
<phase>compilephase>
<goals>
<goal>compilegoal>
goals>
execution>
<execution>
<id>default-testCompileid>
<phase>test-compilephase>
<goals>
<goal>testCompilegoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-surefire-pluginartifactId>
<version>2.12.4version>
<executions>
<execution>
<id>default-testid>
<phase>testphase>
<goals>
<goal>testgoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-install-pluginartifactId>
<version>2.4version>
<executions>
<execution>
<id>default-installid>
<phase>installphase>
<goals>
<goal>installgoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-deploy-pluginartifactId>
<version>2.7version>
<executions>
<execution>
<id>default-deployid>
<phase>deployphase>
<goals>
<goal>deploygoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-site-pluginartifactId>
<version>3.3version>
<executions>
<execution>
<id>default-siteid>
<phase>sitephase>
<goals>
<goal>sitegoal>
goals>
<configuration>
<outputDirectory>C:\Users\fzhiy\Desktop\maven+junit\maven\target\siteoutputDirectory
>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-project-info-reports-pluginartifactId>
reportPlugin>
reportPlugins>
configuration>
execution>
<execution>
<id>default-deployid>
<phase>site-deployphase>
<goals>
<goal>deploygoal>
goals>
<configuration>
<outputDirectory>C:\Users\fzhiy\Desktop\maven+junit\maven\target\siteoutputDirectory
>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-project-info-reports-pluginartifactId>
reportPlugin>
reportPlugins>
configuration>
execution>
executions>
<configuration>
<outputDirectory>C:\Users\fzhiy\Desktop\maven+junit\maven\target\siteoutputDirectory>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-project-info-reports-pluginartifactId>
reportPlugin>
reportPlugins>
configuration>
plugin>
plugins>
build>
<reporting>
<outputDirectory>C:\Users\fzhiy\Desktop\maven+junit\maven\target\siteoutputDirectory>
reporting>
project>
在上面的 pom.xml 中,你可以看到 Maven 在执行目标时需要用到的默认工程源码目录结构、输出目录、需要的插件、仓库和报表目录。
Maven 的 pom.xml 文件也不需要手工编写。
Maven 提供了大量的原型插件来创建工程,包括工程结构和 pom.xml。
在 Maven 的术语中,仓库是一个位置(place),例如目录,可以存储所有的工程 jar 文件、library jar 文件、插件或任何其他的工程指定的文件。
Maven 仓库有三种类型:
Maven 本地仓库是机器上的一个文件夹。它在你第一次运行任何 maven 命令的时候创建。
Maven 本地仓库保存你的工程的所有依赖(library jar、plugin jar 等)。当你运行一次 Maven 构建,Maven 会自动下载所有依赖的 jar 文件到本地仓库中。它避免了每次构建时都引用存放在远程机器上的依赖文件。
Maven 本地仓库默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>F:\Repository\MavenRepositorylocalRepository>
settings>
当你运行 Maven 命令,Maven 将下载依赖的文件到你指定的路径(F:\Repository\MavenRepository)中。
Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。
中央仓库的关键概念:
要浏览中央仓库的内容,maven 社区提供了一个 URL:http://search.maven.org/#browse。使用这个仓库,开发人员可以搜索所有可以获取的代码库。
如果 Maven 在中央仓库中也找不到依赖的库文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件。
举例,使用下面的 POM.xml,Maven 将从远程仓库中下载该 pom.xml 中声明的所依赖的(在中央仓库中获取不到的)文件。
当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库:
Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Maven 插件通常被用来:
插件通常提供了一个目标的集合,并且可以使用下面的语法执行:
mvn [plugin-name]:[goal-name]
例如,一个 Java 工程可以使用 maven-compiler-plugin 的 compile-goal 编译,使用以下命令:
mvn compiler:compile
Maven 提供了下面两种类型的插件:
类型 | 描述 |
---|---|
Build plugins | 在构建时执行,并在 pom.xml 的 元素中配置。 |
Reporting plugins | 在网站生成过程中执行,并在 pom.xml 的 元素中配置。 |
下面是一些常用插件的列表:
插件 | 描述 |
---|---|
clean | 构建之后清理目标文件。删除目标目录。 |
compiler | 编译 Java 源文件。 |
surefile | 运行 JUnit 单元测试。创建测试报告。 |
jar | 从当前工程中构建 JAR 文件。 |
war | 从当前工程中构建 WAR 文件。 |
javadoc | 为工程生成 Javadoc。 |
antrun | 从构建过程的任意一个阶段中运行一个 ant 任务的集合。 |
创建pom.xml文件,位于【C:\Users\fzhiy\Desktop\maven+junit\maven】,内容位于下方
Maven 将开始处理并显示 clean 生命周期的 clean 阶段。
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< com.companyname.projectgroup:project >----------------
[INFO] Building project 1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ project ---
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.clean) @ project ---
[INFO] Executing tasks
[echo] clean phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 17.600 s
[INFO] Finished at: 2019-02-27T14:28:29+08:00
[INFO] ------------------------------------------------------------------------
上面的例子展示了以下关键概念:
Maven 使用**原型(archetype)**插件创建工程。要创建一个简单的 Java 应用,我们将使用 maven-archetype-quickstart 插件。
执行mvn命令:
C:\Users\fzhiy\Desktop\maven+junit\maven\maven创建工程>mvn archetype:generate -DgroupId=com.companyname.bank -DartifactId=consumerBanking
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Maven 将开始处理,并将创建完成的 java 应用工程结构。
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.0.1:generate (default-cli) > generate-sources @ standalone-pom >
>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.0.1:generate (default-cli) < generate-sources @ standalone-pom <
<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin:3.0.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
[WARNING] No archetype found in remote catalog. Defaulting to internal catalog
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-qui
ckstart:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: C:\Users\fzhiy\Desktop\maven+junit\maven\maven创建工程
[INFO] Parameter: package, Value: com.companyname.bank
[INFO] Parameter: groupId, Value: com.companyname.bank
[INFO] Parameter: artifactId, Value: consumerBanking
[INFO] Parameter: packageName, Value: com.companyname.bank
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: C:\Users\fzhiy\Desktop\maven+junit\maven\mav
en创建工程\consumerBanking
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.591 s
[INFO] Finished at: 2019-02-27T14:44:43+08:00
[INFO] ------------------------------------------------------------------------
在该目录下将看到一个名为 consumerBanking 的 java 应用工程(就像在 artifactId 中设定的一样)。Maven 使用一套标准的目录结构,就像这样:
使用上面的例子,我们可以知道下面几个关键概念:
文件夹结构 | 描述 |
---|---|
consumerBanking | 包含 src 文件夹和 pom.xml |
src/main/java contains | java 代码文件在包结构下(com/companyName/bank)。 |
src/main/test contains | 测试代码文件在包结构下(com/companyName/bank)。 |
src/main/resources | 包含了 图片 / 属性 文件(在上面的例子中,我们需要手动创建这个结构)。 |
Maven 也创建了一个简单的 Java 源文件和 Java 测试文件。
在创建工程章节中学到的是如何使用 Maven 创建 Java 应用。
执行以下mvn命令:
出现BUILD SUCCESS表示构建了工程并创建了最终的jar文件。
关键概念:
target目录下的classes文件夹中编译生成了App.class文件,如下:
运行该文件,结果如下:
Maven的依赖管理使用的是 Maven - 仓库 的概念。但是如果在远程仓库和中央仓库中,依赖不能被满足,如何解决呢? Maven 使用外部依赖的概念来解决这个问题。
例如,让我们对在 Maven - 创建工程 部分创建的项目做以下修改:
外部依赖的概念:
Maven 核心特点之一是依赖管理。一旦我们开始处理多模块工程(包含数百个子模块或者子工程)的时候,模块间的依赖关系就变得非常复杂,管理也变得很困难。针对此种情形,Maven 提供了一种高度控制的方法。
这种情形经常可见,当一个库 A 依赖于其他库 B. 另一工程 C 想要使用库 A, 那么该工程同样也需要使用到库 B。
Maven 可以避免去搜索所有需要的库资源的这种需求。通过读取工程文件(pom.xml)中的依赖项,Maven 可以找出工程之间的依赖关系。
我们只需要在每个工程的 pom 文件里去定义直接的依赖关系。Maven 则会自动的来接管后续的工作。
maven有依赖调节、依赖管理、依赖范围、依赖排除、依赖可选几种功能。
就实际使用来说,这里只讨论依赖管理。
通常情况下,在一个共通的工程下,有一系列的工程。在这种情况下,我们可以创建一个公共依赖的 pom 文件,该 pom 包含所有的公共的依赖关系,我们称其为其他子工程 pom 的 pom 父。
接下来的一个例子可以帮助你更好的理解这个概念。
下面是上述依赖图表的细节:
App-UI-WAR 的 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.0modelVersion>
<groupId>com.companyname.groupnamegroupId>
<artifactId>App-UI-WARartifactId>
<version>1.0version>
<packaging>warpackaging>
<dependencies>
<dependency>
<groupId>com.companyname.groupnamegroupId>
<artifactId>App-Core-libartifactId>
<version>1.0version>
dependency>
dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupnamegroupId>
<artifactId>App-Data-libartifactId>
<version>1.0version>
dependency>
dependencies>
project>
App-Core-lib 的 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">
<parent>
<artifactId>RootartifactId>
<groupId>com.companyname.groupnamegroupId>
<version>1.0version>
parent>
<modelVersion>4.0.0modelVersion>
<groupId>com.companyname.groupnamegroupId>
<artifactId>App-Core-libartifactId>
<version>1.0version>
<packaging>jarpackaging>
project>
App-Data-lib 的 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">
<parent>
<artifactId>RootartifactId>
<groupId>com.companyname.groupnamegroupId>
<version>1.0version>
parent>
<modelVersion>4.0.0modelVersion>
<groupId>com.companyname.groupnamegroupId>
<artifactId>App-Data-libartifactId>
<version>1.0version>
<packaging>jarpackaging>
project>
Root 的 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.0modelVersion>
<groupId>com.companyname.groupnamegroupId>
<artifactId>RootartifactId>
<version>1.0version>
<packaging>pompackaging>
<dependencies>
<dependency>
<groupId>com.companyname.groupname1groupId>
<artifactId>Lib1artifactId>
<version>1.0version>
dependency>
dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupname2groupId>
<artifactId>Lib2artifactId>
<version>2.1version>
dependency>
dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupname3groupId>
<artifactId>Lib3artifactId>
<version>1.1version>
dependency>
dependencies>
project>
当我们构建 App-UI-WAR 工程时, Maven 将会通过遍历依赖图找到所有的依赖关系,并且构建该应用程序。
通过上面的例子,我们可以学习到以下关键概念:
https://blog.csdn.net/feng_zhiyu/article/details/84933258