maven 仓库

maven 仓库:存储依赖的地方,maven仓库不仅存放依赖,而且每个依赖都有唯一标识(坐标),供 java 项目使用

maven 仓库分类:

maven 配置镜像 - 图1

依赖查找顺序:本地仓库 > 私服(如果配置) > 公共仓库(如果配置) > 中央仓库

  • 本地仓库:setting.xml中配置的目录
  • 中央仓库:由Maven社区提供,不用任何配置,Maven中内置了中央仓库的地址
  • 公共仓库,用于加速,比如阿里云仓库
  • 私服

maven 多项目管理

1、建立一个 maven 工程,packaging 为 pom 类型
2、统一管理依赖和版本号,子工程使用依赖时无需指定版本号,类似 Spring Boot 的父项目
3、父项目的 pom.xml

  1. <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">
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>com.spiritmark.cyf</groupId>
  4. <artifactId>environment</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <packaging>pom</packaging>
  7. <!-- 集中定义依赖版本号 -->
  8. <properties>
  9. <junit.version>4.10</junit.version>
  10. <spring.version>4.2.2.RELEASE</spring.version>
  11. <mybatis.version>3.2.8</mybatis.version>
  12. <mybatis.spring.version>1.2.2</mybatis.spring.version>
  13. <mybatis.paginator.version>1.2.15</mybatis.paginator.version>
  14. <mysql.version>5.1.47</mysql.version>
  15. <slf4j.version>1.6.4</slf4j.version>
  16. <jackson.version>2.4.2</jackson.version>
  17. <druid.version>1.0.9</druid.version>
  18. <httpclient.version>4.3.5</httpclient.version>
  19. <jstl.version>1.2</jstl.version>
  20. <servlet-api.version>2.5</servlet-api.version>
  21. <jsp-api.version>2.0</jsp-api.version>
  22. <joda-time.version>2.5</joda-time.version>
  23. <commons-lang3.version>3.3.2</commons-lang3.version>
  24. <commons-io.version>1.3.2</commons-io.version>
  25. </properties>
  26. <!-- 管理jar包,不会引入 ,如果子工程需要哪些jar包,则具体地在子工程中引入,不过不需要写版本号-->
  27. <dependencyManagement>
  28. <dependencies>
  29. <!-- 单元测试 -->
  30. <dependency>
  31. <groupId>junit</groupId>
  32. <artifactId>junit</artifactId>
  33. <version>${junit.version}</version>
  34. <scope>test</scope>
  35. </dependency>
  36. <!-- Spring -->
  37. <dependency>
  38. <groupId>org.springframework</groupId>
  39. <artifactId>spring-context</artifactId>
  40. <version>${spring.version}</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.springframework</groupId>
  44. <artifactId>spring-beans</artifactId>
  45. <version>${spring.version}</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.springframework</groupId>
  49. <artifactId>spring-webmvc</artifactId>
  50. <version>${spring.version}</version>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.springframework</groupId>
  54. <artifactId>spring-jdbc</artifactId>
  55. <version>${spring.version}</version>
  56. </dependency>
  57. <dependency>
  58. <groupId>org.springframework</groupId>
  59. <artifactId>spring-aspects</artifactId>
  60. <version>${spring.version}</version>
  61. </dependency>
  62. <!-- Mybatis -->
  63. <dependency>
  64. <groupId>org.mybatis</groupId>
  65. <artifactId>mybatis</artifactId>
  66. <version>${mybatis.version}</version>
  67. </dependency>
  68. <dependency>
  69. <groupId>org.mybatis</groupId>
  70. <artifactId>mybatis-spring</artifactId>
  71. <version>${mybatis.spring.version}</version>
  72. </dependency>
  73. <!-- MySql -->
  74. <dependency>
  75. <groupId>mysql</groupId>
  76. <artifactId>mysql-connector-java</artifactId>
  77. <version>${mysql.version}</version>
  78. </dependency>
  79. <!-- sl4j日志管理 -->
  80. <dependency>
  81. <groupId>org.slf4j</groupId>
  82. <artifactId>slf4j-log4j12</artifactId>
  83. <version>${slf4j.version}</version>
  84. </dependency>
  85. <!-- Jackson Json处理工具包 -->
  86. <dependency>
  87. <groupId>com.fasterxml.jackson.core</groupId>
  88. <artifactId>jackson-databind</artifactId>
  89. <version>${jackson.version}</version>
  90. </dependency>
  91. <!-- 连接池 -->
  92. <dependency>
  93. <groupId>com.jolbox</groupId>
  94. <artifactId>bonecp-spring</artifactId>
  95. <version>0.8.0.RELEASE</version>
  96. </dependency>
  97. <!-- httpclient -->
  98. <dependency>
  99. <groupId>org.apache.httpcomponents</groupId>
  100. <artifactId>httpclient</artifactId>
  101. <version>${httpclient.version}</version>
  102. </dependency>
  103. <!-- JSP相关 -->
  104. <dependency>
  105. <groupId>jstl</groupId>
  106. <artifactId>jstl</artifactId>
  107. <version>${jstl.version}</version>
  108. </dependency>
  109. <dependency>
  110. <groupId>javax.servlet</groupId>
  111. <artifactId>servlet-api</artifactId>
  112. <version>${servlet-api.version}</version>
  113. <scope>provided</scope>
  114. </dependency>
  115. <dependency>
  116. <groupId>javax.servlet</groupId>
  117. <artifactId>jsp-api</artifactId>
  118. <version>${jsp-api.version}</version>
  119. <scope>provided</scope>
  120. </dependency>
  121. <!-- 时间操作组件 -->
  122. <dependency>
  123. <groupId>joda-time</groupId>
  124. <artifactId>joda-time</artifactId>
  125. <version>${joda-time.version}</version>
  126. </dependency>
  127. <!-- Apache工具组件 -->
  128. <dependency>
  129. <groupId>org.apache.commons</groupId>
  130. <artifactId>commons-lang3</artifactId>
  131. <version>${commons-lang3.version}</version>
  132. </dependency>
  133. <dependency>
  134. <groupId>org.apache.commons</groupId>
  135. <artifactId>commons-io</artifactId>
  136. <version>${commons-io.version}</version>
  137. </dependency>
  138. </dependencies>
  139. </dependencyManagement>
  140. <build>
  141. <finalName>${project.artifactId}</finalName>
  142. <plugins>
  143. <!-- 资源文件拷贝插件 -->
  144. <plugin>
  145. <groupId>org.apache.maven.plugins</groupId>
  146. <artifactId>maven-resources-plugin</artifactId>
  147. <version>2.7</version>
  148. <configuration>
  149. <encoding>UTF-8</encoding>
  150. </configuration>
  151. </plugin>
  152. <!-- java编译插件 -->
  153. <plugin>
  154. <groupId>org.apache.maven.plugins</groupId>
  155. <artifactId>maven-compiler-plugin</artifactId>
  156. <version>3.2</version>
  157. <configuration>
  158. <source>1.8</source>
  159. <target>1.8</target>
  160. <encoding>UTF-8</encoding>
  161. </configuration>
  162. </plugin>
  163. </plugins>
  164. <pluginManagement>
  165. <plugins>
  166. <!-- 配置Tomcat插件 -->
  167. <plugin>
  168. <groupId>org.apache.tomcat.maven</groupId>
  169. <artifactId>tomcat7-maven-plugin</artifactId>
  170. <version>2.2</version>
  171. </plugin>
  172. </plugins>
  173. </pluginManagement>
  174. </build>
  175. </project>

