ja-week12-day59-maven

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oZxsC2k3-1599440597894)(Pictures/logo.jpg)]

Author:Shine

Version:9.0.2

文章目录

一、引言


1.1 项目管理问题

项目中jar包资源越来越多,jar包的管理越来越沉重。

1.1.1 繁琐

要为每个项目手动导入所需的jar,需要搜集全部jar

1.1.2 复杂

项目中的jar如果需要版本升级,就需要再重新搜集jar

1.1.3 冗余

相同的jar在不同的项目中保存了多份

1.2 项目管理方案

java项目需要一个统一的便捷的管理工具:Maven

二、介绍


Maven这个单词来自于意第绪语(犹太语),意为知识的积累.

Maven是一个基于项目对象模型(POM)的概念的纯java开发的开源的项目管理工具。主要用来管理java项目,进行依赖管理(jar包依赖管理)和项目构建(项目编译、打包、测试、部署)。此外还能分模块开发,提高开发效率。

三、Maven安装


3.1 下载Maven

下载Maven

http://us.mirrors.quenda.co/apache/maven/maven-3/3.5.4/binaries/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GjkTxgVV-1599440598856)(Pictures/download.jpg)]
3.2 Maven安装
3.2.1 解压

注意: 解压文件尽量不要放在含有中文或者特殊字符的目录下。

解压后,有如下目录:

`bin:含有mvn运行的脚本`
`boot:含有plexus-classworlds类加载器框架,Maven 使用该框架加载自己的类库。`
`conf:含有settings.xml配置文件`
`lib:含有Maven运行时所需要的java类库`
3.2.2 环境变量

maven依赖java环境,所以要确保java环境已配置好 (maven-3.3+ 需要jdk7+)

maven本身有2个环境变量要配置:

`MAVEN_HOME = maven的安装目录`
`PATH = maven的安装目录下的bin目录`
3.2.3 测试

查看maven版本信息

mvn -v

四、Maven配置


4.1 本地仓库

maven的conf目录中有 settings.xml ,是maven的配置文件,做如下配置:

<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
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
  <!-- 选择一个磁盘目录,作为本地仓库 -->
  <localRepository>D:\Program Files\maven\myrepository</localRepository>
4.2 JDK配置

标签中 增加 一个 标签,限定maven项目默认的jdk版本.

内容如下:

<profiles>
    <!-- 在已有的profiles标签中添加profile标签 -->
	<profile>    
        <id>myjdk</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>
<!-- 让增加的 profile生效 -->
<activeProfiles>
    <activeProfile>myjdk</activeProfile>
</activeProfiles>

五、仓库


5.1 概念
  • 存储依赖的地方,体现形式就是本地的一个目录。

  • 仓库中不仅存放依赖,而且管理着每个依赖的唯一标识(坐标),Java项目凭坐标获取依赖。

5.2 仓库分类

仓库分类如下:

仓库分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jd0Kyn6C-1599440598858)(Pictures/仓库分类.jpg)]

当需要依赖时,会从仓库中取查找,优先顺序为:

本地仓库 > 私服(如果配置了的话) > 公共仓库(如果配置了的话) > 中央仓库

5.3 本地仓库

即在settings.xml 中配置的目录。

使用过了的依赖都会自动存储在本地仓库中,后续可以复用。

5.4 远程仓库
5.4.1 中央仓库
  • Maven 中央仓库是由 Maven 社区提供的仓库,不用任何配置,maven中内置了中央仓库的地址。

    其中包含了绝大多数流行的开源Java构件。

  • https://mvnrepository.com/ 可以搜索需要的依赖的相关信息(仓库搜索服务)

    http://repo.maven.apache.org/maven2/ 中央仓库地址

5.4.2 公共仓库【重点
  • 除中央仓库之外,还有其他远程仓库。
    比如aliyun仓库(http://maven.aliyun.com/nexus/content/groups/public/)

  • 中央仓库在国外,下载依赖速度过慢,所以都会配置一个国内的公共仓库替代中央仓库。

<!--setting.xml中添加如下配置-->
<mirrors>
	<mirror>
        <id>aliyun</id>  
        <!-- 中心仓库的 mirror(镜像) -->
        <mirrorOf>central</mirrorOf>    
        <name>Nexus aliyun</name>
        <!-- aliyun仓库地址 以后所有要指向中心仓库的请求,都会指向aliyun仓库-->
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>  
    </mirror>
</mirrors>
5.4.3 私服【了解】

公司范围内共享的仓库,不对外开放。

可以通过 Nexus来创建、管理一个私服。

六、Idea-Maven


6.1 在Idea中关联Maven

在idea中关联本地安装的maven,后续就可以通过idea使用maven,管理项目啦。

在全局设置中,关联Maven
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y2KlCnpf-1599440598859)(Pictures/idea关联maven.jpg)]
6.2 创建Maven项目
6.2.1 新建项目

