maven简介
maven
查询maven依赖版本信息地址:https://mvnrepository.com/
管理庞大的jar包;
构建项目(依赖、打包、部署);
阿里云镜像仓库
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
springboot打包插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<archive>
<addMavenDescriptor>false</addMavenDescriptor>
</archive>
<!-- 自定义标签 -->
<warName>${project.build.finalName}</warName>
<webResources>
<resource>
<!-- 导入指定目录下的文件 -->
<directory>src/main/resources</directory>
<!-- 生成到指定的目录 -->
<targetPath>WEB-INF/classes</targetPath>
<filtering>true</filtering>
<!-- 导入指定的配置文件 -->
<includes>
<include>application.yml</include>
<!-- profiles标签中配置 -->
<include>application-${profiles.active}.yml</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>
坐标
- groupid 项目
- artifactid 模块
- version 模块版本
- SNAPSHOT 表示快照、迭代版本,正在迭代过程,不稳定的版本
- RELEASE 表示正式版本
作用域
- compile 编译范围,源程序和测试程序都可用,也都可打包;
- provided 已提供范围,源程序和测试程序都可用,但不可打包(一般用于服务器已有的jar包,我们不需要自己再打包过去了,项目直接使用服务器的包,防止包冲突);
- test 测试范围,只有测试程序才会用到;
- runtime 运行时范围,就是字面意思,基本用不到;开发时用不到,运行系统时才会用到;
- system 系统范围,基本用不到;
- import 使用限制:必须打包方式是pom的,必须放在
中;
创建工程
如果使用idea就不需要这个命令了;
随便建个目录,使用该命令创建工程
mvn archetype:generate
出现下面的这个直接回车就行:使用默认一些东西
some of the supported document types like APT, XDoc, and FML and demonstrates how
to i18n your site. This archetype can be layered upon an existing Maven project.)
9: internal -> org.apache.maven.archetypes:maven-archetype-site-simple (An archetype which contains a sample Maven site.)
10: internal -> org.apache.maven.archetypes:maven-archetype-webapp (An archetype which contains a sample Maven Webapp project.)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 7:
然后会提示让 输入 groupid 这个东西无法自动生成 我们这里用 com.yuge
然后会提示让 输入 artifactid 这个东西无法自动生成 这里用 maven-test
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: D:\maven\maventest1
[INFO] Parameter: package, Value: com.yuge
[INFO] Parameter: groupId, Value: com.yuge
[INFO] Parameter: artifactId, Value: maven-test
[INFO] Parameter: packageName, Value: com.yuge
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: D:\maven\maventest1\maven-test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 05:33 min
[INFO] Finished at: 2022-10-09T23:54:50+08:00
[INFO] ------------------------------------------------------------------------
目录结构(约定格式)
-
src -- 源码目录
-
main -- 主程序目录
-
resources -- 配置文件
-
java -- Java源代码
- com -- package目录
-
-
-
src
- test -- 测试程序目录
- java
- com
- java
- test -- 测试程序目录
自动生成的pom.xml文件
<!-- project 表示根标签、当前工程 -->
<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 从maven2开始就固定是4.0.0,表示当前pom.xml所采用的标签结构,不需要管,也不会用 -->
<modelVersion>4.0.0</modelVersion>
<!-- 坐标信息 -->
<groupId>com.yuge</groupId>
<artifactId>maven-test</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- packaging 当前工程打包的方式,默认是打的jar包,可修改成war、pom等 -->
<packaging>jar</packaging>
<!-- 工程名称 -->
<name>maven-test</name>
<!-- maven官网地址没啥用 -->
<url>http://maven.apache.org</url>
<!-- 用来定义maven的属性值 -->
<properties>
<!-- 构建过程读取源码时使用的字符集 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 配置具体依赖信息 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<!-- scope:范围,配置当前依赖的范围 -->
<scope>test</scope>
</dependency>
</dependencies>
</project>
构建命令需要在pom.xml同级目录执行
mvn compile 主程序编译,生成target目录
mvn test-compile 测试程序编译,生成target目录
mvn clean 删除target目录
mvn package 打包命令,默认打包到target目录,默认名字为artifactId+版本,默认不会把测试程序打包进来;
mvn命令支持组合,比如 mvn clean package 先清除再打包
mvn install 安装命令,将我们的工程打包到本地maven仓库
将jar包安装到本地仓库后,可以直接在pom.xml文件中引入我们的包。
<dependency>
<groupId>com.yuge</groupId>
<artifactId>maven-test</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
mvn dependency:tree 将工程依赖信息以树形结构展示;
mvn dependency:list 将工程全部可用jar包展示;
mvn clean install -Dmaven.test.skip=true 表示在执行命令的过程中跳过测试;
mvn deploy 将当前的包复制到远程仓库(私服用);
mvn help:effective-pom 产看当前有效pom文件信息;
mvn help:evaluate 获取当前系统属性,输入此命令后,通过 ${name} 获取值;
依赖的传递性
测试依赖的排除
例:我们有工程 A 依赖 B ,B 依赖 C ,C的版本为 1.1
工程A 依赖 D ,D 依赖 C, C的版本为 1.2
如果 A 同时将 B D 导入jar包,可能就会引起jar包的冲突,此时我们需要在A工程中指定排除 B或D之一 中的C jar包;
<!-- A 工程依赖 -->
<dependency>
<!-- 指定的B或D 工程依赖 -->
<groupId>com.fourfaith.framework</groupId>
<artifactId>fourfaith-dubbo</artifactId>
<exclusions>
<!-- 配置具体排除信息 排除A依赖B或D中的jar -->
<!-- 排除log4j1的方式 -->
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<!-- 排除logback的方式 -->
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖的继承(父子工程)
创建父工程
只有打包方式为 pom 的才能作为父工程,我们在这个工程当中是不写业务代码的,只是用来管理其他子工程
<packaging>pom</packaging>
<!-- 父工程中添加 modules 子工程聚合到父工程 -->
<modules>
<module>子工程1的artifactId</module>
<module>子工程2的artifactId</module>
<module>子工程3的artifactId</module>
</modules>
在父工程中执行mvn命令,其子工程全部都会进行执行,maven会自动根据依赖关系先后执行,不会出现找不到依赖的问题(除非是你根本就没有依赖);
父工程中统一管理依赖信息
<dependencyManagement>
<dependencies>
<dependency>
<!-- 子工程通用该依赖的版本,子工程里面还是要写上该依赖的信息但是版本号不用了 -->
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<!-- 父工程中的依赖版本,必须指定 -->
<version>3.1.1</version>
</dependency>
</dependencies>
</dependencyManagement>
对于已经在父工程中管理的依赖,子工程可以不用写version,默认使用父工程依赖版本;但是如果子工程指定了version,且和父工程不一致,那就会以子工程版本version为主;
子工程
子工程中添加指向父工程的坐标
<parent>
<artifactId>父工程的工程id</artifactId>
<groupId>com.yuge</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<!-- 子工程依赖未指定版本,就用父工程的version,父工程如果没这个依赖那就会报错了 -->
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
</dependency>
</dependencies>
子工程的groupid和version如果和父工程一样,那么子工程pom.xml文件可以省略掉这两个;
自定义标签
在
<!-- 例 -->
<properties>
<yuge.title>6.6.6-SNAPSHOT</yuge.title>
</properties>
<dependencites>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${yuge.title}</version>
</dependency>
</dependencites>
maven的三个生命周期
生命周期相互间命令独立,每个生命周期中都有很多命令,执行一个命令就会把该周期内的全部命令执行一遍;
-
clean
-
site
-
Default
微服务:每个服务都可以独立部署,服务间通过网络进行连接;
pom的四层结构
超级pom -> 父pom -> 当前pom -> 有效pom;
每个pom都有超级pom,如果没有修改,则默认用的都是超级pom,里面内容可以随便找个文档看下;
属性的声明与引用
最常用的自定义属性
// 直接在<properties>标签中自定义一个变量
<properties>
<yuge.shuai>yuge zhen shuai</yuge.shuai>
</properties>
// pom文件中就可以直接使用表达式获取值
${yuge.shuai}
使用maven访问整个项目系统(包括当前服务器)的属性
${name}
${env.name}
${project.}
${project.modules[0]}
${settings.localRepository}
// 编写一下Java代码,并输出
public static void main(String[] args) {
Properties properties = System.getProperties();
Set<Object> objects = properties.keySet();
for (Object object : objects) {
String property = properties.getProperty((String) object);
System.out.println(object + " : " + property);
}
}
// 输出结果
java.runtime.name : Java(TM) SE Runtime Environment
sun.boot.library.path : D:\jdk1.8\bin
java.vm.version : 25.40-b25
java.vm.vendor : Oracle Corporation
java.vendor.url : http://java.oracle.com/
path.separator : ;
java.vm.name : Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg : sun.io
user.country : CN
user.script :
sun.java.launcher : SUN_STANDARD
sun.os.patch.level :
java.vm.specification.name : Java Virtual Machine Specification
user.dir : D:\javaWorkSpace\yuge-maven
java.runtime.version : 1.8.0_40-b25
java.awt.graphicsenv : sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs : D:\jdk1.8\lib\endorsed
os.arch : amd64
java.io.tmpdir : C:\Users\dell\AppData\Local\Temp\
line.separator :
java.vm.specification.vendor : Oracle Corporation
user.variant :
os.name : Windows 8.1
sun.jnu.encoding : GBK
java.library.path : D:\jdk1.8\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files\Common Files\Oracle\Java\javapath;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;D:\git\Git\cmd;D:\mysql\mysql-8.0.26-winx64\bin;D:\nodejs\;D:\tortoiseGit\bin;D:\bin;C:\Program Files\dotnet\;D:\Xshell\;D:\Xftp\;D:\python;D:\maven\apache-maven-3.6.1\bin;D:\python\Scripts\;D:\python\;C:\Users\dell\AppData\Local\Microsoft\WindowsApps;C:\Users\dell\AppData\Roaming\npm;.
java.specification.name : Java Platform API Specification
java.class.version : 52.0
sun.management.compiler : HotSpot 64-Bit Tiered Compilers
os.version : 6.3
user.home : C:\Users\dell
user.timezone : Asia/Shanghai
java.awt.printerjob : sun.awt.windows.WPrinterJob
file.encoding : UTF-8
java.specification.version : 1.8
java.class.path : D:\jdk1.8\jre\lib\charsets.jar;D:\jdk1.8\jre\lib\deploy.jar;D:\jdk1.8\jre\lib\ext\access-bridge-64.jar;D:\jdk1.8\jre\lib\ext\cldrdata.jar;D:\jdk1.8\jre\lib\ext\dnsns.jar;D:\jdk1.8\jre\lib\ext\jaccess.jar;D:\jdk1.8\jre\lib\ext\jfxrt.jar;D:\jdk1.8\jre\lib\ext\localedata.jar;D:\jdk1.8\jre\lib\ext\nashorn.jar;D:\jdk1.8\jre\lib\ext\sunec.jar;D:\jdk1.8\jre\lib\ext\sunjce_provider.jar;D:\jdk1.8\jre\lib\ext\sunmscapi.jar;D:\jdk1.8\jre\lib\ext\sunpkcs11.jar;D:\jdk1.8\jre\lib\ext\zipfs.jar;D:\jdk1.8\jre\lib\javaws.jar;D:\jdk1.8\jre\lib\jce.jar;D:\jdk1.8\jre\lib\jfr.jar;D:\jdk1.8\jre\lib\jfxswt.jar;D:\jdk1.8\jre\lib\jsse.jar;D:\jdk1.8\jre\lib\management-agent.jar;D:\jdk1.8\jre\lib\plugin.jar;D:\jdk1.8\jre\lib\resources.jar;D:\jdk1.8\jre\lib\rt.jar;D:\javaWorkSpace\yuge-maven\maven-01\target\classes;D:\intellijIDEA\IntelliJ IDEA 2020.1.1\lib\idea_rt.jar
user.name : dell
java.vm.specification.version : 1.8
sun.java.command : com.yuge.maven.Hello
java.home : D:\jdk1.8
sun.arch.data.model : 64
user.language : zh
java.specification.vendor : Oracle Corporation
awt.toolkit : sun.awt.windows.WToolkit
java.vm.info : mixed mode
java.version : 1.8.0_40
java.ext.dirs : D:\jdk1.8\lib\ext;C:\Windows\Sun\Java\lib\ext
sun.boot.class.path : D:\jdk1.8\lib\resources.jar;D:\jdk1.8\lib\rt.jar;D:\jdk1.8\lib\sunrsasign.jar;D:\jdk1.8\lib\jsse.jar;D:\jdk1.8\lib\jce.jar;D:\jdk1.8\lib\charsets.jar;D:\jdk1.8\lib\jfr.jar;D:\jdk1.8\classes
java.vendor : Oracle Corporation
file.separator : \
java.vendor.url.bug : http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding : UnicodeLittle
sun.cpu.endian : little
sun.desktop : windows
sun.cpu.isalist : amd64
// 以上的信息都可以用maven获取,直接在pom.xml文件中使用 ${name} 获取即可
// 例 sun.cpu.isalist : amd64
直接在pom.xml文件中使用 ${sun.cpu.isalist} 获取
// 获取环境变量,需要加个前缀'env.' ${env.name} ,例:获取Java环境变量
${env.JAVA_HOME} // 这个 JAVA_HOME 是自己配在自己环境里面的
访问当前pom文件里面的指定属性
直接通过pom文件的一级标签
// 例:获取当前工程的项目id
${project.artifaceId}
通过下标访问
// 当前modules里面有两个
<modules>
<module>maven-01</module>
<module>maven-02</module>
</modules>
// 使用下标 0 访问第一个
${project.modules[0]}
通过使用settings来访问maven的全局配置(settings.xml文件中的东西)
// 查看本地仓库信息
${settings.localRepository}
build 标签
就是用来构建的,放些插件的
版本仲裁
就是maven自动处理jar包冲突,但前提是,要把jar包识别成只是版本号不同的jar包,但有时候相同的jar包,但是版本号不同,它就识别不出来,因此 ‘版本仲裁’ 处理jar包冲突有局限性,还是要专门进行处理;
路径近优先
例:
A -> B -> C -> spring 1.1
A -> D -> spring 1.2
A 工程依赖了两个spring的版本,他会选取离他路劲近的版本,即: spring1.2;
路径相同时,先声明优先
例:
A -> B -> spring 1.1
A -> C -> spring 1.2
A 工程依赖的两个spring版本路径一样,看在标签
profile标签
在pom文件中,除了
<profiles>
<profile>
<!-- id 唯一标识 -->
<id>dev</id>
<!-- 当前profile被激活或所采纳的配置,在springboot项目中可直接链接到application.yml文件中 -->
<properties>
<profiles.active>dev</profiles.active>
</properties>
<!-- 激活方式 -->
<activation>
<!-- 默认激活 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
</profile>
</profiles>
图上配置,我们就可以直接在springboot- application.yml文件中指定我们所需要的配置文件
spring:
profiles:
active: @profiles.active@
maven的settings.xml文件中也可以配置
nexus 私服
nexus依赖jdk,记得安装;
去下载nexus-linux安装包;
服务器上解压打开
# 打开解压后的nexus文件夹,到bin目录下 pwd: /home/nexus/nexus-2.11.2-03/bin
# 运行nexus
./nexus start
# 如果提示以下错误
****************************************
WARNING - NOT RECOMMENDED TO RUN AS ROOT
****************************************
If you insist running as root, then set the environment variable RUN_AS_USER=root before running this script.
# 意思是需要设置环境变量 export RUN_AS_USER=root
# 那就修改下配置
vim /etc/profile
# 在文件最后一层加上
export RUN_AS_USER=root
# 加载配置
source /etc/profile
# 然后再启动nexus
./nexus start
# over 这个程序启动的比较慢,要一二三分钟
# 看看程序是否启动
netstat -anp | grep nexus
netstat -anp | grep Java
netstat -ntulp | grep 8081 # 好像默认的是8081端口
启动成功直接浏览器 ip:8081 测试即可,看得到就OK,看不到去nexus/logs/ 这里面看日志;
nexus上的仓库类型
- proxy 某个远程仓库的代理;
- group 存放:通过nexus获取的第三方jar包;
- hosted 存放:我们自己部署到nexus上的jar包;
nexus上的仓库名称
- maven-central nexus对maven中央仓库的代理;
- maven-public nexus默认创建,供开发人员下载的组仓库;
- maven-releases nexus默认创建,供开发人员自己上传的仓库,版本要求为release 正式版本;
- maven-snapshots nexus默认创建,供开发人员自己上传的仓库,版本要求为snapshot 快照版本;
pom文件中配置nexus地址
<!-- nexus私服下载配置 -->
<repositories>
<repository>
<id>maven-public</id>
<name>Nexus Repository</name>
<url>http://ip:8081/repository/maven-public/</url>
</repository>
</repositories>
将nexus中央仓库地址设置为阿里云
配置了私服,那我们本地maven配置的中央仓库地址就不会生效了,需要在私服上配置中央仓库地址maven-central -> Repostories;
http://maven.aliyun.com/nexus/content/groups/public
nexus匿名访问
如果安装nexus成功,启动后访问浏览器,第一次会提示是否允许匿名访问,如果允许匿名访问的话,就不需要下面的操作了,如果不允许,需要配置账号密码
需要在settings.xml文件中配置私服的账号密码
<servers>
<server>
<id>maven-public 这个id就是maven-public的id</id>
<username>账号</username>
<password>密码</password>
</server>
</servers>
之后再下载jar包,他会在私服上也下载一份,也会在我们本地仓库下载一份,very good;
jar包部署到私服
<!-- nexus私服上传配置 -->
<distributionManagement>
<repository>
<!-- 私服发布到 快照版本 -->
<id>maven-snapshots</id>
<name>Nexus Repository</name>
<url>http://ip:8081/repository/maven-snapshots/</url>
</repository>
</distributionManagement>
// 部署命令
mvn deploy
jar包冲突
解决方式
- 找到jar包,通过
排除掉; - idea的maven-helper插件;
- maven的enforcer插件;