Maven仓库查询

  • https://mvnrepository.com/
  • https://search.maven.org/

    Mac 配置Maven

    点击查看配置
    通过brew install安装应用最先是放在/usr/local/Cellar/目录下。
    为了提高下载依赖速度可以配置国内镜像,比如阿里云
    打开Maven配置/usr/local/Cellar/maven/3.8.1/libexec/conf/settings.xml
    标签中添加如下

    1. <mirror>
    2. <id>aliyun</id>
    3. <name>aliyun</name>
    4. <url>https://maven.aliyun.com/repository/public</url>
    5. <mirrorOf>central</mirrorOf>
    6. </mirror>

    如果想更改下载本地仓库的位置
    修改settings.xml文件的如下位置

    1. //Default: ${user.home}/.m2/repository
    2. <localRepository>/path/to/local/repo</localRepository>

    Maven能解决什么问题?

    任何技术都应该解决某些问题而产生的,Maven解决什么问题?

  • Jar包的下载、升级、依赖、冲突

一个项目可能会依赖很多Jar包
Maven - 图1
如果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项目,它的目录结构默认如下:

  1. a-maven-project //工程名
  2. |
  3. ├── pom.xml ------> Maven核心配置
  4. |
  5. ├── src
  6. | |
  7. │ ├── main
  8. | | |
  9. │ │ ├── java ------> 源代码
  10. | | |
  11. | | |
  12. │ │ └── resources ------> 资源
  13. | |
  14. │ └── test
  15. | |
  16. │ ├── java ------> 测试源代码
  17. | |
  18. │ └── resources ------> 测试资源
  19. |
  20. |
  21. └── target ------> 所有编译、打包生成的文件都放在这里。如jar、war等

如果是web项目,目录结构如下,多了一个webapp项目资源

  1. a-maven-project //工程名
  2. |
  3. ├── pom.xml
  4. |
  5. ├── src
  6. | |
  7. │ ├── main
  8. | | |
  9. | | |── webapp ------> web项目资源
  10. | | |
  11. │ │ ├── java
  12. | | |
  13. | | |
  14. │ │ └── resources
  15. | |
  16. │ └── test
  17. | |
  18. │ ├── java
  19. | |
  20. │ └── resources
  21. |
  22. |
  23. └── target

Maven核心配置pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <!-- 该pom文件的版本号,不同的版本号标识该文件能写哪些标签-->
  6. <modelVersion>4.0.0</modelVersion>
  7. <!-- groupId、artifactId、version组成一个maven坐标,用于确定哪个公司下面的哪个项目的哪个版本号-->
  8. <!-- 组织公司名称、一般用域名的倒写-->
  9. <groupId>com.lff</groupId>
  10. <!--项目名称 -->
  11. <artifactId>test1</artifactId>
  12. <!--项目的版本号-->
  13. <version>1.0-SNAPSHOT</version>
  14. <!--打包方式默认是jar,web工程打包为war,Java工程打包为jar -->
  15. <packaging>war</packaging>
  16. <!--属性信息比如字符编码等 -->
  17. <properties>
  18. <!--字符编码 -->
  19. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  20. <!--Maven项目的JDK版本 -->
  21. <maven.compiler.source>8</maven.compiler.source>
  22. <maven.compiler.target>8</maven.compiler.target>
  23. </properties>
  24. <!-- 依赖-->
  25. <dependencies>
  26. <!-- 具体的一个依赖-->
  27. <dependency>
  28. <groupId>javax.servlet</groupId>
  29. <artifactId>jstl</artifactId>
  30. <version>1.2</version>
  31. </dependency>
  32. </dependencies>
  33. <!--构建信息比如插件配置等-->
  34. <build>
  35. <finalName>demo1</finalName>
  36. </build>
  37. </project>

下载依赖时先去本地仓库查找,如果没有就去远程中央仓库下载,下载后会放入本地仓库中。至于本地路径在哪和远程中央仓库的地址是什么?取决于maven的配置。比如安装maven时,有个setting.xml(位置/usr/local/Cellar/maven/3.8.1/libexec/conf/settings.xml)配置文件
本地仓库地址

  1. <!-- localRepository
  2. | The path to the local repository maven will use to store artifacts.
  3. |
  4. | Default: ${user.home}/.m2/repository
  5. <localRepository>/path/to/local/repo</localRepository>
  6. -->

远程中央仓库地址

  1. <mirrors>
  2. <!-- mirror
  3. | Specifies a repository mirror site to use instead of a given repository. The repository that
  4. | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
  5. | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
  6. |
  7. <mirror>
  8. <id>mirrorId</id>
  9. <mirrorOf>repositoryId</mirrorOf>
  10. <name>Human Readable Name for this Mirror.</name>
  11. <url>http://my.repository.com/repo/path</url>
  12. </mirror>
  13. -->
  14. <mirror>
  15. <id>maven-default-http-blocker</id>
  16. <mirrorOf>external:http:*</mirrorOf>
  17. <name>Pseudo repository to mirror external repositories initially using HTTP.</name>
  18. <url>http://0.0.0.0/</url>
  19. <blocked>true</blocked>
  20. </mirror>
  21. </mirrors>

关于仓库的概念,这个视频介绍的比较好
点击查看【bilibili】

安装本地jar包到Maven的本地仓库(LocalRepository)

有这样一种场景:有个大神写了一个很好用的jar包,但没有上传Maven的中央仓库,而是上传到自己的个人的网站上面。这时你想使用该库,也想使用Maven这种简单的方式依赖该库,该怎么做?
可以下载该jar包,然后把下载后的jar包安装到本地仓库,在pom.xml中依赖配置就可以了。
直接在终端输入如下命令即可

  1. mvn install:install-file
  2. -Dfile=jar包路径
  3. -DgroupId=组织
  4. -DartifactId=项目
  5. -Dversion=版本号
  6. -Dpackaging=jar

Maven下载的依赖包安装到本地仓库的目录结构

比如安装druid包

  1. <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>druid</artifactId>
  5. <version>1.2.7</version>
  6. </dependency>

Maven下载到本地仓库后。存放在
com文件夹 —-> alibaba文件夹 —-> druid文件夹 —-> 1.2.7文件夹下面

dependency中的scope的取值

依赖范围:依赖的jar默认情况下可以在任何地方使用,可以使用scope标签设定其作用范围

  1. <dependency>
  2. <groupId>javax.servlet</groupId>
  3. <artifactId>jstl</artifactId>
  4. <version>1.2</version>
  5. <scope>compile</scope>
  6. </dependency>

比如上面的依赖有个scope选项,我们给的值为compile。

作用范围

  • 主程序范围有效(main文件夹范围内)

image.png

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

image.png

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