新建项目,要选择 Maven 选项

如下选项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CiRvXE4Z-1599440598860)(Pictures/创建maven项目1.jpg)]
6.2.2 指定项目名
设置项目名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0eCuxI0Y-1599440598862)(Pictures/创建maven项目2.jpg)]
6.2.3 项目位置
项目位置如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1WpqaPPz-1599440598863)(Pictures/创建maven项目3.jpg)]
6.2.4 项目结构
  • src/main/java 存放源代码,建包,放项目中代码(service,dao,User,…)

  • src/main/resources 书写配置文件,项目中的配置文件(jdbc.properties)

  • src/test/java 书写测试代码,项目中测试案例代码

  • src/test/resources 书写测试案例相关配置文件

  • 目根/pom.xml (project object model) maven项目核心文件,其中定义项目构建方式,声明依赖等

  • 注意:项目中的建包,建类,执行,都和普通项目无差异

项目结构如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qkRrCX6F-1599440598864)(Pictures/创建maven项目5.jpg)]
6.2.5 项目类型

根据项目类型,在pom.xml中做出对应配置,添加配置:war/jar

<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.qf</groupId>
    <artifactId>test01</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 打包方式,如果是java项目则用 jar,
         如果是web项目则用war -->
    <!--<packaging>war</packaging>-->
    <packaging>jar</packaging>
</project>
6.3 导入依赖jar

建好项目后,需要导入需要的jar,要通过坐标

  • 每个构件都有自己的坐标 = groupId + artifactId + version = 项目标识 + 项目名 + 版本号

  • 在maven项目中只需要配置坐标,maven便会自动加载对应依赖。删除坐标则会移除依赖

6.3.1 查找依赖

依赖查找服务:https://mvnrepository.com/ ,获得依赖的坐标,在maven项目中导入。

查找依赖坐标
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SXPHAj29-1599440598865)(Pictures/依赖搜索.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DIj8bqeD-1599440598865)(Pictures/依赖搜索2.jpg)]
6.3.2 导入依赖

在项目的pom文件中,增加依赖

在项目的pom.xml文件添加依赖
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ONn1Wwce-1599440598866)(Pictures/依赖搜索3.jpg)]
6.3.3 同步依赖

引入坐标后,同步依赖,确认导入。

窗口右下角弹窗,刷新依赖,使新加的配置被maven加载
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4y52Xmvc-1599440598867)(Pictures/创建maven项目4.jpg)]

####6.4 创建web项目

6.4.1 打包方式

pom.xml中设置 war

web项目打包方式为:war
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R8X77fkT-1599440598868)(Pictures/web项目1.jpg)]
6.4.2 web依赖

导入 JSPServletJSTL依赖,使项目具有web编译环境

<?xml version="1.0" encoding="UTF-8"?>
<project ...>
    ...
    <packaging>war</packaging>

	<!-- 导入JSP 和 Servlet 和 JSTL 依赖 -->
    <dependencies>
        <dependency>
            <!-- jstl 支持 -->
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <!-- servlet编译环境 -->
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <!-- jsp编译环境 -->
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>
6.4.3 webapp目录

按照maven规范,新建web项目特有目录

新建如下目录和文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WUTt2Jvg-1599440598869)(Pictures/web项目2.jpg)]
<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
         version="4.0">
	<!-- 这是一个空白的web.xml文件模板 -->
</web-app>
6.4.4 定义Servlet和Jsp
照常定义即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9iJ1kvjv-1599440598870)(Pictures/web项目3.jpg)]
6.5 部署web项目
6.5.1 新增Tomcat
新增Tomcat
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W3F2kcuj-1599440598870)(Pictures/web项目4-新建tomcat.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bi8RwACF-1599440598871)(Pictures/web项目5-新建tomcat2.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wGBx9jmf-1599440598872)(Pictures/web项目6-新建tomcat3.jpg)]
6.5.2 部署web项目
部署web项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o8wKTnRs-1599440598873)(Pictures/web项目7-新建tomcat4.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iqvMM4xM-1599440598874)(Pictures/web项目8-新建tomcat5.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-klTwPBJd-1599440598874)(Pictures/web项目9-新建tomcat6.jpg)]
6.5.3 启动Tomcat
启动Tomcat
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eF6RZjdX-1599440598875)(Pictures/web项目10-启动Tomcat.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YKY0tdfZ-1599440598876)(Pictures/web项目11-访问servlet.jpg)]
6.6 依赖生命周期
6.6.1 概念

Jar包生效的时间段,即Jar的生命周期

6.6.2 使用方式

