Maven项目管理工具
Maven简介及好处
是apache下的一个开源项目,是纯java开发的,并且只是用来管理java项目的
依赖管理
项目所用到的jar都放在本地仓库,使用时通过坐标定位位置
项目一键构建
一个mvn tomcat:run
命令就能把项目运行
Maven能干的事:编译—>测试(junit)—>运行—>打包—>部署
其他好处
- 可以跨平台
- 应用于大型项目,可以提高开发效率
Maven的安装和配置
下载和安装
点击官网地址找到对应版本下载,解压即可
Maven环境变量配置
- Maven3.3X以上的版本所需要的jdk都需要1.7以上的版本
- 添加系统变量MAVEN_HOME:为了在任何目录下可以使用Maven命令
- 查看是否添加成功:cmd中
mvn -v
查看Maven版本
settings.xml配置
Maven软件的核心配置文件:settings.xml
- localRepository标签
- 放开标签修改默认本地仓库地址
- 默认路径:
${user.home}/.m2/repository
- Maven仓库
- 本地仓库:本地仓库的配置只需要修改settings.xml配置文件就可以
- 远程仓库:公司维护
- 中央仓库:maven团队维护
Maven的目录结构
- src
- main(主目录)
- java(java代码)
- resources(配置文件,properties,xml...)
- webapp
- test(测试目录)
- java(java代码 junit测试)
- resources(junit测试用到的配置文件,如果里面没有配置文件默认从main找)
- main(主目录)
- pom.xml
Maven常用命令及生命周期
执行Maven命令的时候必须进入到项目文件夹里面
mvn clean
:清理编译好的文件mvn compile
:编译了主目录的文件mvn test
:编译并运行了测试目录的文件mvn package
:打包mvn install
:把项目发布到本地仓库(一般是java工程打成jar包)mvn deploy
:把项目发布私服mvn site
:生成一些静态页面,是对项目的一些说明
Maven的生命周期
Clean生命周期:clean
Deafult生命周期:compile—>test—>package—>install—>deploy
Site生命周期:site
命令和生命周期的阶段的关系
不同的生命周期的命令可以同时执行:例如mvn clean package
项目构建
- 项目路径名
- Group Id:公司或者组织名称(cn.itcast),可以具体到项目名(cn.itcast.crm)
- Artifact Id:项目名称(hello),可以具体到模块名称(service)
- Version:版本,snapshot快照版
- Package:打包方式 jar、war、pom
- webapp文件夹下需要创建WEB-INF文件夹,里面放一个web.xml文件
- 处理编译版本:pom.xml文件中的build—>plugins标签中
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
- 添加jar包:pom.xml中添加如下案例代码
Maven仓库官网
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
依赖管理
依赖范围
- Compile:默认(可省略)编译(compile)时要,测试时要,运行时要,打包时要
- Provided:编译时要,测试时也要,运行时不要,打包时不要
- Runtime:数据库驱动包,编译时不要,测试时要,运行时要,打包时要
- Test:编译时不要,测试时要,运行时不要,打包时不要
依赖范围对依赖传递的影响
依赖版本的冲突解决
当我们在pom.xml文件中添加了spring-context以及struts-spring-plugin的依赖后,这时会出现其他的jar包,称之为依赖传递,而添加不同的依赖后,可能会产生版本的冲突
- 第一申明者优先原则
在pom.xml文件中定义依赖,以首先定义的依赖为基准,比如当我们同时定义了spring-bean的两个版本,那么首先定义的4.2.4版本将成为依赖的基准
<dependencies>
<!-- spring-beans-4.2.4 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- spring-beans-3.0.5 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
</dependency>
</dependencies>
- 路径近者优先原则
也就是说当我们在pom.xml文件中单独添加了spring-bean的依赖,而struts-spring-plugin依赖于spring-bean,struts-spring-plugin与我们单独所定义的spring-bean是同级的,因此会以单独定义的bean依赖为基准。(也就是自己添加的jar包)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
- 排除依赖原则
比如在添加struts-spring-plugin约束时,排除spring-bean,如下所示:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
</exclusions>
</dependency>
- 版本锁定原则
面对众多的依赖,版本锁定这一种方式不需要考虑依赖的路径、声明优化等因素,可以直接锁定所依赖jar包的版本,锁定后不会考虑声明顺序及路径。下面以锁定Struts2、Spring、Hibernate版本为例:
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
<hibernate.version>5.0.7.Final</hibernate.version>
<struts.version>2.3.24</struts.version>
</properties>
<!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
Tomcat插件
Tomcat6运行命令:Tomcat:run
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<path>/</path>
<port>8080</port>
</configuration>
</plugin>
</plugins>
</build>
Tomcat7运行命令:Tomcat7:run
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/</path>
<port>8080</port>
</configuration>
</plugin>
</plugins>
<build>