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

自动生成的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} 获取值;

依赖的传递性

pic1

测试依赖的排除

例:我们有工程 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文件中也可以配置,但是本地配置是无法随项目转移的,因此配置尽量都写在pom文件中,会覆盖掉原有的配置;

标签东西太多,需要的百度;

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插件;

学自B站-尚硅谷

https://www.bilibili.com/video/BV12q4y147e4/?p=20&spm_id_from=pageDriver&vd_source=0fda7a666ac4cba829447f82d5c854dc

posted @ 2023-06-14 17:37  窃窃私语QAQ  阅读(3)  评论(0编辑  收藏  举报