项目中导入的依赖可以做生命周期的管理

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
    <!-- 生命周期 -->
    <scope>compile</scope>
</dependency>
<dependency>
    <!-- servlet编译环境 -->
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <!-- 生命周期 -->
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <!-- 生命周期 -->
    <scope>test</scope>
</dependency>
6.6.3 生命周期详解
标识周期
compile缺省值,适用于所有阶段(测试运行,编译,运行,打包)
provided类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet-api.jar;适用于(测试运行,编译)阶段
runtime只在运行时使用,如 mysql的驱动jar,适用于(运行,测试运行)阶段
test只在测试时使用,适用于(编译,测试运行)阶段,如 junit.jar
systemMaven不会在仓库中查找对应依赖,在本地磁盘目录中查找;适用于(编译,测试运行,运行)阶段

七、Maven指令


7.1 命令行

通过Idea打开 cmd,然后执行Maven指令

打开 cmd,并定位到项目目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RjITkjZa-1599440598877)(Pictures/maven指令.jpg)]
执行maven指令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RxRMGk3j-1599440598877)(Pictures/maven指令2.jpg)]
7.2 Maven面板

Idea中有Maven面板,其中可以快速执行Maven指令

maven面板
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qc9LfbRw-1599440598878)(Pictures/maven指令3.jpg)]

八、私服


8.1 概念
  • 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。

  • 有了私服之后,当 Maven 需要下载依赖时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。

  • 私服可以解决在企业做开发时每次需要的jar包都要在中心仓库下载,且每次下载完只能被自己使用,不能被其他开发人员使用

  • 所谓私服就是一个服务器,但是不是本地层面的,是公司层面的,公司中所有的开发人员都在使用同一个私服

8.2 架构
无私服有私服
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ESjTVRMo-1599440598879)(Pictures/私服1.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lndkl342-1599440598879)(Pictures/私服2.png)]

我们可以使用专门的 Maven 仓库管理软件来搭建私服,比如:Apache ArchivaArtifactorySonatype Nexus。这里我们使用 Sonatype Nexus

8.3 Nexus安装【了解】
8.3.1 下载
8.3.2 安装

下载nexus-2.x-bundle.zip,解压即可

nexus安装目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-22KjcJ5v-1599440598880)(Pictures/私服3.jpg)]
8.4 启动【了解】
  • 解压后在bin目录中执行:
    • nexus install 在系统中安装nexus服务
    • nexus uninstall 卸载nexus服务
    • nexus start 启动服务
    • nexus stop 停止服务
8.5 Nexus登录【了解】

访问私服:http://localhost:8081/nexus/

登录Nexus才可以使用Nexus管理功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QINfW2uP-1599440598880)(Pictures/私服_login.jpg)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tVZdhmhp-1599440598881)(Pictures/私服_login2.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ieRymgS7-1599440597896)(E:\照片\typora\image-20200904222327192.png)]

8.6 仓库列表【了解】
仓库类型描述
group包含多个仓库,通过group库的地址可以从包含的多个仓库中查找构件
hosted私服 服务器本地的仓库,其中存储诸多构件
proxy代理仓库,其会关联一个远程仓库, 比如中央仓库,aliyun仓库,向该仓库查找构件时,如果没有会从其关联的仓库中下载
仓库名描述
Releases存放项目的稳定发布版本,一个模块做完后如果需要共享给他人,可以上传到私服的该库
Snapshots对应不稳定的发布版本
3rd party存放中央仓库没有的 ,如ojdbc.jar,可以上传到私服的该库中
仓库列表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YH96kkot-1599440598881)(Pictures/私服_list.jpg)]
8.7 Maven配置私服 【重点

在maven中配置私服,使得maven可以从私服上获取构件

8.7.1 仓库组

而此时就有问题,私服中有很多仓库,每个仓库都有自己的url,则项目中配置哪个仓库呢 ?

私服中有一个仓库组,组中包含多个仓库,可以指定仓库组的url,即可从多个仓库中获取构件

仓库组 注意:proxy的仓库排序在最后
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UZdtyZ5K-1599440598882)(Pictures/私服_deploy2.jpg)]
8.7.2 Maven关联私服

配置settings.xml,设置私服地址、认证等信息

<servers>
	<server> 
		<id>nexus-public</id> <!-- nexus的认证id -->
		<username>admin</username> <!--nexus中的用户名密码-->
		<password>admin123</password> 
	</server>