4、在子项目中直接引用相关依赖,无需指定版本号

  1. <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">
  2. <modelVersion>4.0.0</modelVersion>
  3. <!-- 使用继承 -->
  4. <parent>
  5. <groupId>com.spiritmark.cyf</groupId>
  6. <artifactId>environment</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. </parent>
  9. <groupId>com.spiritmark.cyf</groupId>
  10. <artifactId>usermanage</artifactId>
  11. <version>0.0.1-SNAPSHOT</version>
  12. <packaging>war</packaging>
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.apache.poi</groupId>
  16. <artifactId>poi</artifactId>
  17. <version>3.10.1</version>
  18. </dependency>
  19. <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
  20. <dependency>
  21. <groupId>com.fasterxml.jackson.core</groupId>
  22. <artifactId>jackson-databind</artifactId>
  23. </dependency>
  24. <!-- 时间操作组件 -->
  25. <dependency>
  26. <groupId>joda-time</groupId>
  27. <artifactId>joda-time</artifactId>
  28. </dependency>
  29. <!-- spring-webmvc -->
  30. <dependency>
  31. <groupId>org.springframework</groupId>
  32. <artifactId>spring-webmvc</artifactId>
  33. </dependency>
  34. <!-- 切面 -->
  35. <dependency>
  36. <groupId>org.springframework</groupId>
  37. <artifactId>spring-aspects</artifactId>
  38. </dependency>
  39. <!-- spring的jdbc -->
  40. <dependency>
  41. <groupId>org.springframework</groupId>
  42. <artifactId>spring-jdbc</artifactId>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.springframework</groupId>
  46. <artifactId>spring-test</artifactId>
  47. <version>4.3.7.RELEASE</version>
  48. </dependency>
  49. <!-- mysql的驱动 -->
  50. <dependency>
  51. <groupId>mysql</groupId>
  52. <artifactId>mysql-connector-java</artifactId>
  53. </dependency>
  54. <!-- mybatis -->
  55. <dependency>
  56. <groupId>org.mybatis</groupId>
  57. <artifactId>mybatis</artifactId>
  58. </dependency>
  59. <!-- mybatis于spring整合的jar -->
  60. <dependency>
  61. <groupId>org.mybatis</groupId>
  62. <artifactId>mybatis-spring</artifactId>
  63. </dependency>
  64. <!-- generator -->
  65. <dependency>
  66. <groupId>org.mybatis.generator</groupId>
  67. <artifactId>mybatis-generator-core</artifactId>
  68. <version>1.3.5</version>
  69. </dependency>
  70. <!-- jstl -->
  71. <dependency>
  72. <groupId>javax.servlet</groupId>
  73. <artifactId>jstl</artifactId>
  74. <version>1.2</version>
  75. </dependency>
  76. <!-- pagehelper -->
  77. <dependency>
  78. <groupId>com.github.pagehelper</groupId>
  79. <artifactId>pagehelper</artifactId>
  80. <version>5.1.2</version>
  81. </dependency>
  82. <!-- c3p0数据源 -->
  83. <dependency>
  84. <groupId>com.mchange</groupId>
  85. <artifactId>c3p0</artifactId>
  86. <version>0.9.5.2</version>
  87. </dependency>
  88. <!-- -->
  89. <dependency>
  90. <groupId>javax.servlet</groupId>
  91. <artifactId>javax.servlet-api</artifactId>
  92. <version>3.1.0</version>
  93. <scope>provided</scope>
  94. </dependency>
  95. <!-- -->
  96. <dependency>
  97. <groupId>org.slf4j</groupId>
  98. <artifactId>slf4j-log4j12</artifactId>
  99. </dependency>
  100. <!-- https://mvnrepository.com/artifact/junit/junit -->
  101. <dependency>
  102. <groupId>junit</groupId>
  103. <artifactId>junit</artifactId>
  104. <scope>test</scope>
  105. </dependency>
  106. <!-- 文件上传 -->
  107. <dependency>
  108. <groupId>commons-fileupload</groupId>
  109. <artifactId>commons-fileupload</artifactId>
  110. <version>1.3.1</version>
  111. </dependency>
  112. <dependency>
  113. <groupId>org.apache.shiro</groupId>
  114. <artifactId>shiro-core</artifactId>
  115. <version>1.4.0</version>
  116. </dependency>
  117. <dependency>
  118. <groupId>org.apache.shiro</groupId>
  119. <artifactId>shiro-web</artifactId>
  120. <version>1.4.0</version>
  121. </dependency>
  122. <dependency>
  123. <groupId>org.apache.shiro</groupId>
  124. <artifactId>shiro-ehcache</artifactId>
  125. <version>1.4.0</version>
  126. </dependency>
  127. <dependency>
  128. <groupId>org.apache.shiro</groupId>
  129. <artifactId>shiro-spring</artifactId>
  130. <version>1.4.0</version>
  131. </dependency>
  132. </dependencies>
  133. </project>

