Notes

SSM | 01 从Maven开始

🌸Author Echo Pan


✨Echo有话说

开始之前,我们先搭建一个junit测试环境,junit是测试单元,支持@Test注解的使用,通过该注解可以不必在main函数里运行程序,代码如下:

package demo1;

import org.junit.Test;//导入junit的包

public class TestClass {
    public static void main(String[] args) {
        System.out.println("从Main函数中运行");
    }
    
    @Test
    public void testFun(){
        System.out.println("利用@Test运行函数");
    }
}

使用@Test后,会在代码编辑框左侧出现运行的小箭头,即可运行代码。

不过我们首先要新建一个Maven工程来做上面这件事,如果使用IDEA,那么可能会要求你输入项目的group idartifact id

然后在项目配置文件pom.xml中添加依赖:

<!--  依赖组  -->
    <dependencies>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <!--  依赖项  -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

如何获得依赖项的有关信息呢,这里推荐一个资源库网站: https://mvnrepository.com

找到最多人使用的一个版本,然后把配置信息复制过来就行啦,jar包及其依赖包会由系统自动下载并导入。

1. Maven

如果我们不使用Maven,就需要自己把有关的jar包导入到项目里。而使用Maven后,只要在pom.xml项目配置文件中写入相关的依赖包就会自动从网络下载包到项目了。

定位: 基于POM的项目管理工具
作用: 提供框架
两要素: 1.POM;2.资源库

1.1. POM

Project Object Model,项目对象模型,一个XML文件,包含了项目的基本信息。

类似的模型还有DOM,文档对象模型;BOM,浏览器对象模型等。

2. 资源库

资源库,就是依赖项的来源,可以分为本地库和远程库,远程库又可细分为中央库、私服和其它公共库。

2.1. 本地仓库

在第一次运行Maven时被创建,文件名是.m2,用于存储Maven从网络下载的依赖。

其默认路径为${user.home}/.m2/repository,可以通过修改Maven的配置文件来更改目录。

IDEA中,配置文件的路径为plugins/maven/lib/maven3/conf/settings.xml,打开并修改<localRepository>标签的内容为要更改的目录即可。

<!-- settings.xml -->
<localRepository>D:/Maven/repository</localRepository>

2.2. 中央仓库

中央仓库是远程库的核心,也是默认的远程库。

POM中配置好依赖后,系统会自动从中央库中查找对应的jar包及其依赖包并下载到本地库。

默认的中央库地址: https://repo1.maven.org/maven2

中央库搜索引擎: https://search.maven.org/

所有Maven项目都会继承超级POM,一般把包含以下配置的POM称为超级POM

<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>

可以在settings.xml文件中为中央库设置镜像站(配置<mirror>标签),镜像站将作为依赖下载的首选服务器。

<!-- settings.xml -->
<!-- settings.xml 中的配置全局有效 -->
<!-- 以阿里云 Maven 仓库为例 -->
<mirror>
  <!-- 镜像站的id -->
  <id>aliyunmaven</id>
  <!-- 要替换的仓库的id,因为要替换中央库,所以填central -->
  <mirrorOf>central</mirrorOf>
  <!-- 镜像站的名称 -->
  <name>阿里云公共仓库</name>
  <!-- 镜像站的地址 -->
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

2.3. 私服

私服仓库,即私有服务器,由开发人员自行定制,是架设在局域网中的特殊远程库,作为外部远程库的代理。

当需要下载依赖时,直接请求私服,私服上存在则下载到本地库;否则私服就请求外部远程库,将依赖下载到私服,再提供给本地库。

2.4. 其它公共库

Maven无法在中央库中找到某些依赖时,它会停止构建过程并报错,其它公共库解决了该问题,如JBoss Maven,而且有些公共库比默认的中央库访问速度更快。

JBoss库的引入举例:

<!-- pom.xml -->
<repositories>
  <repository>
    <id>JBoss repository</id>
    <url>http://repository.jboss.org/nexus/content/groups/public/</url>
  </repository>
</repositories>