</servers>
<profiles>
	<profile> 
        <id>nexus</id> 
        <repositories> 
            <repository> 
                <id>nexus-public</id> <!--nexus认证id 【此处的repository的id要和 <server>的id保持一致】-->
                <!--name随便-->
                <name>Nexus Release Snapshot Repository</name> 
                <!--地址是nexus中仓库组对应的地址-->
                <url>http://localhost:8081/nexus/content/groups/public/</url>
                <releases><enabled>true</enabled></releases> 
                <snapshots><enabled>true</enabled></snapshots> 
            </repository>
        </repositories> 
        <pluginRepositories> <!--插件仓库地址,各节点的含义和上面是一样的-->
            <pluginRepository> 
                <id>nexus-public</id> <!--nexus认证id 【此处的repository的id要和 <server>的id保持一致】-->
                <!--地址是nexus中仓库组对应的地址-->
                <url>http://localhost:8081/nexus/content/groups/public/</url>
                <releases><enabled>true</enabled></releases> 
                <snapshots><enabled>true</enabled></snapshots> 
            </pluginRepository> 
        </pluginRepositories> 
    </profile>
</profiles>
<activeProfiles>
    <activeProfile>yourjdk</activeProfile>
    <!-- 使私服配置生效 -->
    <activeProfile>nexus</activeProfile>
</activeProfiles>

至此,Maven项目中需要依赖时,Maven会从私服中下载

8.8 Maven项目部署到私服
  • 执行 :mvn deploy 即可将项目部署到私服对应的仓库中,此时项目中的打包方式多为jar

  • 但需要提前在项目的pom.xml中配置部署私服仓库位置,如下:

    ...
	<dependencies>
		.....
	</dependencies>
	
	<!-- 在项目的pom.xml中 配置私服的仓库地址,可以将项目打jar包部署到私服 -->
	<distributionManagement>
        <repository>
            <id>nexus-public</id> <!-- nexus认证id -->
            <url>http://localhost:8081/nexus/content/repositories/releases</url>
        </repository>
        <snapshotRepository>
            <id>nexus-public</id> <!-- nexus认证id -->
            <url>http://localhost:8081/nexus/content/repositories/snapshots</url>
        </snapshotRepository>
	</distributionManagement>
</project>

注意:如上的 repository的 id 依然是要和settings.xml中配置的server中的id 一致,才能通过私服的认证

九.打可运行jar包

  • 打jar包 可运行的jar

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <!-- 对要打的jar包进行配置 -->
        <configuration>
            <!-- Configuration of the archiver -->
            <archive>
    
                <!--生成的jar中,不要包含pom.xml和pom.properties这两个文件-->
                <addMavenDescriptor>false</addMavenDescriptor>
                <!-- Manifest specific configuration -->
                <manifest>
                    <mainClass>com.qianfeng.MyMain</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>
    

十.maven配置文件详解

Settings.xml

maven在执行的过程中需要加载一些配置信息, 这些配置信息都记录在Settings.xml文件中.所以, 我们想要了解maven的运行机制, 就需要弄清楚这些配置项

多配置文件

在maven中, 可以有多个配置文件, 这些配置文件被存放在不同的位置上

  • 全局配置文件: 存放在maven的conf文件夹下, 如果运行时没有特殊指明, 用的就是这个配置文件

  • 用户配置文件: 用户自定义位置,默认在{user}/.m2/ 下, 如果每个用户需要不同的配置,可以从/maven/conf/下复制一份出来放到指定位置上,但是执行命令的时候要加上用户配置文件的具体位置, 例如:

    mvn -B archetype:generate -DgroupId=com.loong -DartiftId=cc -s /Users/spring/Desktop/work/settings.xml
    
配置文件标签详解
localRepository: 下载的jar包存放的位置

默认位置是${users}/.m2/repo/

<localRepository>/Users/spring/Desktop/maven/repo</localRepository>
interactiveMode: 是否开启于用户的交互

默认是true
如果开启了, 那么我们就可以分步输入内容, 可以先输入创建项目命令,等需要的时候再输入项目的groupId,artifactId等等
如果没有开启, 就输需要将所有的参数一次性组装到一条命令中. 当然,即使开启了交互, 我们依然可以一次性输入所有的命令参数, 所以默认是开启的

<interactiveMode>true</interactiveMode>
usePluginRegistry: 是否应该使用plugin-registry.xml文件来管理插件版本

默认是false, 这里要说明,其实mavne的插件也是jar包, 如果我们需要自己管理插件jar包的版本, 那么可以设置为true.
plugin-registry.xml的位置和settings.xml一致, 也可以放在${user}/.m2/下

<interactiveMode>true</interactiveMode>
offline: 是否开启离线

默认false, 官方文档中说是如果开启离线模式的话,任何时候都不会去联网中央仓库, 只是使用本地的仓库
实际使用中发现, mavn在导入包的时候,首先会去查找本地仓库是否存在,然后去中央仓库检查本地的文件和中央仓库是否一致,如果有缺失,会将缺失部分补充上. 如果开始了离线模式, 那么就不会再去中央仓库检查了, 本地有就用,本地没有或者文件缺失就报错.
这里有个小问题, 即使我们在全部配置文件中配置了offline为true, 但是如果我们在执行命令的时候不去指定配置文件的话, offline模式依然失效,原因未知 . 其他配置项目没有问题.

