Mac下的Maven配置安装,可以查看另一篇博客:传送门
目录
一、简述
maven是一个项目管理工具。
maven拆分思想:
maven解决代码可重用和便于维护问题上的解决方案:
maven把一个完成的项目,分成不同的独立模块,这些模块都有各自独立的坐标。哪个地方需要其中某个模块,就直接引用该模块的坐标即可。实际开发中,先考虑的问题不是dao、service、utils、domain如何编写,我们要考虑的是dao、service、utils、domain是否已经存在,如果存在直接引用。
maven聚合思想:可以把拆分独立的各个模块聚合到一起编写成一个完成的项目。
依赖管理:maven对项目中jar包的管理过程。pom文件管理jar包坐标。
- 传统项目直接把jar包放置在项目中。
- maven工程真正的jar包放置在仓库中,项目中只需要放置jar包的坐标。-- 当项目编译或运行时,项目会自动通过jar包坐标在仓库中找到所对应的jar包。
二、仓库
2.1 仓库种类
- 本地仓库:只能通过安装的方式将jar包安装到本地仓库。拷贝到本地仓库的jar包是没有效果的。
- 远程仓库【也称之为私服】-- 放置了公司内部开发所需要的jar包。若公司没有网络时,本地仓库没有jar包,我们可以通过局域网从远程下载jar包。
- 中央仓库 – 安装了maven之后,自动就连着中央仓库,需要电脑连接着网络,才可以在中央仓库下载jar包。
2.2 仓库之间的关系
当我们启动一个maven工程的时候,maven工程通过pom文件中jar包的坐标去本地仓库找对应jar包。
默认情况下,如果本地仓库没有对应jar包,maven工程会自动去中央仓库下载jar包到本地仓库。
在公司中,如果本地没有对应jar包,会先从私服下载jar包。
如果私服也没有jar包,可以从中央仓库下载,也可以从本地上传。
三、常用命令
maven一键构建:maven自身集成了tomcat插件,可以对项目进行编译、测试、打包、安装、发布等操作。
maven常用命令:
- clean 清理项目以前的构建信息
- compile 对src/main/java 下的目录进行编译。
- test 编译测试代码
- package 把本地项目打包到了本地编译目录 target
- install 把包安装到本地仓库
- deploy 将本地做好的项目直接上传到私服
maven以上命令涉及了三套生命周期:
- 清理生命周期
- 默认生命周期
- 站点生命周期
四、解决jar包冲突
maven工程要导入jar包坐标,就必须要考虑解决jar包冲突,解决jar包冲突的方式有如下三种:
4.1 第一声明优先原则
第一声明优先原则:哪个jar包的坐标在pom靠上的位置,这个jar包就是先声明的。
先声明的jar包坐标下的依赖包,可以优先进入项目中。
比如:
A 导入方式
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
</dependencies>
B 导入方式:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
</dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
我们知道spring-beans的jar包依赖spring-core。此时spring-beans坐标位置会影响到spring-core的jar包的版本。
根据第一声明优先原则:
A导入jar包分别为:
spring-core版本5.0.2.RELEASE,spring-beans版本4.1.2.RELEASE
B导入jar包分别为:
spring-core版本4.1.2.RELEASE,spring-beans版本4.1.2.RELEASE
4.2 路径近者优先原则
首先,我们需要明确maven导入jar包中两个概念:
直接依赖:项目中直接导入的jar包,就是直接该项目的直接依赖包。
传递依赖:项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中。
路径近者优先原则:直接依赖路径比传递依赖路径近,那么最终项目进入的jar包是路径近的直接依赖包。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.8.RELEASE</version>
</dependency>
</dependencies>
此时,项目对spring-core是直接依赖。此时项目引入的jar包为:
spring-core版本4.2.8.RELEASE
4.3 直接排除法【推荐使用】
当我们要排除某个jar包下依赖,当配置exclusions标签的时候,内部可以不写版本号。
因为此时依赖包使用的版本号默认与本jar包一样。
该方式优于方式一、方式二。因为在多人开发时,此种方式可以避免其他人员移动jar包坐标带来的jar包版本问题。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.2.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
虽然spring-beans版本4.1.2.RELEASE,并依赖spring-core,而且坐标先声明,但是我们在spring-beans标签内移除了对spring-core版本4.1.2.RELEASE的依赖。此时项目导入的spring-beans版本是5.0.2.RELEASE。
五、统一、锁定jar包版本
统一jar包版本使用了properties标签,xml中能否使用什么标签,完全取决于xml中的约束。
锁定jar包版本的好处与原因
maven工程是可以分父子依赖关系的。
凡是依赖别的项目后,拿到的别的项目的依赖包,都属于依赖包。
比如:当前A项目,被B项目依赖。那么A项目中所有jar包都会传递到B项目中。
B项目开发者,如果再在B项目中导入一套ssm框架的jar包,对于B项目是直接依赖。
那么直接依赖的jar包就会把A项目传递过去的jar包覆盖掉。
为了防止以上情况的出现:我们可以把A项目中主要jar包的坐标锁住,那么其他依赖A项目的项目中,
即便是有同名jar包直接依赖,也无法覆盖。
项目标签约束:
<?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">
<modelVersion>4.0.0</modelVersion>
</project>
统一jar包版本:
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<shiro.version>1.2.3</shiro.version>
<mysql.version>5.1.6</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
<spring.security.version>5.0.1.RELEASE</spring.security.version>
</properties>
锁定jar包版本:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
添加项目依赖jar包
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<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.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
</dependencies>
添加tomcat7插件:
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>