5、子项目插件配置:

  1. <build>
  2. <plugins>
  3. <!-- 配置tomcat插件 -->
  4. <plugin>
  5. <groupId>org.apache.tomcat.maven</groupId>
  6. <artifactId>tomcat7-maven-plugin</artifactId>
  7. <!-- tomcat配置 -->
  8. <configuration>
  9. <!-- 端口号 -->
  10. <port>8001</port>
  11. <!-- 项目的路径 -->
  12. <path>/</path>
  13. </configuration>
  14. </plugin>
  15. </plugins>
  16. </build>

子项目继承

pom.xml的继承关系:

  • 父项目的packaging元素必须是pom
  • 子项目的使用 parent 元素声明父模块:
    • group、artifactId、version:指定父项目的坐标
    • relativePath:表示父模块POM的相对路径,在项目构建时,maven会首先根据relativePath检查父POM
      1. <parent>
      2. <groupId>com.example</groupId>
      3. <artifactId>parent</artifactId>
      4. <version>1.0-SNAPSHOT</version>
      5. <relativePath>../parent/pom.xml</relativePath>
      6. </parent>

可继承的POM元素:

  • groupId:项目组ID
  • version:项目版本,所以子项目不需要写版本号
  • distributionManagement:项目的部署配置
  • properties:自定义的Maven属性
  • dependencies:项目的依赖配置
  • dependencyManagement:项目的依赖管理配置
  • build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等