mvn compile -s /Users/spring/Desktop/work/maven/apache-maven-3.6.0/conf/settings.xml

idea中offline模式没有问题, 估计是直接执行的命令,而且不是读取的配置文件

proxies/proxy*: 配置代理地址

有些jar的地址被屏蔽了, 或者公司为了安全原因只能让网页通过代理来上网, 这时就可以使用代理. 让maven去连接去连接代理服务器,而不是直接连接中央仓库.
测试中发现, 其实如果你的电脑中已经启用了代理软件的话, 这个完全就没有必要了

id: 唯一标示 默认 default
active: 是否启用 false/true , 默认true
protocol: 协议 默认http
username: 代理服务器的用户名
password: 代理服务器的密码
host: 主机地址
port: 端口号
nonProxyHosts: 不适用代理的地址 如果有多个, 用|分割
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
servers/server* : 设置服务器用户名密码 主要是用于上传jar包

比如deploy生命周期就是讲jar复制到远程仓库和所有人共享, 如果远程设置了用户名和密码,这里就需要设置Server了
还可以把项目热部署到服务器

//把项目赋值到nexus私服上去,id是自己取得唯一id,username和password是nexus上登录账户和密码
<server>
      <id>nexus</id>
      <username>admin</username>
      <password>hcs19980205</password> 
</server>
username: 用户名
password: 密码
privateKey: 用于进行身份验证的私钥的位置
passphrase: 用户和私钥一起验证的密码
filePermissions: 文件创建时的权限,这里是数字,对应unix系统的权限
directoryPermissions: 创建目录时的目录权限,这里是数字,对应unix系统的权限
configuration: 传输时的额外配置信息,具体用法尚不清晰
id: 唯一标示 默认 default
mirrors/mirror*: 设置maven中央仓库的位置
mirrorOf: 代替的仓库id

这里简单说明一下, 中央仓库或者我们搭建的私服都是有很多个库的,当我们要去下载的时候是会去去某个库里下载, 这是如果配置了代替的私服, 以后只要是去中央仓库的这个库下载的jar包都会被重定向到我们自己配置的地址

name: 私服的名称
url: 私服的地址
layout: 设置要镜像存储库的布局 , 具体用法未知
mirrorOfLayouts:设置被镜像的存储库的布局, 具体用法未知
id: 唯一标志
<mirror>
        <id>aliyun</id>  //自己的唯一id
        <mirrorOf>central</mirrorOf>  //maven原本中央仓库的id  
        <name>Nexus aliyun</name>  //自己取得名字
    //代替中央仓库的远程仓库网络地址,这里是使用阿里云的仓库代替中央仓库
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>   </mirror>
profiles/profile*: maven的配置参数,主要用来设定一些maven运行时的参数

settings.xml和pom.xml中都可以设置

activation: 这个元素中有多个子项,当这些子项条件符合是,这个profile就会被激活
  • activeByDefault: 是否默认激活, 默认值false

  • JDK: jdk的版本

  • os: 操作系统

    <os>
        <name>Windows XP</name>
        <family>Windows</family>
        <arch>x86</arch>
        <version>5.1.2600</version>
    </os>
    
  • property: 如果maven检测到一个属性值和这里配置的相吻合,这个profile就会激活,例如 mavenVersion=2.0.3

    <property>
        <name>mavenVersion</name>
        <value>2.0.3</value>
    </property>
    
  • file: existence的文件存在,或者missing的文件不存在,profile将激活

    <file>
        <exists>${basedir}/file2.properties</exists>
        <missing>${basedir}/file1.properties</missing>
    </file>
    
properties: 用来设置全局使用的值, 可以被别的地方以 #{key}的形式引用
<property.name>property.value</property.name>
repositories/repository*: 远程仓库配置
  • releases, snapshots:稳定版本或快照版本对应的配置
  • enabled:true或者false。对应版本的仓库是否可用
  • updatePolicy:更新策略。它指定了多长时间更新一次,maven经常比较本地pom和远程pom的时间戳。它的选项有:always、daily(默认)、
  • interval:X(X是分钟)、never。
  • checksumPolicy:当maven部署文件到仓库时,它还会部署相对应的checksum文件。选项有:ignore, fail, 或 warn,在checksum丢失或不正确的情况下执行
  • layout:在上面的配置中,它们都跟随一个公共的布局。这在大多数情况下是正确的.Maven 2有一个仓库的默认布局,但是maven 1.x有一个不同的布局 使用这个元素可以选择使用哪个版本的布局,default 或 legacy
