Maven仓库查询
- https://mvnrepository.com/
-
Mac 配置Maven
点击查看配置
通过brew install安装应用最先是放在/usr/local/Cellar/目录下。
为了提高下载依赖速度可以配置国内镜像,比如阿里云
打开Maven配置/usr/local/Cellar/maven/3.8.1/libexec/conf/settings.xml
在标签中添加如下 <mirror><id>aliyun</id><name>aliyun</name><url>https://maven.aliyun.com/repository/public</url><mirrorOf>central</mirrorOf></mirror>
如果想更改下载本地仓库的位置
修改settings.xml文件的如下位置//Default: ${user.home}/.m2/repository<localRepository>/path/to/local/repo</localRepository>
Maven能解决什么问题?
任何技术都应该解决某些问题而产生的,Maven解决什么问题?
Jar包的下载、升级、依赖、冲突
一个项目可能会依赖很多Jar包
如果Mybatis依赖了Junit,而我们项目里面也依赖了Junit,现在Mybatis需要升级,升级后的Junit是5.0版本,而我们项目里面的Junit没有升级是3.0,这样就会产生冲突,你需要手动的搞一下找到一个合适的jar替换。麻烦
- 部署方便
我们的项目做完之后,打个jar给别人就可以上线了吗?这是不行的,我们开发的代码是在Windows或Mac上运行的,而上线的代码是要运行在Linux上的,它们的环境不同,结果也是不一样的,即使装个和服务器一模一样的虚拟机也是不一样的。虚拟机不能完全模拟线上环境。我们正常的做法是把开发完的源代码放到服务器上,重新编译、打包、部署。而在Linux服务器上装一个IDEA编译打包是不现实的,而Linux上也没有IDEA这种图形化开发工具。
- 不同IDEA项目共享问题
不同的IDEA创建出来的项目结构是不同的,如果使用Eclipsec创建出来的项目是不能直接导入到Intellij IDEA 里面的,同样使用Intellij IDEA创建出来的项目是不能导入到Eclipsec里面的。而Maven采用约定大于配置的思想(Convention over Configuation),会创建默认的项目结构。
- 单元测试的问题
Maven可以做到自动化的运行项目里面的所有单元测试类,告诉你哪些通过单元测试,哪些没有通过。
Maven
什么是Maven
Maven就是一款工具用于管理项目的,Maven是使用Java编写的,以面向对象的方式对项目进行管理。在Maven看来一个项目就是一个对象模型(Project Object Model)。
既然一个项目就是一个对象,那么作为一个对象应该有相应的属性和行为吧。Maven规定属性和行为需要开发者写一个pom.xml的文件,在这里面定义属性和行为,然后Maven去加载这个配置文件即可。
使用Maven创建的目录结构
Maven采用约定大于配置的思想(Convention over Configuation),一个使用Maven管理的普通Java项目,它的目录结构默认如下:
a-maven-project //工程名|├── pom.xml ------> Maven核心配置|├── src| |│ ├── main| | |│ │ ├── java ------> 源代码| | || | |│ │ └── resources ------> 资源| |│ └── test| |│ ├── java ------> 测试源代码| |│ └── resources ------> 测试资源||└── target ------> 所有编译、打包生成的文件都放在这里。如jar、war等
如果是web项目,目录结构如下,多了一个webapp项目资源
a-maven-project //工程名|├── pom.xml|├── src| |│ ├── main| | || | |── webapp ------> web项目资源| | |│ │ ├── java| | || | |│ │ └── resources| |│ └── test| |│ ├── java| |│ └── resources||└── target
Maven核心配置pom.xml
<?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"><!-- 该pom文件的版本号,不同的版本号标识该文件能写哪些标签--><modelVersion>4.0.0</modelVersion><!-- groupId、artifactId、version组成一个maven坐标,用于确定哪个公司下面的哪个项目的哪个版本号--><!-- 组织公司名称、一般用域名的倒写--><groupId>com.lff</groupId><!--项目名称 --><artifactId>test1</artifactId><!--项目的版本号--><version>1.0-SNAPSHOT</version><!--打包方式默认是jar,web工程打包为war,Java工程打包为jar --><packaging>war</packaging><!--属性信息比如字符编码等 --><properties><!--字符编码 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!--Maven项目的JDK版本 --><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><!-- 依赖--><dependencies><!-- 具体的一个依赖--><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency></dependencies><!--构建信息比如插件配置等--><build><finalName>demo1</finalName></build></project>
下载依赖时先去本地仓库查找,如果没有就去远程中央仓库下载,下载后会放入本地仓库中。至于本地路径在哪和远程中央仓库的地址是什么?取决于maven的配置。比如安装maven时,有个setting.xml(位置/usr/local/Cellar/maven/3.8.1/libexec/conf/settings.xml)配置文件
本地仓库地址
<!-- localRepository| The path to the local repository maven will use to store artifacts.|| Default: ${user.home}/.m2/repository<localRepository>/path/to/local/repo</localRepository>-->
远程中央仓库地址
<mirrors><!-- mirror| Specifies a repository mirror site to use instead of a given repository. The repository that| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.|<mirror><id>mirrorId</id><mirrorOf>repositoryId</mirrorOf><name>Human Readable Name for this Mirror.</name><url>http://my.repository.com/repo/path</url></mirror>--><mirror><id>maven-default-http-blocker</id><mirrorOf>external:http:*</mirrorOf><name>Pseudo repository to mirror external repositories initially using HTTP.</name><url>http://0.0.0.0/</url><blocked>true</blocked></mirror></mirrors>
关于仓库的概念,这个视频介绍的比较好
点击查看【bilibili】
安装本地jar包到Maven的本地仓库(LocalRepository)
有这样一种场景:有个大神写了一个很好用的jar包,但没有上传Maven的中央仓库,而是上传到自己的个人的网站上面。这时你想使用该库,也想使用Maven这种简单的方式依赖该库,该怎么做?
可以下载该jar包,然后把下载后的jar包安装到本地仓库,在pom.xml中依赖配置就可以了。
直接在终端输入如下命令即可
mvn install:install-file-Dfile=jar包路径-DgroupId=组织-DartifactId=项目-Dversion=版本号-Dpackaging=jar
Maven下载的依赖包安装到本地仓库的目录结构
比如安装druid包
<!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.7</version></dependency>
Maven下载到本地仓库后。存放在
com文件夹 —-> alibaba文件夹 —-> druid文件夹 —-> 1.2.7文件夹下面
dependency中的scope的取值
依赖范围:依赖的jar默认情况下可以在任何地方使用,可以使用scope标签设定其作用范围
<dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version><scope>compile</scope></dependency>
比如上面的依赖有个scope选项,我们给的值为compile。
作用范围
- 主程序范围有效(main文件夹范围内)

- 测试程序范围有效(test文件夹范围内)

- 是否参与打包(package指令范围内)。这个比较特殊表示打包时对应的依赖是否应该打进去
| scope的值 | 主程序范围有效 | 测试程序范围有效 | 打包 | 例子 |
|---|---|---|---|---|
| compile 默认值 | Y | Y | Y | log4j |
| test | Y | junit (只需要测试阶段使用即可) | ||
| provided | Y | Y | servlet-api (如果打包会与服务端Tomcat里面的servlet-api冲突) | |
| runtime | Y | jdbc |