下面是参数更全的配置:

<repositories>  
  <repository>  
      <id>jboss</id>  
      <name>JBoss Repository</name>  
      <url>http://repository.jboss.com/maven2/</url>  
      <releases>  
          <!--表示更新的频率,值有:never, always,interval,daily, daily 为默认值-->
          <updatePolicy>daily</updatePolicy><!-- never,always,interval n -->  
          <enabled>true</enabled>  
          <!-- 表示maven检查和检验文件的策略,warn为默认值-->
          <checksumPolicy>warn</checksumPolicy><!-- fail,ignore -->  
      </releases>  
      <snapshots>  
          <enabled>false</enabled>  
      </snapshots>  
      <layout>default</layout>  
  </repository>  
</repositories>

id: 仓库声明的唯一标识,中央库的idcentral,当其它库也声明为central时会覆盖中央库配置

releases: 下载发行版控件,比较稳定

snapshots: 下载开发版(快照)控件,由于尚处于开发阶段,更新频繁,不稳定

enabled: 控制使用发行版 or 开发版

layout: 仓库布局,默认值default,表示使用Maven2Maven3的布局;legacy(遗留),Maven1是不同的布局方式,基本不会用到

updatePolicy: 检查更新的频率,默认值daily,表示每天。永不never,构建时always,间隔X分钟interval: X

checksumPolicy: 检查校验和文件的策略,下载构件时,Maven会验证校验和文件。如果验证失败,默认值warn,表示输出警告信息。使构建失败fail,忽略验证ignore


2.5. 远程库配置

远程库可以在pom.xmlsettings.xml以及build.gradle中进行配置。

gradle的配置方式可以参考这篇文章:Gradle安装和使用Maven仓库配置

2.5.1. 通过profile配置库

如果远程库由多个项目共用,可以在settings.xml中配置全局的远程库,对应的标签为<profiles><profile><repository><profile>主要用于不同环境下的个性配置,需要激活生效。

profile可以配置在POM、用户settings以及全局settings中,其中用户settings一般位于.m2目录下,没有的话可以手动创建一个。

不同profile中可以声明的POM元素是不一样的,pom.xml可以提交到代码库中,它可以添加和修改很多的POM元素。而settings.xml由于无法同项目一起发布,能配置的POM元素相对少一些,避免影响项目的正常构建。


2.5.2. profile的激活

关于激活,浅讲一下,详细请看 profile配置管理及激活profile的几种方式

每个profile都有其唯一的id,通过以下配置显式指定profile默认处于激活状态:

<settings>
    <activeProfiles>
        <!-- 对应profile的id -->
        <activeProfile>id of profile</activeProfile>
    </activeProfiles>
</settings>

也可以在profile中设置默认激活:

<profiles>
    <profile>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
</profiles>

注意: <activeByDefault>只在未显式指定profile激活时生效,若有任何profile通过其他方式被激活,则该配置自动失效

2.6. 认证信息

大部分公共库没有访问限制,但如果是开发者自己架设的库,出于安全考虑,往往需要提供认证信息才能访问。pom.xml一般会被提交到代码仓库供所有成员访问,而settings.xml只存在于本地,认证信息必须配置在settings.xml,也因此更加安全。

<!-- settings.xml -->
<servers>  
    <server>
        <!-- 与POM中对应远程库的id相同 -->
        <id>same with repository id in pom</id> 
        <username>username</username>  
        <password>pwd</password>  
    </server>  
</servers>

2.7. 匹配顺序

local_repo > settings_profile_repo > pom_profile_repo > pom_repository > settings_mirror >central

精简来看是:本地库 > 远程库 > (镜像库)中央库

如果镜像库的mirrorOf属性值为星号*,则只从该仓库获取依赖

mirrorOf的更多解释请参考文章:maven访问仓库的顺序


远程库大全搞懂Repository

2.8. 资源下载失败解决方案

将本地库中jar包删除重下,或者更换使用的版本


上一章:00.开始之前

下一章:02.开始之前

返回目录