activeProfiles/activeProfile*: 激活配置文件 ,只需要配置文件的id就可以了
<activeProfiles>
    <activeProfile>env-test</activeProfile>
  </activeProfiles>
pluginGroups/pluginGroup*: 插件仓库

仓库有两种主要的类型。第一种是工件作为依赖,常说的jar包依赖。第二种是插件,maven的插件是一种特殊类型的工件,正因如此,maven把插件类型的仓库 单独提了出来。pluginRepositories的元素和repositories的元素非常的相似,它指定一个远程插件仓库的地址,可以在那里找到相应的maven插件

十一.pom配置文件详解

引言

如果你用过maven, 那绝对不可能不知道pom.xml文件, 这个文件才真的maven项目的核心, 他让我们节省了大量的时间和空间. 在这个文件中, 我们可以配置需要的java包, 父项目等等

Super POM

其实我有的时候我们什么都不写, maven其实也知道去哪里下载jar包, 这些都是因为每个项目的POM文件都有一个父POM, 就是maven 3.6的超级pom文件
其实我们可以看作是一些默认设置, 这些设置是可以被覆盖的, 也就是说当前项目中的内容会覆盖超级POM中的设置, 而且settings文件中的设置也会覆盖掉其设置
在maven的lib文 件夹中有maven-model-builder-x.x.x.jar,打开就能看到对应版本的超级pom文件

<?xml version="1.0" encoding="UTF-8"?>

<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<!-- START SNIPPET: superpom -->
<project>
  <modelVersion>4.0.0</modelVersion>

  <repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

  <build>
    <directory>${project.basedir}/target</directory>
    <outputDirectory>${project.build.directory}/classes</outputDirectory>
    <finalName>${project.artifactId}-${project.version}</finalName>
    <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
    <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
    <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
    <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>${project.basedir}/src/test/resources</directory>
      </testResource>
    </testResources>
    <pluginManagement>
      <!-- NOTE: These plugins will be removed from future versions of the super POM -->
      <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.3</version>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.2-beta-5</version>
        </plugin>
        <plugin>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.8</version>
        </plugin>
        <plugin>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.5.3</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

  <reporting>
    <outputDirectory>${project.build.directory}/site</outputDirectory>
  </reporting>

  <profiles>
    <!-- NOTE: The release profile will be removed from future versions of the super POM -->
    <profile>
      <id>release-profile</id>

      <activation>
        <property>
          <name>performRelease</name>
          <value>true</value>
        </property>
      </activation>

      <build>
        <plugins>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-sources</id>
                <goals>
                  <goal>jar-no-fork</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-javadoc-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-javadocs</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-deploy-plugin</artifactId>
            <configuration>
              <updateReleaseInfo>true</updateReleaseInfo>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

</project>
<!-- END SNIPPET: superpom -->
POM文件标签
project : 根标签
modelVersion : 模型版本

需要设置4.0
网上没有找到关于这个设定的解释, 综合考虑, 这应该是maven的文档和解析模板,也就说, 当解析工具读取到4.0只有, 就会按照事先约定好的顺原则解析当前pom文件, 并执行相应的操作

groupId : 工程的组织id
artifactId : 工程工件的id

一般也是工程的名称

version : 工程的版本号
packaging : 打包的类型

默认是jar, 也可以设置为war, 聚合项目时,父工程的设置应该是pom

parent : 父工程
  • groupId 父工程的组织id
  • artifactId 父工程的工件id
  • version 父工程的版本号
  • relativePath 工程的路径, 这个值不是必须的, 只在我们引入本地项目时使用
dependencies/dependencie* : 引入依赖,其实就是引入jar包
  • groupId 工程的组织id

  • artifactId 工程的工件id

  • version 工程的版本号

  • type 工程的类型, jar war 默认是jar

  • scope 生命周期
    这里需要特别说明,只有打成war包时, 这些依赖才会加入包中,如果是jar包 无论哪个生命周期,都不会将依赖包打包进去, 如果需要, 必须使用打包插件

    • test 测试 测试范围的依赖(第三方jar)

      针对测试相关代码的编译和运行,在通常代码的编译和运行时都不需要,只有在有关测试的代码编译和运行测试代码阶段可用
      这里可能要多解释一点, 当一个依赖包scop是test的时候, 这个jar包是不会讲main文件夹的java当做根目录的,只会讲test下的java当做根目录, 所以我们在main中无法使用这个包

    • compile 编译

      该依赖需要参与当前项目的编译、测试、运行、打包, 请注意,这个是默认生命周期, 虽然compile的意思是编译, 但是四个生命周期她都参与

    • runtime 表示依赖无需参与当前项目的编译,但是后期的运行和测试需要参与

      不参与编译能运行成功吗??与 compile 相比,跳过编译而已 比如,你可能在编译的时候需要 JDBC API JAR,只有在 运行时才需要 JDBC 貌似是编译时该包不参与,运行时参与

    • provided 表明该依赖已经提供

      比如服务器容器tomcat已经提供了 Servlet的jar, 我们只是需要开发时导入,真正打成war包时不会被打入包中

    • system 被依赖项不会从maven仓库下载,而是从本地系统指定路径下寻找,需要 systemPath 属性

  • systemPath 设置依赖项的本地路径(必须是绝对路径), 必须将scope设置为system, 否则会报错

  • optional 可选的 设置指依赖是否可选,默认为false,即子项目默认都继承:为true,则子项目必需显示的引入,与dependencyManagement里定义的依赖类似

  • exclusions/exclusion* 屏蔽jar包, 屏蔽当前要引入的项目所依赖的jar包,比如当前项目引入 A , A 又依赖B, 但是我们觉得B的版本已经过时了, 我们需要自己引入新版本, 就可以使用这个标签. 还是 groupId, artifactId version 三个标签

