一. pom.xml文件
1.1 简介
pom:project object model 项目对象模型
pom.xml是Maven的核心配置文件
一个Maven项目有且只有一个pom.xml文件,该文件必须在项目的根目录下
1.2 坐标
1.2.1 什么是坐标
(1)用来唯一的标识每个标识,必须为项目定义坐标,坐标必须唯一
(2)目的是为了让其他Maven项目可以使用该项目生成的jar包
1.2.2 坐标详解
Maven坐标是通过一些元素来定义:groupId、artifactId、version
1 <! 2 坐标: 3 groupId:组织Id,表示当着模块所隶属的项目 4 artifactId:模块id 5 version:当前的版本 6 > 7 <groupId>com.wfz.study</groupId> 8 <artifactId>maven01</artifactId> 9 <version>1.0SNAPSHOT</version>
1.3 依赖
1.3.1 基本配置
如何查找一个jar包的坐标?
http://search.maven.org/ 或 http://mvnrepository.com/ 或http://maven.aliyun.com/nexus/#
1.3.2 如何查找一个坐标
<dependency> <groupId>mysql</groupId> <artifactId>mysqlconnectorjava</artifactId> <version>5.1.38</version> </dependency> <dependency> <groupId>commonsfileupload</groupId> <artifactId>commonsfileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency
1.3.3 scope作用域
表示依赖的作用域,用来配置依赖的jar包可使用的范围
取值 | 含义 | 举例 |
compile |
该依赖可以在整个项目中使用,参与打包部署,默认值 | commonsfileupload |
test |
该依赖只能在测试代码中使用,不参与打包部署 | junit |
provided |
该依赖编写源代码时需要,不参与打包部署 | servletapi、jspapi |
runtime |
该依赖编写代码时不需要,运行时需要,参与打包部署 | mysqlconnector |
system |
表示使用本地系统路径下的jar包,需要和systemPath一起使用 ojdbc.jar | ojdbc.jar |
1.3.4 properties
全局属性,一般情况下用于定义全局的jar包版本
<properties> <project.build.sourceEncoding>UTF8</project.build.sourceEncoding> <fileupload.version>1.3.1</fileupload.version> <junit.version>4.12</junit.version> <mysqlconnectorjava.version>5.1.38</mysqlconnectorjava.version> <spring.version>4.3.12.RELEASE</spring.version> </properties> <dependencies> <! junit > <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies>
1.3.5 repositories
用来配置当前工程使用的远程仓库
依赖查找顺序:本地仓库——>当前工程pom.xml中配置的远程仓库——>setting.xml中配置的远程仓库
<! 配置远程仓库 > <repositories> <! 有些最新的jar包,可能在中央仓库上并没有提供,此时可以使用jar包官方提供的仓库 > <repository> <id>spring_repo</id> <url>http://repo.spring.io/milestone</url> </repository> </repositories> <! mavencleanplugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>mavencleanplugin</artifactId> <version>2.6.1</version> </plugin> <! tomcat插件 > <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7mavenplugin</artifactId> <version>2.2</version> <configuration> <path>/maven01</path> <port>8888</port> </configuration> </plugin>
1.3.6 plugins
配置插件,是一种工具,项目并不依赖于它。比如:
- mavencleanplugin
- mavencompileplugin
<! mavencleanplugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>mavencleanplugin</artifactId> <version>2.6.1</version> </plugin> <! tomcat插件 > <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7mavenplugin</artifactId> <version>2.2</version> <configuration> <path>/maven01</path> <port>8888</port> </configuration> </plugin>
1.3.7 超级POM
所有的pom.xml文件都继承一个父POM,这个父POM称为超级POM(Super POM、Effective POM)
二. Maven中的关系
2.1 继承
一个Maven项目可以继承自另一个Maven项目,分为称为子项目、父项目
场景:多个子项目中使用的是相同的依赖或插件,此时可以把相同的配置抽取到一个父项目中,进行统一的管理,保持一致性
步骤:
1. 将父项目的打包方式设置为pom
<! 打包方式: jar:Java项目的打包方式,默认值 war:Web项目的打包方式 pom:父项目的打包方式 > <packaging>pom</packaging>
2. 在子项目中引用父项目,指定父项目的坐标
<! 引用父项目,指定父项目的坐标 > <parent> <groupId>com.wfz.study</groupId> <artifactId>parent</artifactId> <version>1.0SNAPSHOT</version> <! 指定父项目的pom.xml文件的相对物理路径 > <relativePath>../parent/pom.xml</relativePath> </parent>
问题:有时并不是父项目的所有依赖都需要被子项目继承,但是又希望能够通过父项目对依赖进行统一管理,如版本的控制
解决:
使用dependencyManagement
步骤:1. 在父项目中配置dependencyManagement
dependencies:如果不用dependencyManagement做依赖管理的话,父工程的所有依赖都是可以被子工程继承的(但特殊情况除外:scope为compile的依赖会被传递,scope为test的依赖不会被传递,配置optional为true的依赖不会被传递等)
问题:有时并不是父项目的所有依赖都需要被子项目继承,但是又希望能够通过父项目对依赖进行统一管理,如版本的控制,Scope范围管理等,此时使用dependencyManagement对jar包进行统一管理
dependencyManagement:表示父项目只进行依赖管理,依赖(groupId,artifactId)默认不会被子项目继承;但是version,scope可以被继承,子工程只需写groupId,artifactId即可,version,scope会从父工程继承过来.但是如果子工程中也 配置version,scope的话,会默认覆盖掉父工程的version,scope.
<dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>${commons-fileupload.version}</version> <scope>compile</scope> </dependency> </dependencies> </dependencyManagement>
2. 在子项目中引用父项目中的
<!-- 子项目引用父项目的依赖,默认继承了父项目的version,scope, 此时只需要再配置groupId,artifactId引用父项目的依赖就可以啦--> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> </dependency> </dependencies>
2.2 聚合
将多个子项目添加到一个父项目中,然后通过能父项目进行操作,从而实现对所有聚合的子项目的操作
<!-- 聚合:将多个子项目添加到一个父项目中,然后通过对父项目进行操作,从而实现对所有聚合的子项目的操作 聚合子项目:指定子项目的根目录 ../代表上一级目录 --> <modules> <module>../child03</module> <module>../child01</module> <module>../child02</module> </modules>
2.3 依赖
项目C——>项目B——>项目A
概念:如果项目C依赖于项目B,项目B依赖项目A,则项目C也依赖于项目A,这叫依赖的传递
配置依赖关系:child03——>child02——>child01
2.3.1 控制依赖的传递
并不是所有的依赖都会被传递:
- scope为compile的依赖会被传递
- scope为test的依赖不会被传递
- 配置optional为true的依赖不会被传递
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <optional>true</optional> </dependency
2.3.2 不会出现jar包的冲突
使用maven不会jar包冲突,通过两个原则来保证:
就近原则
child03——>child02——>child01
优先定义原则
child03——>child02——>child01
——>child04
2.3.3 不要传递的依赖
方式1:在依赖的项目中配置不允许传递
<optional>true</optional>
方式2:在当前项目中配置不接收传递的特定依赖
<! 依赖于child01> <dependency> <groupId>com.itany.study</groupId> <artifactId>child01</artifactId> <version>1.0SNAPSHOT</version> <! 不接收特定的依赖 > <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency>
三.使用Nexus搭建Maven私服
3.1 为什么要搭建私服
公司不提供外网给开发人员,无法使用maven访问远程仓库,此时可以在局域网内找一台能访问外网的电脑搭建maven私服
3.2 Nexus工具
用来搭建Maven私服的工具
下载地址:https://pan.baidu.com/s/1mCfnGci42uSPb8W2VmKfHw
验证码:s8ba
下载完毕之后,在D:\soft\maven\nexus\nexus-2.12.0-01\bin\jsw\windows-x86-64(我自己的安装地址)安装启动私服即可。
常用的三个命令:
install-nexus.bat:运行install-nexus.bat安装maven私服
start-nexus.bat:运行私服
stop-nexus.bat:停止私服
3.3 操作步骤
步骤:
1. 解压缩并安装为系统服务
2.访问
http://localhost:8081/nexus
3.4 登陆并配置私服
登陆账户和密码:admin/admin123
1. 添加阿里云代理(镜像)仓库到私服中
2. 添加本地jar到私服中
好了,maven的相关东西就总结到这里,如果后续有需要继续完善的,再做补充。