依赖管理:

  • dependencyManagement元素说明:让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。在dependencyManagement元素下的依赖声明不会引入实际的依赖,不过它能够约束dependencies下的依赖使用。

插件管理:

  • Maven提供了dependencyManagement元素帮助管理依赖,类似地,Maven也提供了pluginManagement元素帮助管理插件。同dependencyManagement一样,在pluginManagement元素中配置的依赖不会造成实际的插件调用行为,当POM中配置了真正的plugin元素,并且其groupId和artifactId与pluginManagement中配置的插件匹配时,pluginManagement的配置才会影响实际的插件行为。

依赖的生命周期

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-dependencies</artifactId>
  4. <version>2.3.1.RELEASE</version>
  5. <type>pom</type>
  6. <!-- 生命周期 -->
  7. <scope>import</scope>
  8. </dependency>

maven的生命周期 scope 有如下几种:

  • compile:默认,指该依赖用于maven项目的所有阶段(测试、编译、运行、打包),且会随着项目一起被发布(被打包)
  • provided:该依赖只需要在编译过程中提供,不会被打包
  • runtime:只在运行时使用,适用运行和测试阶段,会被一起发布
  • test:该依赖只用于测试,用于编译和运行测试,不会被打包
  • system:类似provided,但maven不会在Repository中查找,而是在本地磁盘目录中查找,参与编译、测试、打包、运行
  • import:用于导入子模块中使用dependencyManagement管理的依赖,注意,scope=import只能用在dependencyManagement里面,并且 type=pom 的dependency

import的出现缘由

在maven多模块项目中,为了保持模块间依赖的统一,常规做法是在parent model中,使用dependencyManagement预定义所有模块需要用到的dependency(依赖)。然后子model中根据实际需要引入parent中预定义的依赖。
优点:

  • 依赖统一管理(parent中定义,需要变动dependency版本,只要修改一处即可);
  • 代码简洁(子model只需要指定groupId、artifactId即可)
  • dependencyManagement只会影响现有依赖的配置,但不会引入依赖。即子model不会继承parent中dependencyManagement所有预定义的depandency,只引入需要的依赖即可,简单说就是“按需引入依赖”或者“按需继承”。因此,在parent中严禁直接使用depandencys预定义依赖,坏处是子model会自动继承depandencys中所有预定义依赖。

问题:

  • 单继承:maven的继承跟java一样,单继承,也就是说子model中只能出现一个parent标签;parent模块中,dependencyManagement中预定义太多的依赖,造成pom文件过长,无法清晰管理。

解决:import scope依赖
使用:

  1. maven2.9以上版本
  2. 将dependency分类,每一类建立单独的pom文件
  3. 在需要使用到这些依赖的子model中,使用dependencyManagement管理依赖,并import scope依赖
  4. 注意:scope=import只能用于dependencyManagement中,且仅用于type=pom的dependency

优点:

  • 便于依赖管理,分类
  • 解决单继承问题,通过import pom文件达到依赖的目的(典型的非继承模式),从而不用从父类中引用依赖
  • 父模块的pom会很干净,便于维护