Properties : 自定有的参数

可以做为当前pom项其他标签的参数,使用方式类似于EL表达式 标签名就是key

    <properties>
        <jarversion>4.11</jarversion>
    </properties>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${depversion}</version>
        <scope>test</scope>
    </dependency>
build : 设置项目结构和插件等

这里需要说明, pom配置文件中有两个build标签, 一个就project根目录下的, 一个是profile标签的, 当前这就是project下的, 全局生效, 另一个则只是局部生效

  • defaultGoal 默认执行的阶段

    当我们调用build命令的时候, 如果没有特殊指明那个阶段, 就默认使用这里设置的阶段

  • directory build命令目标文件的存放目录

    默认在${basedir}/target目录

  • finalName build目标文件的名称

    默认情况为 a r t i f a c t I d − {artifactId}- artifactId{version}

  • filters/filter* 加载配置properties配置文件

    配置文件的默认位置是src/main/filters目录下, 当我们加载了配置文件之后, 在resources标签配置下的配置文件在打包复制的过程中,配置文件中的${name}会被替换掉,springboot就是基于这种设置

    jj=1.1
    
    <my>
        <m>${jj}</m>
    </my>
    
    <my>
        <m>1.1</m>
    </my>
    
  • resources/resource* 配置源文件和编译之后的位置, 一般针对的是配置文件

    这里做一些解释, 比如我们使用框架的时候, 一般都会有很多的配置文件, 我们写代码的时候使用的maven布局, 真正打包之后, 配置文件所在位置就不一样了, 这里就是指明maven布局下配置文件的位置和打包之后配置文件的位置, 不光如此, 在复制配置文件的过程, 还可以使用properties文件中的值代替掉配置文件中引用
    不光如此, 比如还有静态文件的位置等等

    • ==directory:此元素的值定义静态文件的位置。==构建的默认目录是${basedir}/src/main/resources
    • targetPath: 目标地址, 项目编译之后源文件存放的目录
    • filter: true/false , 是否使用过滤器, 和上面的filters标签搭配使用
    • includes/include: 指定要使用的文件, 可以使用 * 作为通配符
    • excludes/exclude*: 排除指定文件,如果include和exclude指向了同一个文件,exclude生效
  • testResources 和resources类似,指定的是测试时的文件

  • plugins/plugin* 配置插件

    • groupId artifact version 配置插件的组织id 工件id 版本号

    • extensions:true/false 默认是false,是否加载插件的扩展功能

      这里需要注意, 扩展功能是pom文件中单独配置的, 这个标签只是指明说当前插件工作时,是否启用扩展功能
      比如说, 我们maven有打包插件, 打包之后如果想要直接部署到服务器就必须要启用远程传输这个扩展功能, 那么这里就要设置为true了

    • inherited 当前插件是否会被子项目继承 , 默认是false

    • configuration 当前插件需要的参数, 这里的标签是自定义的,标签名就是参数名, 标签内的值就是参数值

    • dependencies/dependencie* 引入的插件可能需要依赖包, 我们可以在这里替换到默认的依赖包

    • executions/execution 非常强大的功能, 这里吐槽一下, 中国人记笔记真的是…垃圾

    我们要想执行插件的功能, 需要输入插件的特有命令, 比如我们使用的tomcat热部署插件, 想要部署的话就要运行 tomcat:deploy命令, 这些命令和maven的原始build命令是分开的, 也就是说我们单独执行例如package命令, 插件的作用是不生效的, 所以, 通过这个配置, 我们可以将插件的命令绑定到maven的构建命令中, 这样, 当我们指定build的命令时就可以连带着执行插件的命令

    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <server>tomcat1</server>
          <url>http://127.0.0.1:8080/manager/text</url>
          <path>/${project.artifactId}</path>
        </configuration>
        <executions>
          <execution>
            <id>cc</id>
            <goals>
              <!--插件的命令 -->
              <goal>deploy</goal>
            </goals>
            <!--maven的命令-->
            <phase>compile</phase>
            <inherited>false</inherited>
            <configuration>
              
            </configuration>
          </execution>
        </executions>
      </plugin>
    
        
        id:唯一标示
        goals/goals: 插件的命令
        phase: maven的命令
        inherited: 是否被子项目继承 默认是false
        configuration: 插件命令执行是的一些参数, 这有这个execution生效时才有用, 详细的说明就是,当我们将插件的命令绑定maven的命令上时, 执行maven的命令, 插件的命令会连带着执行, 这是这些参数才会起作用
    
  • pluginManagement

    • plugins/plugin 这个和上面的plugins有一定却别

    上的那个是可以被当前项目使用,也可以和直接被子类继承, 这里的这个是可以被当前项目直接使用,但是如果子类想要使用的话, 必须在子类的plugin中重新引用,但是可以不必指定版本号
    主要用在统一版本号上

