Maven小总结

概念

项目管理工具
一个对 Maven 比较正式的定义是这么说的:Maven 是一个项目管理工具,它包含了一个项目对象模 型 (POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管 理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标 (goal)的逻辑。

下载&安装

  • 下载,进入https://maven.apache.org
    在这里插入图片描述
  • 安装,直接解压就行了。
    在这里插入图片描述
    bin:存放了 maven 的命令,比如我们前面用到的mvn tomcat:run
    boot:存放了一些 maven 本身的引导程序,如类加载器等
    conf:存放了 maven 的一些配置文件,如 setting.xml 文件
    lib:存放了 maven 本身运行所需的一些 jar 包

环境变量

首先要有Java环境,这就不多说了。其次再配置Maven的环境变量。
在这里插入图片描述

查看版本号

输入mvn -v查看版本号
在这里插入图片描述

Maven仓库

https://mvnrepository.com/

  • 本地仓库用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包, 优先从本地仓库查找 默认本地仓库位置在windows用户目录/.m2/repository

  • 远程仓库(私服)如果本地需要插件或者 jar 包,本地仓库没有,默认去远程仓库下载。 远程仓库可以在互联网内也可以在局域网内

  • 中央仓库一般使用阿里云的中央仓库

  • 在mirrors标签中设置阿里云中央仓库

    1
    2
    3
    4
    5
    6
    <mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
    </mirror>
  • 在profiles标签中设置JDK版本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <profile>
    <id>jdk18</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>

本地仓库配置

在这里插入图片描述

Maven工程目录结构

在这里插入图片描述

生命周期

在这里插入图片描述

概念模型

在这里插入图片描述

IDEA集成Maven

1
-DarchetypeCatalog=internal

在这里插入图片描述

创建工程

  • 创建默认Maven项目
    在这里插入图片描述
  • 使用骨架创建Web项目
    在这里插入图片描述

打包格式

1
2
3
4
<groupId>com.tpf</groupId>
<artifactId>maven-web</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<packaging > :打包类型
jar:执行 package 会打成 jar 包
war:执行 package 会打成 war 包
pom :用于 maven 工程的继承,通常父工程设置为 pom

依赖范围

  • compile:默认依赖范围。会用在 编译、测试、运行,由于运行时需要的依赖会被打包。
  • provided:provided 依赖只有在当 JDK 或者一个容器已提供该依赖之后才使用, provided 依 赖在编译和测试时需要,在运行时不需要,比如:servlet api 运行时由被 tomcat 容器提供,我们就不能指定了。
  • runtime:runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc 的驱动包。由于运行时需要所以 runtime 范围的依赖会被打包。
  • test:test 范围依赖 在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用, 比如:junit。由于运行时不需要所以test范围依赖不会被打包。 
  • system:system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中 JAR 文件的路径,需要指定 systemPath 磁盘路径,不推荐使用。 例如:导入oracle8的jar包

在这里插入图片描述

Maven运行Web项目

测试源码

pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?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.tpf</groupId>
<artifactId>maven-web</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<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>
</properties>

<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<scope>provided</scope>
<version>2.3.3</version>
</dependency>
</dependencies>

<build>
<!--指定打包名称,打包之后就是maven-web.war。因为packaging指定的是war-->
<finalName>maven-web</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--修改端口号-->
<port>8888</port>
<!--修改虚拟目录-->
<path>/a</path>
</configuration>
</plugin>
<plugin>
<!--设置JDK编译版本-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<target>1.8</target>
<source>1.8</source>
<encoding>UTF-8</encoding>
<!--解决:编译失败 Compilation failure 程序包com.sun.xml.internal.bind.v2.model.core不存在-->
<compilerArguments>
<bootclasspath>${JAVA_HOME}/jre/lib/rt.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
</plugins>
</build>

</project>

正常启动

在这里插入图片描述

插件启动

在这里插入图片描述

Debug启动

在这里插入图片描述

导入jar包依赖冲突

maven工程要导入jar包的坐标,就必须要考虑解决jar包冲突。
maven导入jar包中的一些概念:
①直接依赖:项目中直接导入的jar包,就是该项目的直接依赖包。
例如下面的:spring-expression和spring-beans
②传递依赖:项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中去。
例如下面的:spring-core和spring-jcl

1
2
3
4
5
6
7
8
9
10
1. 第一声明优先原则
哪个jar包的坐标在靠上的位置,这个jar包就是先声明的。
先声明的jar包坐标下的依赖包,可以优先进入项目中。

2. 路径近者优先原则
直接依赖路径比传递依赖路径近,那么最终项目进入的jar包会是路径近的直接依赖包。

3. 直接排除法【推荐使用】
当我们要排除某个jar包下依赖包,在配置exclusions标签的时候,内部可以不写版本号。
因为此时依赖包使用的版本和默认和本jar包一样。

在这里插入图片描述

锁定版本

1
2
3
4
5
6
7
8
9
maven工程是可以分父子依赖关系的。
凡是依赖别的项目后,拿到的别的项目的依赖包,都属于传递依赖。

比如:当前A项目,被B项目依赖。那么我们A项目中所有jar包都会传递到B项目中。
B项目开发者,如果再在B项目中导入一套ssm框架的jar包,对于B项目是直接依赖。
那么直接依赖的jar包就会把我们A项目传递过去的jar包覆盖掉。

为了防止以上情况的出现。我们可以把A项目中主要jar包的坐标锁住,那么其他依赖该项目的项目中,
即便是有同名jar包直接依赖,也无法覆盖。

在这里插入图片描述

父子工程改造

  • 简介
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    * 工程(Project)和模块(Modules)的区别
    工程不等于完整的项目,模块也不等于完整的项目,一个完整的项目看的是代码,代码完整,就可以说这是一个完整的项目
    和此项目是工程和模块没有关系。

    工程天生只能使用自己内部资源,工程天生是独立的。后天可以和其他工程或模块建立关联关系。
    模块天生不是独立的,模块天生是属于父工程的,模块一旦创建,所有父工程的资源都可以使用。

    * 继承与依赖的关系
    父子工程直接,子模块天生集成父工程,可以使用父工程所有资源。
    子模块之间天生是没有任何关系的。

    父子工程直接不用建立关系,继承关系是先天的,不需要手动建立。
    平级直接的引用叫依赖,依赖不是先天的,依赖是需要后天建立的。
    本地对应地址:D:\Everything\IDEA\Project\movie\maven_day02_parent
    在线代码分享:代码分享
  • 注意:截图的部分只包括修改的部分,其他内容都是SSM整合案例2_Items中的内容复制的。
    Maven父子工程改造_SSM整合案例2_Items
  • 运行时,可以对parent直接Tomcat7:run启动。如果想通过web模块启动,需要先进行parent的clean,install。
    install这一步会把parent下的子模块进行打包,dao,service是默认的jar,而web是war,install之后,web模块就可以通过Tomcat7:run启动了。
    先进行parent的clean、install,再进行webTomcat7:run启动

私服

nexus私服简介

nexus下载地址
本地安装包:D:\Everything\IDEA\apache-maven-3.3.9\MyServer\nexus-2.12.0-01-bundle.zip
百度网盘:链接: https://pan.baidu.com/s/1Eu2VesCbkx6lTZ5nodjxAw 提取码: 1cm1

  • Maven私服nexus的安装,卸载,启动,配置【使用默认设置即可】
    在这里插入图片描述
  • Maven私服nexus的登录,仓库类型,仓库地址【了解】
    在这里插入图片描述

项目发布到私服

  • setting.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <server>
    <id>releases</id>
    <username>admin</username>
    <password>admin123</password>
    </server>
    <server>
    <id>snapshots</id>
    <username>admin</username>
    <password>admin123</password>
    </server>
  • pom.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!--对此工程进行deploy,部署到私服,并且在setting.xml中也要配置对应的server-->
    <distributionManagement>
    <repository>
    <id>releases</id>
    <url>http://localhost:8081/nexus/content/repositories/releases</url>
    </repository>
    <snapshotRepository>
    <id>snapshots</id>
    <url>http://localhost:8081/nexus/content/repositories/snapshots</url>
    </snapshotRepository>
    </distributionManagement>
    在这里插入图片描述

私服下载jar包

  • setting.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <!-- 下载jar包配置 -->
    <profile>
    <!--profile的id -->
    <id>dev</id>
    <repositories>
    <repository> <!--仓库id,repositories可以配置多个仓库,保证id不重复 -->
    <id>nexus</id> <!--仓库地址,即nexus仓库组的地址 -->
    <url>http://localhost:8081/nexus/content/groups/public/</url> <!--是否下载releases构件 -->
    <releases>
    <enabled>true</enabled>
    </releases> <!--是否下载snapshots构件 -->
    <snapshots>
    <enabled>true</enabled>
    </snapshots>
    </repository>
    </repositories>
    <pluginRepositories> <!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 -->
    <pluginRepository> <!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->
    <id>public</id>
    <name>Public Repositories</name>
    <url>http://localhost:8081/nexus/content/groups/public/</url>
    </pluginRepository>
    </pluginRepositories>
    </profile>

    <!-- 激活 下载jar包配置 -->
    <activeProfiles>
    <activeProfile>dev</activeProfile>
    </activeProfiles>
  • pom.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <repositories>
    <repository>
    <releases>
    <enabled>true</enabled>
    </releases>
    <snapshots>
    <enabled>true</enabled>
    </snapshots>
    <id>public</id>
    <name>Public Repositories</name>
    <url>http://localhost:8081/nexus/content/groups/public/</url>
    </repository>
    <repository>
    <snapshots>
    <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>Central Repository</name>
    <url>https://repo.maven.apache.org/maven2</url>
    </repository>
    </repositories>
    <pluginRepositories>
    <pluginRepository>
    <id>public</id>
    <name>Public Repositories</name>
    <url>http://localhost:8081/nexus/content/groups/public/</url>
    </pluginRepository>
    <pluginRepository>
    <releases>
    <updatePolicy>never</updatePolicy>
    </releases>
    <snapshots>
    <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>Central Repository</name>
    <url>https://repo.maven.apache.org/maven2</url>
    </pluginRepository>
    </pluginRepositories>
    在这里插入图片描述

jar包上传本地

解决 ‘mvn’ 不是内部或外部命令,也不是可运行的程序 或批处理文件

使用CMD命令,使用Windows PowerShell会出错。
①绝对路径mvn install:install-file -DgroupId=www.taopanfeng.top -DartifactId=fastjson -Dversion=1.4 -Dpackaging=jar -Dfile=D:\test\maven\fastjson-1.2.68.jar
②相对路径mvn install:install-file -DgroupId=www.taopanfeng.top -DartifactId=fastjson -Dversion=1.4 -Dpackaging=jar -Dfile=fastjson-1.2.68.jar

然后就会在我的Maven本地仓库D:\Everything\IDEA\apache-maven-3.3.9\repository\www\taopanfeng\top\fastjson\1.4\fastjson-1.4.jar
注意:真正上传之后的jar包名称是:-DartifactId+-+-Dversion+.jar

jar包上传私服

在Maven的setting.xml的servers标签中添加

1
2
3
4
5
<server>
<id>thirdparty</id>
<username>admin</username>
<password>admin123</password>
</server>

①绝对路径mvn deploy:deploy-file -DgroupId=www.taopanfeng.top -DartifactId=fastjson -Dversion=1.4 -Dpackaging=jar -Dfile=D:\test\maven\fastjson-1.2.68.jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty
②相对路径mvn deploy:deploy-file -DgroupId=www.taopanfeng.top -DartifactId=fastjson -Dversion=1.4 -Dpackaging=jar -Dfile=fastjson-1.2.68.jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty
上传之后的jar包所在位置:http://localhost:8081/nexus/content/groups/public/www/taopanfeng/top/fastjson/1.4/fastjson-1.4.jar

2020-04-16 14:25:33整理完了,还要再回顾一下之前SpringBoot,继续整理。