作者:codejiwei
日期:2020-09-26
1 Maven定义
2.1 自动化构建工具
Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。在JavaEE开发的历史上构建工具的发展也经历了一系列的演化和变迁:Make→Ant→Maven→Gradle→其他……
2.2 构建的概念
清理:删除以前的编译结果,为重新编译做好准备。
编译:将Java源程序编译为字节码文件。
测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
报告:在每一次测试后以标准的格式记录和展示测试结果。
打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应war包。
安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。
2 Maven如何使用
2.1 安装Maven核心程序
解压Maven的核心程序。
将apache-maven-3.5.4-bin.zip解压到一个非中文无空格的目录下。
2.2 配置环境变量
-
首先检查jdk的环境变量
检查JAVA_HOME环境变量。Maven是使用Java开发的,所以必须知道当前系统环境中JDK的安装目录。
版本要求:
JDK1.8 + Maven3.5.4
-
配置Maven的环境变量
%MAVEN_HOME%\bin
-
查看Maven版本信息验证安装状态
C:\Users\Administrator>mvn -v Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00) Maven home: E:\apache-maven-3.5.4\bin\.. Java version: 1.8.0_45, vendor: Oracle Corporation, runtime: E:\java\jdk1.8.0_45\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
2.3 Maven配置
Maven的核心配置文件 settings.xml
-
配置本地仓库
设置settings.xml内的localRepository
以及准备好的仓库位置
-
配置阿里与镜像
<mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
-
为了在IDEA中不用总是指定jdk版本,需要在settings.xml中配置固定的jdk版本
<profiles> <profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile> </profiles>
2.4 第一个Maven工程(手动)
- 第一步:创建约定的目录结构
Hello
-src
-main(目录用于存放主程序)
-java(目录用于存放源代码文件)
-resource(目录用于存放配置文件和资源文件)
-test(目录用于存放测试程序)
-java
-resource
-pom.xml
- 第二步:配置Maven的核心配置文件pom.xml
<?xml version="1.0" ?>
<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.atguigu.maven</groupId><!--公司或组织的域名倒序+当前项目名称-->
<artifactId>Hello</artifactId><!--当前项目的模块名称-->
<version>0.0.1-SNAPSHOT</version><!--当前模块的版本-->
<!--给当前的Hello依赖取名字为hello-->
<name>hello</name>
<dependencies><!--jar包依赖-->
<!--导入junit的jar包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
<!--导入commons-logging的jar包-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
</project>
-
第三步:编写主程序
- 在mian中编写主程序
在src/main/java/com/atguigu/maven目录下新建文件Hello.java
package com.atguigu.maven;
public class Hello {
public String sayHello(String name){
return "Hello "+name+"!";
}
}
-
第四步:编写测试代码
- 在test中编写测试程序
在/src/test/java/com/atguigu/maven目录下新建测试文件HelloTest.java
package com.atguigu.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {
@Test
public void testHello(){
Hello hello = new Hello();
String results = hello.sayHello("atguigu");
assertEquals("Hello atguigu!",results);
}
}
- 第五步:运行几个基本的Maven命令
在pom.xml文件所在的路径下,打开cmd
cmd 中录入 mvn compile命令, 查看根目录变化
cmd 中录入 mvn test-compile命令, 查看target目录的变化
cmd 中录入 mvn test命令,查看target目录变化
cmd 中录入 mvn package命令,查看target目录变化
cmd 中录入 mvn install命令, 查看本地仓库的目录变化
2.5 IDEA中配置Maven
- 第一步:Settings中找到Maven进行配置
- 第二步:配置Maven自动导入依赖的jar包
Import Maven projects automatically:表示 IntelliJ IDEA 会实时监控项目的 pom.xml 文件,进行项目变动设置,勾选上。
Automatically download:在 Maven 导入依赖包的时候是否自动下载源码和文档。默认是没有勾选的,也不建议勾选,原因是这样可以加快项目从外网导入依赖包的速度,如果我们需要源码和文档的时候我们到时候再针对某个依赖包进行联网下载即可。IntelliJ IDEA 支持直接从公网下载源码和文档的。
VM options for importer:可以设置导入的参数。一般这个都不需要主动改,除非项目真的导入太慢了我们再增大此参数。
2.6 IDEA中创建Maven
-
第一步:创建new Module —> Maven
-
第二步:配置坐标:
-
Maven的文件目录
-
Maven的编译指令
也可以在Terminal的控制台上也可以手写输入操作指令如:
mvn compile | mvn clean | mvn test | mvn package | mvn install
3 Maven的核心概念
- POM
- 约定的目录结构
- 坐标
- 依赖
- 仓库
- 生命周期
- 插件和目标
- 继承
- 聚合
3.1 POM
Project Object Model:项目对象模型,也就是Maven中的pom.xml文件
3.2 约定的目录结构
约定>配置>编码
3.3 坐标
使用如下三个向量在Maven的仓库中唯一的确定一个Maven工程。
[1]groupId:公司或组织的域名倒序+当前项目名称
[2]artifactId:当前项目的模块名称
[3]version:当前模块的版本
<groupId>com.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
3.4 依赖管理
依赖管理
-
(1)当Ajar包需要用到Bjar包中的类的时候,就是A对B有依赖
-
(2)依赖的基本格式
<dependency> <!--坐标--> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.0</version> <!--依赖的范围--> <scope>test</scope> </dependency>
依赖的范围有三种
compile(默认):main、test、部署在Tomcat时要放在WEB-INF的lib目录下
test:只能在test中访问
provided:main、test、部署在Tomcat时不会放在WEB-INF的lib目录下
-
(3)依赖分为:直接依赖和间接依赖
-
(4)依赖的原则:
最短路径优先原则
路径相同时声明者优先
-
(5**)依赖的排除**
对于下面的第二个Maven工程中HelloFriend直接依赖Hello的时候,间接依赖了junit和commons-logging,如果HelloFriend不需要commons-logging这个依赖。那么可以排除依赖。
<?xml version="1.0" encoding="UTF-8"?> <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.atguigu.maven</groupId> <artifactId>HelloFriend</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <!--导入Hello的依赖--> <groupId>com.atguigu.maven</groupId> <artifactId>Hello</artifactId> <version>0.0.1-SNAPSHOT</version> <!--排除间接依赖的commons-logging--> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>
-
(6)统一管理目标jar包的版本
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.0.0.RELEASE</version> </dependency>
对于Spring包的jar包依赖,我们导入的版本应该一致,如果对于版本的统一,可以使用如下的操作进行统一管理。
<!--统一管理当前模块的jar包的版本--> <properties> <spring.version>4.0.0.RELEASE</spring.version> </properties>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency>
第二个Maven工程
-
第一步:首先创建Maven的HelloFriend Module
-
第二步:在pom.xml配置文件中配置当前工程的依赖Hello
-
需要注意的是:此时的Hello的pom.xml的配置文件见2.4。
这个时候因为导入了Hello,所以Hello是当前工程的直接依赖,而因为Hello它又依赖了junit和commons-logging,所以junit和commons-logging是当前工程的间接依赖。
-
另一个问题是:当前的HelloFriend工程是从哪里找到Hello的呢?
答案是 本地仓库。去本地仓库找它所依赖的jar包。
-
<?xml version="1.0" encoding="UTF-8"?>
<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.atguigu.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<!--导入Hello的依赖-->
<groupId>com.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
- 第三步:在main中的HelloFriend中编写如下代码:
package com.atguigu.maven;
public class HelloFriend {
public String sayHelloToFriend(String name){
Hello hello = new Hello();
String str = hello.sayHello(name)+" I am "+this.getMyName();
return str;
}
public String getMyName(){
return "Idea";
}
}
- 在test中的HelloFriendTest中编写如下代码:
package com.atguigu.maven;
import org.junit.Test;
public class HelloFriendTest {
@Test
public void testHelloFriend(){
HelloFriend helloFriend = new HelloFriend();
String results = helloFriend.sayHelloToFriend("Maven");
System.out.println(results);
}
}
3.5 仓库
- 本地仓库
- 远程仓库
- 私服:一般是局域网环境下,为所有局域网范围内的Maven工程服务。
- 中央仓库:架设在Internet上,为全世界的Maven工程服务。
- 中央仓库的镜像
3.6 生命周期
Clean Lifecycle在进行真正的构建之前进行一些清理工作。
clean生命周期:clean
Default Lifecycle构建的核心部分,编译,测试,打包,安装,部署等等。
compile:编译源代码
test-compile:编译测试源代码
test:进行单元测试,不会被打包或部署
package:将编译好的代码,打包成jar
install,将包安装在本地仓库,可以使用该依赖
Site Lifecycle生成项目报告,站点,发布站点。
3.7 插件和目标
Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。
每个插件都能实现多个功能,每个功能就是一个插件目标。
Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务。
例如:compile就是插件maven-compiler-plugin的一个功能;pre-clean是插件maven-clean-plugin的一个目标。
3.8 继承
继承的方式一:平行的module
显示的在平行的Maven的module的pom.xml核心配置文件中加入如下的代码:
缺点是:还需要显示的生命parent然后还要手动添加relativePath,太麻烦。正式的开发使用方式二。
<!--继承-->
<parent>
<groupId>com.atguigu.maven</groupId>
<artifactId>Parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!--指定从当前pom.xml文件出发寻找父工程的pom.xml文件的相对路径-->
<relativePath>../Parent/pom.xml</relativePath>
</parent>
除此之外,还需要在父类中加入modules!!!为什么见聚合!
继承的方式二:自动的子类module
自动在父maven的module文件上new一个子类maven工程
这个时候自动的会在父module中添加:打包方式pom,聚合modules
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>HelloSom</module>
</modules>
3.9 聚合
为什么要使用聚合?
将多个工程分为模块后,比如HelloFriend依赖了Hello,这个时候如果本地仓库中没有Hello的jar包。那么直接install HelloFriend工程就会错误。因为缺少依赖。
注意了!!!
-
如果想打包HelloFriend,需要将Hello和HelloFriend同时继承于一个父module Parent,对父module打包。可以将HelloFriend和Hello同时打包。
-
聚合的前提是具备继承关系!!!
-
父类必须具备的要素有:
-
pom
-
<modules> <module>../Hello</module> <module>../HelloFriend</module> </modules>
-
-
如果Hello即是父module又是子module,那么这样一定不能打包!
原因是:父module要求是打包格式必须是pom格式,而子module要求的打包格式不能是pom格式
4 通过Maven创建Web工程
- 步骤一:创建简单的Maven工程,打包方式为war包
<groupId>com.atguigu.maven</groupId>
<artifactId>MavenWeb</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
- 步骤二:点击Project Structure
- 步骤三:选择对应的Module,添加web目录
- 步骤四:设置目录名称
- 步骤五:在web目录下创建index.jsp页面
- 步骤六:部署到Tomcat上运行
5 出现的问题
5.1 Error:(3, 30) java: 程序包com.alibaba.druid.pool不存在
idea中通过maven已经导入了包,idea中也能定位到包的位置,但在编译的时候始终报error,找不到包。
推测原因是idea的版本与maven构建的build不相容
解决办法如下:
将idea的构建和运行托管到maven下面:
勾选上图选项在重启idea就可以正常运行项目了。