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 |