Maven基础知识(1)- Maven 简介、Maven 安装配置、创建 Quickstart 项目
注:开始阅读 Maven 基础知识系列文章之前,读者应该已经掌握了 Java 基础知识。另外,本系列文章中的所有实例都是使用 IntelliJ IDEA 编辑,所以还需要对 IntelliJ IDEA 有基本的了解。以下是常用的 Java 开发工具(IDE):
Eclipse IDE for Java Developers: http://www.eclipse.org/downloads/packages/
JetBrains IDEA: https://www.jetbrains.com/idea/download/
Netbeans: http://www.netbeans.org/index.html
1. Maven 简介
Apache Maven 是一款基于 Java 平台的项目管理和整合工具,它将项目的开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需要做一些简单的配置,Maven 就可以自动完成项目的编译、测试、打包、发布以及部署等工作。
Maven 是使用 Java 语言编写的,因此它和 Java 一样具有跨平台性,这意味着无论是在 Windows ,还是在 Linux 或者 Mac OS 上,都可以使用相同的命令进行操作。
Maven 简化并标准化了项目构建过程。它将项目的编译,生成文档,创建报告,发布,部署等任务无缝衔接,构建成一套完整的生命周期。Maven 能够帮助开发者完成以下任务:
(1) 构建项目
(2) 生成文档
(3) 创建报告
(4) 维护依赖
(5) 软件配置管理
(6) 发布
(7) 部署
约定优于配置:
约定优于配置(Convention Over Configuration)是 Maven 最核心的涉及理念之一 ,Maven对项目的目录结构、测试用例命名方式等内容都做了规定,凡是使用 Maven 管理的项目都必须遵守这些规则。
Maven 项目构建过程中,会自动创建默认项目结构,开发人员仅需要在相应目录结构下放置相应的文件即可。
例如,下表显示了项目源代码文件,资源文件和其他配置在 Maven 项目中的默认位置。
文件 目录
Java 源代码 src/main/java
资源文件 src/main/resources
测试源代码 src/test/java
测试资源文件 src/test/resources
打包输出文件 target
编译输出文件 target/classes
Maven 具有以下特点:
(1) 设置简单;
(2) 所有项目的用法一致;
(3) 可以管理和自动进行更新依赖;
(4) 庞大且不断增长的资源库;
(5) 可扩展,使用 Java 或脚本语言可以轻松的编写插件;
(6) 几乎无需额外配置,即可立即访问新功能;
(7) 基于模型的构建:Maven 能够将任意数量的项目构建为预定义的输出类型,例如 JAR,WAR;
(8) 项目信息采取集中式的元数据管理:使用与构建过程相同的元数据,Maven 能够生成一个网站(site)和一个包含完整文档的 PDF;
(9) 发布管理和发行发布:Maven 可以与源代码控制系统(例如 Git、SVN)集成并管理项目的发布;
(10) 向后兼容性:您可以轻松地将项目从旧版本的 Maven 移植到更高版本的 Maven 中;
(11) 并行构建:它能够分析项目依赖关系,并行构建工作,使用此功能,可以将性能提高 20%-50%;
(12) 更好的错误和完整性报告:Maven 使用了较为完善的错误报告机制,它提供了指向 Maven Wiki 页面的链接,您将在其中获得有关错误的完整描述;
Apache Maven: https://maven.apache.org/
Apache Maven GitHub: https://github.com/apache/maven
2. Maven 安装配置
Maven 是一个基于 Java 的项目管理工具,因此最基本的要求是在计算机上安装 JDK 7.0 及以上。
1) Windows 下安装
Windows版本: Windows 10 Home (20H2)
https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.zip
下载后解压缩,无需安装,只需配置。假设 Maven 相关的目录如下:
Maven 目录: C:\Applications\java\apache-maven-3.8.1
本地 Maven 仓库: C:\Applications\java\maven-repository
(1) 配置环境变量
右击“我的电脑” → “属性” → “高级系统设置” → “高级” → “环境变量”
新建系统变量(点击“系统变量”下方的“新建”按钮,填写变量名与变量值,点击“确定”)
MAVEN_HOME = C:\Applications\java\apache-maven-3.8.1
编辑系统变量 Path (PATH)
Path = ... ;%MAVEN_HOME%\bin;
(2) 修改成阿里源
修改 C:\Applications\java\apache-maven-3.8.1\conf\settings.xml
1 ... 2 3 # 修改本地仓库路径 4 <localRepository>C:\Applications\java\maven-repository</localRepository> 5 6 ... 7 8 # 修改成阿里源 9 <mirror> 10 <id>alimaven</id> 11 <name>aliyun maven</name> 12 <url>http://maven.aliyun.com/nexus/content/groups/public/</url> 13 <mirrorOf>central</mirrorOf> 14 </mirror>
2) macOS 下安装
macOS版本: macOS High Sierra (Version: 10.13.6)
下载:https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz
下载后解压缩,无需安装,只需配置。假设 Maven 相关的目录如下:
Maven 目录: /Users/xxx/Applications/Java/apache-maven-3.8.1
本地 Maven 仓库: /Users/xxx/Applications/maven-repository
(1) 配置环境变量
修改系统配置文件 /etc/profile
$ sudo vim /etc/profile
...
MAVEN_HOME=/Users/xxx/Applications/Java/apache-maven-3.8.1
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin
export JAVA_HOME JRE_HOME MAVEN_HOME CLASS_PATH PATH
$ source /etc/profile
$ echo $MAVEN_HOME
(2) 修改成阿里源
修改 /Users/xxx/Applications/Java/apache-maven-3.8.1/conf/settings.xml
1 ... 2 3 # 修改本地仓库路径 4 <localRepository>/Users/xxx/Applications/maven-repository</localRepository> 5 6 ... 7 8 # 修改成阿里源 9 <mirror> 10 <id>alimaven</id> 11 <name>aliyun maven</name> 12 <url>http://maven.aliyun.com/nexus/content/groups/public/</url> 13 <mirrorOf>central</mirrorOf> 14 </mirror>
3) Linux 下安装
参考 macOS 下安装
3. 创建 Quickstart 项目
Maven 提供了大量不同类型的 Archetype 模板,通过它们可以帮助用户快速的创建 Java 项目,其中最简单的模板就是 maven-archetype-quickstart,它只需要用户提供项目最基本的信息,就能生成项目的基本结构及 POM 文件。
1) 创建 maven-archetype-quickstart 项目
在 D:\Workshop\maven 目录中创建一个基于 Maven 的 Quickstart 项目。
打开 cmd 命令行窗口,进入 D:\Workshop\maven 目录,执行如下命令:
D:\Workshop\maven>mvn archetype:generate -DgroupId=com.example -DartifactId=MavenDemo01 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
参数说明:
-DgroupId: 项目组 ID,通常为组织名或公司网址的反写。
-DartifactId: 项目名。
-DarchetypeArtifactId: 指定 ArchetypeId,maven-archetype-quickstart 用于快速创建一个简单的 Maven 项目。
-DinteractiveMode: 是否使用交互模式。
命令运行后,D:\Workshop\maven\ 目录下自动生成了 MavenDemo01 项目。
2) 项目目录结构
MavenDemo01
|- src
| |- main
| | |- java
| | |- com
| | |- example
| | |- App.java
| |- test
| |- java
| |- com
| |- example
| |- AppTest.java
|- pom.xml
(1) 目录及文件说明
MavenDemo01:项目名,包含 src 文件夹和 pom.xml;
src/main/java:用于存放项目的 Java 文件;
src/main/resources:用于存放项目资源文件,需手动创建;
src/test/java:用于存放所有测试 Java 文件,如 JUnit 测试类;
src/test/resources :用于存放测试资源文件,需手动创建;
target:项目输出位置,用于存放编译后的文件,编译运行时自动创建;
pom.xml:Maven 项目核心配置文件。
(2) App.java 代码
1 package com.example; 2 3 /** 4 * Hello world! 5 * 6 */ 7 public class App 8 { 9 public static void main( String[] args ) 10 { 11 System.out.println( "Hello World!" ); 12 } 13 }
(3) TestApp.java 代码
1 package com.example; 2 3 import junit.framework.Test; 4 import junit.framework.TestCase; 5 import junit.framework.TestSuite; 6 7 /** 8 * Unit test for simple App. 9 */ 10 public class AppTest 11 extends TestCase 12 { 13 /** 14 * Create the test case 15 * 16 * @param testName name of the test case 17 */ 18 public AppTest( String testName ) 19 { 20 super( testName ); 21 } 22 23 /** 24 * @return the suite of tests being tested 25 */ 26 public static Test suite() 27 { 28 return new TestSuite( AppTest.class ); 29 } 30 31 /** 32 * Rigourous Test :-) 33 */ 34 public void testApp() 35 { 36 assertTrue( true ); 37 } 38 }
(4) pom.xml 代码
1 <project xmlns="http://maven.apache.org/POM/4.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 4 http://maven.apache.org/maven-v4_0_0.xsd"> 5 6 <modelVersion>4.0.0</modelVersion> 7 <groupId>com.example</groupId> 8 <artifactId>MavenDemo01</artifactId> 9 <packaging>jar</packaging> 10 <version>1.0-SNAPSHOT</version> 11 <name>MavenDemo01</name> 12 <url>http://maven.apache.org</url> 13 <dependencies> 14 <dependency> 15 <groupId>junit</groupId> 16 <artifactId>junit</artifactId> 17 <version>3.8.1</version> 18 <scope>test</scope> 19 </dependency> 20 </dependencies> 21 </project>
3) POM
POM(Project Object Model,项目对象模型)是 Maven 的基本组件,它是以 xml 文件的形式存放在项目的根目录下,名称为 pom.xml。
当 Maven 执行一个任务时,它会先查找当前项目的 POM 文件,读取所需的配置信息,然后执行任务。在 POM 中可以设置如下配置:
(1) 项目依赖
(2) 插件
(3) 目标
(4) 构建时的配置文件
(5) 版本
(6) 开发者
(7) 邮件列表
Maven 项目都有一个 POM 文件,所有的 POM 文件都必须有 project 元素和 3 个必填字段:groupId、artifactId 以及 version。
节点 描述
groupId 项目组 ID,定义当前 Maven 项目隶属的组织或公司,通常是唯一的。它的取值一般是项目所属公司或组织的网址或 URL 的反写,例如 com.example。
artifactId 项目 ID,通常是项目的名称。groupId 和 artifactId 一起定义了项目在仓库中的位置。
version 项目版本。
POM 默认继承自一个父 POM,这个父 POM 被称为 Super POM,它包含了一些可以被继承的默认设置。
Maven 使用 effective pom (Super POM 的配置加上项目的配置)来执行相关任务,它替开发人员在 pom.xml 中做了一些最基本的配置。当然,开发人员依然可以根据需要重写其中的配置信息。
执行以下命令 ,就可以查看 Super POM 的默认配置。
D:\Workshop\maven\MavenDemo01>mvn help:effective-pom
执行结果如下:
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.example:MavenDemo01 >-----------------------
[INFO] Building MavenDemo01 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-help-plugin:3.2.0:effective-pom (default-cli) @ MavenDemo01 ---
[INFO]
Effective POMs, after inheritance, interpolation, and profiles are applied:
...
实际开发过程中,Maven 的 pom.xml 文件不需要手工编写,Maven 提供了大量的原型(Archetype)插件来创建项目,包括项目结构和 pom.xml。
4) 构建&测试项目
(1) 修改代码
创建 src/main/java/com/example/Common.java 文件
1 package com.example; 2 3 public class Common { 4 public static void sayHello(String message) { 5 System.out.println(message); 6 } 7 }
修改 src/main/java/com/example/App.java 文件
1 package com.example; 2 3 public class App { 4 public static void main( String[] args ) { 5 6 Common.sayHello("Common: say hello"); 7 } 8 }
(2) 清理和编译
打开 cmd 命令行窗口,进入 D:\Workshop\maven\MavenDemo01 目录,执行如下命令:
D:\Workshop\maven\MavenDemo01>mvn clean compile
在项目根目录中生成了一个名为 target 的目录,该目录包含以下文件:
target
|- classes
|- maven-status
进入 D:\Workshop\maven\MavenDemo01\target\classes 目录,执行如下命令:
D:\Workshop\maven\MavenDemo01\target\classes> java com.example.App
Common: say hello
注:mvn 是 Maven 的命令行命令,clean 参数是指清理 target 目录,compile 参数是指把 *.java 编译成 *.class。clean 和 compile 可以分开单独使用。
(3) 打包 jar
执行如下命令:
D:\Workshop\maven\MavenDemo01>mvn clean package
在 target 目录下生成 MavenDemo01-1.0-SNAPSHOT.jar,运行如下命令:
D:\Workshop\maven\MavenDemo01>java -jar target\MavenDemo01-1.0-SNAPSHOT.jar
target\MavenDemo01-1.0-SNAPSHOT.jar 中没有主清单属性
显然,MavenDemo01-1.0-SNAPSHOT.jar 不支持 java 命令行运行。
本系列文章资料参考来源:
1. http://c.biancheng.net/maven2/
2. https://www.w3cschool.cn/maven/
3. https://maven.apache.org/