Maven软件依赖管理
大纲
-
快速入门
- 环境搭建
- IDEA创建项目
- 目录结构分析
-
高手进阶
- repository仓库解析
- pom.xml配置详解
- GAV软件定位坐标
- mvn命令 & 生命周期
- maven项目手工构建
- maven项目自动构建
-
高级应用
- 依赖范围解析
- 项目继承下的依赖
- 项目聚合下的依赖
- 项目常用插件配置
- 私有服务器管理
-
应用拓展
- 基础应用:Java SE项目
- 应用升级:Java WEB项目
- 应用拓展:SSM项目构建
- 应用拓展:SpringBoot项目
- 应用拓展:测试项目应用
概述
Maven: 一个用于自动化构建项目和管理项目依赖的工具
环境搭建
1、 JDK
Java Development Kit
JAVA_HOME CLASSPATH PATH
$ java -version
java version "1.8.0_251"
2、 Maven
MAVEN_HOME version1
M2_HOME version2
PATH version3
配置环境变量
vim ~/.bash_profile
# maven
export MAVEN_HOME=/Users/Applications/apache-maven-3.6.3
export PATH=$PATH:$MAVEN_HOME/bin
查看maven版本
$ mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
3、 IDEA
Maven创建项目
配置IDEA的Maven路径,选择自定义安装的路径
1、快速构建web项目
选择Maven项目 maven-archetype-webapp
2、管理Maven依赖,分析依赖关系
搜索依赖地址:https://mvnrepository.com/
pom.xml添加依赖
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
插件列表:https://maven.apache.org/plugins/index.html
pom.xml添加插件
<plugins>
<pluginManagement>
<build>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
3、运行项目,检测Maven项目
(1)Maven
运行命令
$ mvn tomcat7:run
可以配置到启动命令
选择Maven -> Command line添加tomcat7:run
(2)添加到Tomcat
配置启动命令
选择Tomcat -> Deployment -> Artifact
4、防火墙影响访问国外仓库:
[Info] Generating project in Batch mode
配置阿里云*仓库
https://maven.aliyun.com/mvn/guide
$ vim ~/.m2/settings.xml
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
项目结构
.
├── pom.xml
├── src # source
│ └── main
│ ├── java # 业务代码
│ ├── resources # 资源文件
│ └── webapp
│ ├── WEB-INF
│ │ └── web.xml
│ └── index.jsp
└── target # 目标文件
pom.xml
project object model 项目对象模型
package object management 依赖包对象管理器
Maven基础操作
1、仓库 Repository
配置文件默认路径:~/.m2/settings.xml
- 远程仓库/*仓库/国内镜像仓库
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
- 本地仓库
<localRepository>~/.m2/repository</localRepository>
- 私有服务器
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
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- 本地仓库配置:默认~/.m2/repository[推荐修改配置] -->
<localRepository>${user.home}/.m2/repository</localRepository>
<!-- 交互方式配置,读取用户输入信息[使用默认即可,很少修改] -->
<interactiveMode>true</interactiveMode>
<!-- 是否启用独立的插件配置文件,一般很少启用[默认即可,很少修改] -->
<usePluginRegistry>false</usePluginRegistry>
<!-- 是否启用离线构建模式,一般很少修改[如果长时间不能联网的情况下可以修改] -->
<offline>false</offline>
<!-- 是否启用插件groupId自动扫描[很少使用,配置插件时建议全信息配置] -->
<pluginGroups></pluginGroups>
<!--配置服务端的一些设置如身份认证信息(eg: 账号、密码) -->
<servers></servers>
<!-- 镜像位置 -->
<mirrors></mirrors>
<!-- 代理 -->
<proxies></proxies>
<profiles></profiles>
<activeProfiles></activeProfiles>
<activation></activation>
<properties></properties>
<repositories></repositories>
</settings>
jdk1.8_profile.xml
<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>
项目配置 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">
<!-- 1、项目基本信息配置 -->
<!-- 2、项目构建环境配置 -->
<!-- 3、项目仓库管理配置 -->
<!-- 4、项目依赖管理配置 -->
<!-- 5、项目报表信息配置 -->
<!-- 6、项目部分分发配置 -->
</project>
优先级 :
项目配置pom.xml > 用户配置settings.xmlnote > 全局配置settings.xml
完整配置:
Maven: settings.xml、pom.xml完整配置
GAV坐标
版本号:
软件名称.主版本号.小版本号.阶段版本号.字母版本号
字母版本号:
alpha 内测版
beta 公测版
rc 候选版
stable 稳定版
release/r/ga 发布版
final 最终版
Maven命令操作
1、项目构建命令
mvn --version
mvn archetype:generate
2、项目清理、编译、打包
mvn clean
mvn compile
mvn package
3、项目运行、测试、发布
mvn tomcat:run
mvn test
mvn site
mvn dependency:tree
mvn install
mvn deploy
Maven生命周期
clean lifecycle 项目构建之前的清理环节
default lifecycle 项目编译和打包环节
site lifecycle 项目报告,站点信息,发布环节
构建Maven项目
1、手工构建Maven项目
项目结构
$ tree
.
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── demo
│ │ └── Hello.java
│ └── resources
└── test
├── java
│ └── com
│ └── demo
└── resources
pom.xml文件
https://maven.apache.org/guides/getting-started/index.html
<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.demo</groupId>
<artifactId>hello</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
</project>
Hello.java
package com.demo;
public class Hello{
public static void main(String[] args){
System.out.println("Hello");
}
}
# 清理
$ mvn clean
# 编译
$ mvn compile
# 运行
$ mvn exec:java -Dexec.mainClass="com.demo.Hello"
2、命令构建Maven项目
创建命令
# <3.0.5
mvn archetype:create
# >3.0.5
mvn archetype:generate
参数
-DgroupID=""
-DartifactID=""
-DpackageName=""
-DarchetypeArtifactId="maven-archetype-quickstart/maven-archetype-webapp"
-DinteractiveMode=false
eg:
$ mvn archetype:generate \
-DgroupId=com.demo \
-DartifactId=java-demo \
-DpackageName=com.demo \
-DarchetypeArtifactId=maven-archetype-quickstart
3、工具构建Maven项目
使用 IDEA创建Maven项目
archetype项目骨架加载过慢问题
拷贝archetype-catalog.xml
到目录
~/.m2/repository/org/apache/maven/archetype/archetype-catalog/3.1.2
IDEA Build Tools -> Maven Runner设置VM Options:
-DarchetypeCatalog=local
自定义archetype项目骨架解决版本问题
windows如果报错需要修改
mvn.cmd -> mvn.bat
# 构建项目骨架
$ mvn archetype:create-from-project
# 安装到本地仓库
$ mvn clean install
Maven依赖范围管理
软件的依赖:
- G: groupID
- A: artifactID
- V: Version
- Scope
- compile 编译、运行、测试、打包(默认)
- provided 编译、运行 eg: servlet
- runtime 运行、打包 eg: mysql
- test 测试
- system 编译、运行
Maven父子项目依赖传递
父子项目
优点:
- 合理有效的复用依赖jar包
- 子项目互相独立,更加便于敏捷开发和独立管理
缺点:
- 项目之间的系统集成性能较差
父项目pom.xml
<?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.demo</groupId>
<artifactId>maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<name>maven-parent</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<!-- 1、父项目的打包方式 -->
<packaging>pom</packaging>
<!-- 2、版本统一管理 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<log4j.version>1.2.17</log4j.version>
<junit.version>4.11</junit.version>
<spring.version>5.1.9.RELEASE</spring.version>
</properties>
<!--3、父项目中基本依赖 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<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>
</dependencies>
<!--4、父项目中统一管理的依赖,依赖容器,子项目中使用时才会引入-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
子项目pom.xml
<?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>
<!--1、继承关系,继承一个项目 -->
<parent>
<groupId>com.demo</groupId>
<artifactId>maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../maven-parent/pom.xml</relativePath>
</parent>
<!--2、子项目中,会自动继承父项目的groupId-->
<!--<groupId>com.demo</groupId>-->
<artifactId>maven-wiki</artifactId>
<version>1.0-SNAPSHOT</version>
<name>maven-wiki</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- 3、使用父项目中,依赖管理器中统一管理的依赖-->
<!-- 可以不写版本号,由父项目进行统一管理 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
</dependencies>
</project>
Maven项目聚合统一管理
项目聚合关系:
项目之间整体性较高,便于系统集成和维护
<modules>
<module>maven-child1</module>
<module>maven-child2</module>
</modules>
Maven插件管理
生命周期插件
- resources
- source
- clean
- compile
常用操作插件
- tomcat7
- dependency
- jar
Maven插件查找
https://maven.apache.org/plugins/index.html
查看依赖插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
</plugin>
查看依赖
$ mvn dependency:tree
IDEA中可以右键查看依赖图
Maven私有服务器
- Apache Archiva
- JFrog Artifactory
- Sonatype Nexus
下载页面:
https://www.sonatype.com/nexus/repository-oss/download
Products->Nexus Repository Manager->OSS Edition
或者:
https://help.sonatype.com/repomanager3/download
国外地址无法下载,找到一个方法,使用香港的服务器下载后再下载到本地
百度网盘下载:
链接: https://pan.baidu.com/s/1HY3Cwr8KSCm92JByc_BmQg
提取码: 6jwk
操作
# 启动
cd bin
$ ./nexus start
默认端口:
http://localhost:8081/
创建私有仓库
私有服务器分类
- proxy 代理远程仓库
- group 分组管理
- hosted 发布本地开发项目
- releases 稳定版
- snapshots 快照版
依赖下载和项目发布
依赖查找顺序:
本地仓库 < 私有仓库 < *仓库
登录之后可以创建新的仓库
1、从私有仓库通过代理下载依赖 pom.xml
<!--配置私有仓库地址-->
<!--从私有仓库下载的包会被缓存-->
<repositories>
<repository>
<id>my-central</id>
<name>My Central</name>
<url>http://localhost:8081/repository/my-central/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
2、发布项目 pom.xml
<groupId>com.demo</groupId>
<artifactId>maven-demo</artifactId>
<!-- 快照版 -->
<version>1.0-SNAPSHOT</version>
<!-- 正式版 -->
<version>1.0-RELEASE</version>
<!--配置发布仓库地址-->
<distributionManagement>
<repository>
<id>my-release</id>
<name>My Release</name>
<url>http://localhost:8081/repository/my-release/</url>
</repository>
<snapshotRepository>
<id>my-snapshot</id>
<name>My Snapshot</name>
<url>http://localhost:8081/repository/my-snapshot/</url>
</snapshotRepository>
</distributionManagement>
配置账号密码 ~/.m2/settings.xml
<servers>
<server>
<id>my-snapshot</id>
<username>admin</username>
<password>123456</password>
</server>
<server>
<id>my-release</id>
<username>admin</username>
<password>123456</password>
</server>
</servers>
发布
$ mvn deploy
Maven构建JavaSE项目
通过IDEA创建Maven项目
项目结构
.
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── demo
│ │ └── HelloWorld.java
│ └── resources
└── test
└── java
HelloWorld.java
package com.demo;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("hello");
}
}
运行方式:
-
直接运行
-
配置运行参数
exec:java -Dexec.mainClass="com.example.HelloWorld"
Maven构建JavaWeb项目
项目骨架:maven-archetype-webapp
手工创建
项目结构
.
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── demo
│ │ └── HelloServlet.java
│ ├── resources
│ └── webapp
│ ├── WEB-INF
│ │ └── web.xml
│ └── index.jsp
└── test
└── java
pom.xml
<?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.demo</groupId>
<artifactId>java-web-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 修改打包方式 -->
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!--编译和运行时生效-->
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!--命令行启动:$ mvn tomcat7:run-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
</project>
web.xml
<?xml version="1.0" encoding="UTF8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="false">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Demo</title>
</head>
<body>
<h2>我的web项目</h2>
</body>
</html>
HelloServlet.java
package com.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 使用 WebServlet 需要配置 web.xml
* version > 3.0
* metadata-complete=false
*
* 参考:https://www.cnblogs.com/iCheny/p/10976735.html
*/
@WebServlet(value = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("Hello World.");
}
}
项目构建 Project Structure 创建Web 模块
两种方式启动:
1、命令行运行
$ mvn tomcat7:run
2、配置Tomcat
IDEA的即改即生效都不是太好,开发起来很痛苦啊
Eclipse 生效很及时
以Debug模式运行,编译后就生效了
依赖冲突
1、依赖直接冲突
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
<!-- 优先排除低版本的依赖,一般情况下高版本会兼容低版本 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.5-FINAL</version>
<exclusions>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
</exclusions>
</dependency>
2、依赖传递冲突
课程总结
-
环境搭建,文件结构
-
项目构建,配置梳理
-
仓库,坐标,命令和生命周期
-
项目依赖的范围管理
-
父子项目的传递,聚合项目的管理
-
私有服务器的构建使用
-
增强项目功能的插件
-
不同类型项目的构建
-
解决项目中的依赖冲突