十二.maven传递依赖jar包冲突的问题

maven中直接依赖的jar包需要依赖jar包才能使用,这时候就会引入传递依赖jar,如果两个直接依赖的jar需要的依赖jar包一样,但是版本不一样,这时候就会产生jar包冲突

比如spring-context的jar包5.3导入时,会自动导入依赖jar包spring-core版本5.3
而spring-bean的jar包4.3导入时,也会自动导入依赖jar包spring-core,但是版本是4.3
而maven项目只会引入一个版本的spring-core版本,这个时候就会产生jar包冲突

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r93PoSOO-1599440597897)(E:\照片\typora\image-20200905213233040.png)]

这是解决方案三

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8RMDSDZY-1599440597899)(E:\照片\typora\image-20200905213354433.png)]

总结

  1. maven

    项目依赖管理

    maven项目可以转换为其他项目格式

  2. maven的运行流程

    先去本地仓库找需要jar包, 找不到去远程仓库下载

    默认的本能地仓库 用户目录下的 .m2文件夹下

  3. settings 文件的配置

    本地仓库位置

    server标签

    mirror 配置镜像

  4. pom文件

    modelVersion
    groupId
    artifactId
    version

    packaging : pom jar war

    properties

    dependencies/dependency

    dependencyManagement/dependencies/dependency

    distributionManagement /repository snapshotRepository

    build/plugins/plugin

  5. 命令

    clean : 清理

    package : 打包

    install : 部署到本地

    deploy : 部署到远程仓库

  6. scope

    jar包的生命周期

    表明当前jar存在的时间

  7. nexus库的安装使用

    下载软件, 解压

    找到 nexus-3xx /bin 运行 nexus /install nexus /start (启动时间较长, 稍等)

的话, 必须在子类的plugin中重新引用,但是可以不必指定版本号

主要用在统一版本号上

十二.maven传递依赖jar包冲突的问题

maven中直接依赖的jar包需要依赖jar包才能使用,这时候就会引入传递依赖jar,如果两个直接依赖的jar需要的依赖jar包一样,但是版本不一样,这时候就会产生jar包冲突

比如spring-context的jar包5.3导入时,会自动导入依赖jar包spring-core版本5.3
而spring-bean的jar包4.3导入时,也会自动导入依赖jar包spring-core,但是版本是4.3
而maven项目只会引入一个版本的spring-core版本,这个时候就会产生jar包冲突

[外链图片转存中…(img-r93PoSOO-1599440597897)]

这是解决方案三

[外链图片转存中…(img-8RMDSDZY-1599440597899)]

总结

  1. maven

    项目依赖管理

    maven项目可以转换为其他项目格式

  2. maven的运行流程

    先去本地仓库找需要jar包, 找不到去远程仓库下载

    默认的本能地仓库 用户目录下的 .m2文件夹下

  3. settings 文件的配置

    本地仓库位置

    server标签

    mirror 配置镜像

  4. pom文件

    modelVersion
    groupId
    artifactId
    version

    packaging : pom jar war

    properties

    dependencies/dependency

    dependencyManagement/dependencies/dependency

    distributionManagement /repository snapshotRepository

    build/plugins/plugin

  5. 命令

    clean : 清理

    package : 打包

    install : 部署到本地

    deploy : 部署到远程仓库

  6. scope

    jar包的生命周期

    表明当前jar存在的时间

  7. nexus库的安装使用

    下载软件, 解压

    找到 nexus-3xx /bin 运行 nexus /install nexus /start (启动时间较长, 稍等)

    第一次登陆密码 在snapshot /nexus3/admin.password

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值