视频课程链接:http://edu.51cto.com/course/13014.html
六、pom.xml文件
1. 简介
pom:project object model 项目对象模型
pom.xml是Maven的核心配置文件
一个Maven项目有且只有一个pom.xml文件,该文件必须在项目的根目录下
2.坐标
2.1 什么是坐标
用来唯一的标识每个标识,必须为项目定义坐标,坐标必须唯一
目的是为了让其他Maven项目可以使用该项目生成的jar包
2.2 坐标详解
Maven坐标是通过一些元素来定义:groupId、artifactId、version
<!--
坐标:
groupId:组织Id,表示当着模块所隶属的项目
artifactId:模块id
version:当前的版本
-->
<groupId>com.itany.study</groupId>
<artifactId>maven01</artifactId>
<version>1.0-SNAPSHOT</version>
3.dependency
3.1 基本配置
如何查找一个jar包的坐标?
http://search.maven.org/ 或 http://mvnrepository.com/ 或http://maven.aliyun.com/nexus/#
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
3.2 scope作用域
表示依赖的作用域,用来配置依赖的jar包可使用的范围
取值 | 含义 | 举例 |
---|---|---|
compile | 该依赖可以在整个项目中使用,参与打包部署,默认值 | commons-fileupload |
test | 该依赖只能在测试代码中使用,不参与打包部署 | junit |
provided | 该依赖编写源代码时需要,不参与打包部署 | servlet-api、jsp-api |
runtime | 该依赖编写代码时不需要,运行时需要,参与打包部署 | mysql-connector |
system | 表示使用本地系统路径下的jar包,需要和systemPath一起使用 | ojdbc.jar |
4. properties
全局属性,一般情况下用于定义全局的jar包版本
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<fileupload.version>1.3.1</fileupload.version>
<junit.version>4.12</junit.version>
<mysql-connector-java.version>5.1.38</mysql-connector-java.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>
5.repositories
用来配置当前工程使用的远程仓库
依赖查找顺序:本地仓库——>当前工程pom.xml中配置的远程仓库——>setting.xml中配置的远程仓库
<!-- 配置远程仓库 -->
<repositories>
<!-- 有些最新的jar包,可能在中央仓库上并没有提供,此时可以使用jar包官方提供的仓库 -->
<repository>
<id>spring_repo</id>
<url>http://repo.spring.io/milestone</url>
</repository>
</repositories>
6.plugins
配置插件,是一种工具
- maven-clean-plugin
- maven-compile-plugin
<!-- maven-clean-plugin-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>2.6.1</version>
</plugin>
<!-- tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/maven01</path>
<port>8888</port>
</configuration>
</plugin>
7.超级POM
所有的pom.xml文件都继承一个父POM,这个父POM称为超级POM(Super POM、Effective POM)
七、Maven中的关系
1.继承
一个Maven项目可以继承自另一个Maven项目,分为称为子项目、父项目
场景:多个子项目中使用的是相同的依赖或插件,此时可以把相同的配置抽取到一个父项目中,进行统一的管理,保持一致性
步骤:
-
将父项目的打包方式设置为pom
<!-- 打包方式: jar:Java项目的打包方式,默认值 war:Web项目的打包方式 pom:父项目的打包方式 --> <packaging>pom</packaging>
-
在子项目中引用父项目,指定父项目的坐标
<!-- 引用父项目,指定父项目的坐标 --> <parent> <groupId>com.itany.study</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <!-- 指定父项目的pom.xml文件的相对物理路径 --> <relativePath>../parent/pom.xml</relativePath> </parent>
问题:有时并不是父项目的所有依赖都需要被子项目继承,但是又希望能够通过父项目对依赖进行统一管理,如版本的控制
解决:使用dependencyManagement
步骤:
- 在父项目中配置dependencyManagement
- 在子项目中引用父项目中的依赖
2.聚合
将多个子项目添加到一个父项目中,然后通过能父项目进行操作,从而实现对所有聚合的子项目的操作
<!-- 聚合子项目,指定子项目的根目录-->
<modules>
<module>../child01</module>
<module>../child02</module>
</modules>
3.依赖
项目C——>项目B——>项目A
概念:如果项目C依赖于项目B,项目B依赖项目A,则项目C也依赖于项目A,这叫依赖的传递
配置依赖关系:child03——>child02——>child01
3.1 控制依赖的传递
并不是所有的依赖都会被传递:
-
scope为compile的依赖会被传递
-
scope为test的依赖不会被传递
-
配置optional为true的依赖不会被传递
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <optional>true</optional> </dependency>
3.2 不会出现jar包的冲突
使用maven不会jar包冲突,通过两个原则来保证:
-
就近原则
child03——>child02——>child01
-
优先定义原则
child03——>child02——>child01
——>child04
3.3 不要传递的依赖
方式1:在依赖的项目中配置不允许传递
<optional>true</optional>
方式2:在当前项目中配置不接收传递的特定依赖
<!-- 依赖于child01-->
<dependency>
<groupId>com.itany.study</groupId>
<artifactId>child01</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 不接收特定的依赖 -->
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
八、Maven Web项目
步骤:
-
修改web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> </web-app>
-
配置pom.xml
<dependencies> <!-- Java EE --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <finalName>maven02</finalName> <!-- tomcat插件 --> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <path>/</path> <port>8888</port> </configuration> </plugin> </plugins> </build>
九、使用Nexus搭建Maven私服
1. 为什么要搭建私服
公司不提供外网给开发人员,无法使用maven访问远程仓库,此时可以在局域网内找一台能访问外网的电脑搭建maven私服
2. Nexus工具
用来搭建nexus工具
3. 操作步骤
步骤:
-
解压缩并安装为系统服务
nexus-2.14.2-01-bundle\nexus-2.14.2-01\bin\jsw\windows-x86-64\install-nexus.bat
-
访问
http://localhost:8081/nexus
4. 登陆并配置私服
登陆账户和密码:admin/admin123
1. 添加阿里云代理(镜像)仓库到私服中
2. 添加本地jar到私服中
十、Maven综合应用
1. 分析
将项目分为多个工程,可以按层次分,也可以按模块,或同时按层次和模块分
以ums为例,使用maven创建和管理项目:
- 父工程:ums-parent
- dao工程:ums-dao
- sevice工程:ums-service
- action工程:ums-action
2. 步骤:
2.1 创建工程
2.2 配置依赖
- 在父工程中添加依赖
- 在子工程中引用依赖
2.3 配置dao工程
映射文件存储位置,两种方式:
-
将映射文件放在resources目录下
会被打包部署
-
将映射文件放在java目录下
默认只会对该目录下的java代码进行打包部署,如果希望对该目录下的配置文件也进行打包,需要额外的配置
<build> <!-- 将java目录下的配置文件也进行打包 --> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> <filtering>false</filtering> </resource> </resources> </build>