🌸Author Echo Pan
开始之前,我们先搭建一个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 id
和artifact id
。
main
目录中java
的包结构,如com.example.test
MyTestProject
然后在项目配置文件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包及其依赖包会由系统自动下载并导入。
如果我们不使用Maven
,就需要自己把有关的jar
包导入到项目里。而使用Maven
后,只要在pom.xml
项目配置文件中写入相关的依赖包就会自动从网络下载包到项目了。
定位: 基于POM
的项目管理工具
作用: 提供框架
两要素: 1.POM;2.资源库
Project Object Model,项目对象模型,一个XML文件,包含了项目的基本信息。
类似的模型还有DOM
,文档对象模型;BOM
,浏览器对象模型等。
资源库,就是依赖项的来源,可以分为本地库和远程库,远程库又可细分为中央库、私服和其它公共库。
在第一次运行Maven
时被创建,文件名是.m2
,用于存储Maven
从网络下载的依赖。
其默认路径为${user.home}/.m2/repository
,可以通过修改Maven
的配置文件来更改目录。
在IDEA
中,配置文件的路径为plugins/maven/lib/maven3/conf/settings.xml
,打开并修改<localRepository>
标签的内容为要更改的目录即可。
<!-- settings.xml -->
<localRepository>D:/Maven/repository</localRepository>
中央仓库是远程库的核心,也是默认的远程库。
在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>
私服仓库,即私有服务器,由开发人员自行定制,是架设在局域网中的特殊远程库,作为外部远程库的代理。
当需要下载依赖时,直接请求私服,私服上存在则下载到本地库;否则私服就请求外部远程库,将依赖下载到私服,再提供给本地库。
当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: 仓库声明的唯一标识,中央库的id
为central
,当其它库也声明为central
时会覆盖中央库配置
releases: 下载发行版控件,比较稳定
snapshots: 下载开发版(快照)控件,由于尚处于开发阶段,更新频繁,不稳定
enabled: 控制使用发行版 or 开发版
layout: 仓库布局,默认值default
,表示使用Maven2
和Maven3
的布局;legacy
(遗留),Maven1
是不同的布局方式,基本不会用到
updatePolicy: 检查更新的频率,默认值daily
,表示每天。永不never
,构建时always
,间隔X分钟interval: X
checksumPolicy: 检查校验和文件的策略,下载构件时,Maven
会验证校验和文件。如果验证失败,默认值warn
,表示输出警告信息。使构建失败fail
,忽略验证ignore
远程库可以在pom.xml
、settings.xml
以及build.gradle
中进行配置。
gradle
的配置方式可以参考这篇文章:Gradle安装和使用Maven仓库配置
profile
配置库如果远程库由多个项目共用,可以在settings.xml
中配置全局的远程库,对应的标签为<profiles><profile><repository>
,<profile>
主要用于不同环境下的个性配置,需要激活生效。
profile可以配置在POM
、用户settings
以及全局settings
中,其中用户settings
一般位于.m2
目录下,没有的话可以手动创建一个。
不同profile
中可以声明的POM
元素是不一样的,pom.xml
可以提交到代码库中,它可以添加和修改很多的POM
元素。而settings.xml
由于无法同项目一起发布,能配置的POM
元素相对少一些,避免影响项目的正常构建。
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
通过其他方式被激活,则该配置自动失效
大部分公共库没有访问限制,但如果是开发者自己架设的库,出于安全考虑,往往需要提供认证信息才能访问。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>
local_repo > settings_profile_repo > pom_profile_repo > pom_repository > settings_mirror >central
精简来看是:本地库 > 远程库 > (镜像库)中央库
如果镜像库的mirrorOf
属性值为星号*
,则只从该仓库获取依赖
mirrorOf
的更多解释请参考文章:maven访问仓库的顺序
将本地库中jar
包删除重下,或者更换使用的版本