maven依赖管理
参考资料
- 官网地址:https://maven.apache.org/
- 下载地址:https://maven.apache.org/download.cgi
- 文档地址:
- mvn 远程仓库地址:http://mvnrepository.com/
- 《maven权威指南》
一、maven基础
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具
1.1 Maven安装与配置
首先要确定 jdk 已经安装和配置, 3把 maven 解压到放到 D 盘
1.下载、解压: http://maven.apache.org/download.cgi
2.配置环境变量
JAVA_HOME=C:\Program Files\Java\jdk1.6.0_45 //依赖JAVA_HOME
MAVEN_HOME=D:\apache-maven-3.0.5
M2_HOME=D:\apache-maven-3.0.5
在path变量末尾加入 %MAVEN_HOME%\bin;
3.验证:
mvn -version
4.配置文件setting.xml
<!--本地仓库-->
<localRepository>D:\repository</localRepository>
<!--中央仓库的镜像-->
<mirror>
<id>nexus-aliyun</id>
<name>nexus-aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
1.2 pom.xml :描述、管理项目,依赖引入
- modelVersion:POM 模型版本 4.0.0 固定
- groupId:一般指某公司或某组织的某个项目 如 org.springframework//坐标元素
- artifactId:一般指某个具体项目的某个具体模块 比如 spring-context//坐标元素
- Version:项目的版本 //1.0-SNAPSHOT(1.0快照版) //坐标元素
1.3 Maven 常见命令
- Mvn compile 编译
- Mvn clean 清空编译生成的文件 //动过配置文件或者pom文件后需要maven update->maven clean 动过的项目的pom->maven install重新发布一下
- Mvn test 测试 –下载junit的jar包
- Mvn package 打包到对应target文件夹里
- Mvn install 把项目安装到本地仓库
- Mvn 远程仓库地址:http://mvnrepository.com/
1.4 Maven本地仓库迁出C盘-maven_repository
配置 setting 文件
1.5 Maven特性
依赖传递:
A依赖B,B依赖C ==> A依赖C
依赖选择:(最短路径原则和最先申明原则)
(一)A-> B -> C ->X ( P1 ) A -> D -> X ( P2 )
(二)A -> B ->X ( P3 ) A -> C ->X ( P4 )
聚合:在parent项目中pom.xml中 :声明聚合
<modules>
<module>../user-dao</module>
<module>../user-service</module>
</modules>
继承:在子项目中pom.xml中 :声明继承
<parent>
<groupId>com.wds.demo.user</groupId>
<artifactId>user-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../user-parent/pom.xml</relativePath>
</parent>
子项目pom引用的依赖全都拷贝放到parent的pom里统一管理,然后子项目中引用的依赖版本号可以删掉,然后再parent的pom里统一表示
<properties>
<spring.version>4.1.7.RELEASE</spring.version>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
</properties>
1.6 Maven依赖范围
classpath 分为三种:编译 classpath , 测试 classpath , 运行 classpath
Scope 选项如下:
- Compile:编译依赖范围。默认就是 compile。在编译,测试,运行都有效;
- Test:测试依赖范围。仅测试有效; 例如 JUnit;
- Provided:已提供依赖范围。编译,测试有效,运行时候无效。例如 servlet-api。
- System:系统依赖范围.使用 system 范围的依赖必须通过sytemPath 指定依赖文件的路径。
- Import:导入依赖范围.使用 dependencyManagement 时候,可以导入依赖配置。
1.7 Maven生命周期与插件
Maven 拥有三套独立的生命周期:
- Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
- 1,pre-clean 执行一些清理前需要完成的工作;
- 2,clean 清理上一次构建生成的文件;
- 3,post-clean 执行一些清理后需要完成的工作;
- Default Lifecycle 构建的核心部分,compile,test,package,install 等等。
- Site Lifecycle 生成项目报告,站点,发布站点
二、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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wds.demo</groupId> // 项目坐标
<artifactId>demo-parent</artifactId> // 项目坐标
<version>1.0-SNAPSHOT</version> // 项目坐标
<packaging>pom</packaging>
<properties> //属性
<java.version>1.7</java.version>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<modules> //聚合管理子模块
<module>selfcare</module>
<module>bcare</module>
</modules>
<dependencyManagement> //依赖
<dependencies>
<!--java ee-->
<dependency>
<groupId>javax</groupId> // 依赖坐标---指向本地仓库---没有的话向远程去下载
<artifactId>javaee-api</artifactId> // 依赖坐标
<version>7.0</version> // 依赖坐标
</dependency>
</dependencies>
</dependencyManagement>
<build> //构建
<pluginManagement>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId> // 插件坐标
<artifactId>jetty-maven-plugin</artifactId> // 插件坐标
<version>9.2.20.v20161216</version> // 插件坐标
</plugin>
</plugins>
</pluginManagement>
</build>
<distributionManagement> //<!--部署项目产生的构件到远程仓库-->
<snapshotRepository>
<id>snapshots_eshop</id>
<url>http://127.0.0.1:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>releases_eshop</id>
<url>http://127.0.0.1:8081/nexus/content/repositories/releases</url>
</repository>
</distributionManagement>
<repositories> //私服仓库
<repository>
<id>1</id>
<url>http://127.0.0.1:8081/nexus/content/groups/public</url>
</repository>
</repositories>
</project>
三、profile
3.1 profile简介
- Profile能让你为一个特殊的环境定义一个特殊的构建;profile使不同环境间构建的可移植性成为能。
- profile可以让我们定义一系列的配置信息,然后指定其激活条件。这样我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果。比如说,
- 我们可以通过profile定义在jdk1.5以上使用一套配置信息,在jdk1.5以下使用另外一套配置信息
- 我们可以通过操作系统的不同来使用不同的配置信息
- 每个profile必须 要有一个id,除此之外,它可以覆盖包含几乎所有你能在project下看到的元素
3.2 profile的定义位置
对于使用Maven3,我们可以有多个地方定义profile。定义的地方不同,它的作用范围也不同。
- (1)针对于特定项目的profile配置我们可以定义在该项目的pom.xml中。
- (2)针对于特定用户的profile配置,我们可以在用户的settings.xml文件中定义profile。该文件在用户家目录下的“.m2”目录下。
- (3)全局的profile配置。全局的profile是定义在Maven安装目录下的“conf/settings.xml”文件的。
3.3 profile中能定义的信息
profile定义在settings.xml中
当profile定义在settings.xml中时意味着该profile是全局的,它会对所有项目或者某一用户的所有项目都产生作用。所以在settings.xml中只能定义一些相对而言范围宽泛一点的配置信息,比如远程仓库等。
而一些比较细致一点的需要根据项目的不同来定义的就需要定义在项目的pom.xml中。具体而言,能够定义在settings.xml中的信息有
profile定义在pom.xml中
定义在pom.xml中的profile可以定义更多的信息。主要有以下这些:
<repositories>
<pluginRepositories>
<properties>
<dependencyManagement>
<dependencies>
<plugins>
<distributionManagement>
还有build元素下面的子元素,主要包括:
<defaultGoal>
<resources>
<testResources>
<finalName>
3.4 profile的激活方式
Maven给我们提供了多种不同的profile激活方式。比如我们可以使用-P参数显示的激活一个profile,也可以根据环境条件的设置让它自动激活等
使用activeByDefault设置激活
当我们调用mvn package的时候上面的profileTest1将会被激活,
但是当我们使用mvn package –P profileTest2的时候将激活profileTest2,而这个时候profileTest1将不会被激活。
<profiles>
<profile>
<id>profileTest1</id>
<properties>
<hello>world</hello>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>profileTest2</id>
<properties>
<hello>andy</hello>
</properties>
</profile>
</profiles>
在settings.xml中使用activeProfiles指定处于激活状态的profile
pom.xml
<profiles>
<profile>
<id>profileTest1</id>
<properties>
<hello>world</hello>
</properties>
</profile>
<profile>
<id>profileTest2</id>
<properties>
<hello>andy</hello>
</properties>
</profile>
</profiles>
setting.xml
//在activeProfiles下同时定义了多个需要激活的profile,后面定义的会覆盖前面定义的
<activeProfiles>
<activeProfile>profileTest1</activeProfile>
<activeProfile>profileTest2</activeProfile>
</activeProfiles>
根据环境来激活profile
- 根据jdk来激活profile
- 根据操作系统来激活profile
- 根据系统属性来激活profile
- 根据文件是否存在激活profile
3.5 查看当前处于激活状态的profile
mvn help:active-profiles
四、setting.xml配置
maven的配置文件为settings.xml,在下面路径中可以找到这个文件,分别为:
- $M2_HOME/conf/settings.xml:全局设置,在maven的安装目录下;
- ${user.home}/.m2/settings.xml:用户设置,需要用户手动添加,可以将安装目录下的settings.xml文件拷贝过来修改。
两个文件的关系为:如果两个文件同时存在,文件内容将被融合,相同设置将以用户设置的settings.xml为准。
setting.xml该文件一共有10个配置项,文件结构为:
<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/> //本地仓库地址
<interactiveMode/> //如Maven需和用户交互以获得输入,则设置成true反之false。默true。
<usePluginRegistry/> // 如果需要让Maven使用文件/ebs1/build-machine/usr/local/hudson
/hudson-home/jobs/maven-guide-zh-toproduction/workspace
/.m2/plugin-registry.xml来管理插件版本,则设为true。默认为false
<offline/> //如果构建系统需要在离线模式下运行,则为true,默认为false。当由于网络设
置原因或者安全因素,构建服务器不能连接远程仓库的时候,该配置就十分有用。
<pluginGroups/> //该元素包含一个pluginGroup元素列表,每个子元素包含了一个groupId当
我们 使用某个插件,并且没有在命令行为其提供groupId的时候,Maven
就会使用该列表。默认情况下该列表包含了org.apache.maven.plugins。
<servers/> // 服务器,POM中的distributionManagement元素定义了部署的仓库。然而,一些设置如安全证书不应该和pom.xml一起分发。这种类型的信息应该存在于构建服务器上的settings.xml文件中。
<mirrors/> //私服仓库地址
<proxies/> //代理
<profiles/> // 指定激活jdk,系统等的可移植性配置
<activeProfiles/> //指定激活的profiles
</settings>
问题汇总
1.通过在项目跟路径下执行mvn dependency:tree查看项目的完整依赖树
mvn dependency:tree
2.跳过单元测试
mvn install -Dmaven.test.skip=true
3.定制项目信息
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
4.依赖范围
依赖范围: complile/provide/test/system/runtime
用法:
compile(默认编译范围)同时它们也会被打包
provided(已提供范围)例如,Servlet API JAR由你的servlet容器提供。,也不会被打包。
5.Maven依赖管理
- 依赖传递、
- 依赖范围(如junit依赖的
test ) - Maven仓库:远程仓库->本地仓库
- Maven坐标:Maven坐标定义了一组标识,它们可以用来唯一标识一个项目,一个依赖,或者Maven POM里的一个插件
- Maven的生命周期 :插件目标是附着在生命周期上的,会执行指定阶段之前的目标,直至指定周期绑定的目标被执行完
6.Maven插件和目标 (Plugins and Goals)
一个Maven插件是一个单个或者多个目标的集合,Maven插件的例子有一些简单但核心的插件
7.Apache Log4j2 远程代码执行高危漏洞 解决方案
Apache Log4j任意代码执行漏洞修复 spring-boot-starter-log4j2
//spring-boot-starter-log4j2修复方式
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
//替换为:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.15.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.15.0</version>
</dependency>
//maven中央仓库目前还没有,可以通过下载源码本地进行构建
Apache Log4j2 远程代码执行高危漏洞 解决方案
Apache Log4j2 远程代码执行漏洞(CVE-2021-44228 )风险紧急通告,腾讯安全全面支持检测拦截
8.Fastjson反序列化远程代码执行漏洞”解决方案
腾讯安全发布“Fastjson反序列化远程代码执行漏洞”解决方案
9.java SE 项目package配置
<build>
<plugins>
<plugin>
<!--https://blog.csdn.net/qq_33451502/article/details/108363492-->
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<!--主启动类: 打jar包的main方法配置-->
<mainClass>org.wds.demo.App</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
10.web项目构建配置
11.springboot jar 构建配置