Maven项目管理工具

  • 1 Maven的简介
  • 1.1 什么是maven
  • 1.2 Maven好处
  • 1.3 依赖管理
  • 1.4 项目一键构建
  • 1.5 小结:
  • 1.5.1 依赖管理
  • 1.5.2 一键构建
  • 1.5.3 可以跨平台
  • 1.5.4 应用于大型项目 可以提高开发效率
  • 2 Maven的安装配置
  • 2.1 下载安装
  • 2.2 Maven环境变量配置
  • 2.3 Maven仓库
  • 3 演示入门程序
  • 3.1 Maven的目录结构
  • Maven项目中构建时Maven Module和Maven Project的意义,以及POM形式的和Jar形式的包的意思,使用场景
  • 3.2 Maven的常用命令
  • 3.3 Maven的生命周期(了解)
  • 3.4 命令和生命周期的阶段的关系
  • 4 项目构建
  • 4.2 在idea中创建Maven的Web项目
  • 5 依赖管理
  • 5.1 添加依赖:
  • 5.2 重建索引
  • 5.3 依赖范围
  • 5.3.1 Compile(默认) struts2-core
  • 5.3.2 Provided jsp-api.jar servlet-api.jar
  • 5.3.3 Runtime 数据库驱动包
  • 5.3.4 Test junit.jar
  • 5.4 怎么解决循环依赖
  • 如何重构
  • 6 Maven项目Debug模式不能查看源码问题
  • 7 Maven的常用插件
  • maven-clean-plugin
  • maven-surefire-plugin
  • maven-compiler-plugin
  • maven-resources-plugin
  • maven-install-plugin
  • maven-dependency-plugin
  • maven-jar-plugin
  • maven-assembly-plugin
  • Maven使用时的常见问题
  • 查看项目中依赖了哪些有效依赖
  • Maven有哪些目标
  • Maven当中啥叫构件?
  • 生成站点和报告
  • 如果一个项目当中依赖了同一个构件但是不同版本会有冲突问题吗?
  • 忽略测试失败方法
  • 跳过单元测试
  • Maven本地仓库有jar包却提示找不到 / 生成.lastUpdated文件(Maven仓库_remote.repositories文件的作用)
  • Maven .lastUpdated文件对项目的影响
  • Maven打包的时候如何指定特定参数到pom文件实现特定参数打包


1 Maven的简介

1.1 什么是maven

是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的

1.2 Maven好处

普通的传统项目

maven 版本管理 maven统一版本管理_Maven


Maven项目

maven 版本管理 maven统一版本管理_Maven_02


分析:maven项目为什么这么小?没有jar。 需要jar吗?肯定需要。没有存在于maven项目里面,jar存在于哪?

1.3 依赖管理

maven 版本管理 maven统一版本管理_Maven_03

1.4 项目一键构建

编码 编译 测试(junit) 运行 打包 部署

一个 tomcat:run就能把项目运行起来

Maven能干的事:
编译 测试(junit) 运行 打包 部署

1.5 小结:

Maven的好处:

1.5.1 依赖管理

就是对jar包的统一管理 可以节省空间

1.5.2 一键构建

1.5.3 可以跨平台

1.5.4 应用于大型项目 可以提高开发效率

分析:
用户管理 订单管理 支付管理 。。。。。
Maven的分模块开发
互联网项目 按业务分
传统项目 按层分 entity dao service web

2 Maven的安装配置

2.1 下载安装

maven 版本管理 maven统一版本管理_maven_04


从此目录中拷贝文件:

maven 版本管理 maven统一版本管理_Maven_05


直接解压到一个没有中文没有空格的文件夹里解压后的目录如下:

maven 版本管理 maven统一版本管理_jar_06


Maven软件的核心文件:

maven 版本管理 maven统一版本管理_maven_07

2.2 Maven环境变量配置

1、要配置jdk, maven3.3.9这个版本所需的jdk版本必须要1.7以上

2、最终要运行的是maven软件中bin目录的mvn命令

所以要配置maven的环境变量

在系统变量添加

环境变量的名称:MAVEN_HOME

  变量值:就是maven软甲解压的目录F:\class32\apache-maven-3.3.9

maven 版本管理 maven统一版本管理_maven 版本管理_08


3、把MAVEN_HOME添加到path里

maven 版本管理 maven统一版本管理_tomcat_09


4、验证maven是否配置成功:

打开dos窗口 输入: mvn –v

maven 版本管理 maven统一版本管理_maven 版本管理_10

2.3 Maven仓库

三种仓库
1、本地仓库 自己维护

本地仓库的配置只需要修改settings.xml文件就可以

maven 版本管理 maven统一版本管理_Maven_11


2、远程仓库(私服) 公司维护

3、中央仓库三种仓库的关系如下:

maven 版本管理 maven统一版本管理_tomcat_12

3 演示入门程序

3.1 Maven的目录结构

maven 版本管理 maven统一版本管理_jar_13


maven 版本管理 maven统一版本管理_maven_14

Maven项目中构建时Maven Module和Maven Project的意义,以及POM形式的和Jar形式的包的意思,使用场景

选择Maven Module构建时意味这这个是个子模块,当选择POM形式创建时代表这还会有在这个包下面创建的项目,意思就是这个是个父级目录。

3.2 Maven的常用命令

Clean   清理编译好的文件(target)

maven 版本管理 maven统一版本管理_jar_15


Compile   编译了主目录的文件,不会编译Test文件夹中下的文件

maven 版本管理 maven统一版本管理_tomcat_16


Test   编译并运行了test目录的代码

maven 版本管理 maven统一版本管理_tomcat_17


Package 打包 打好的war包在target文件夹下

命令:mvn package

maven 版本管理 maven统一版本管理_maven 版本管理_18


Install 就是把项目发布到本地仓库

命令:mvn install

maven 版本管理 maven统一版本管理_Maven_19


(安装到本地仓库的地址在Installing后面显示)

Tomcat:run 一键启动

3.3 Maven的生命周期(了解)

Compile   test   package  install   deploy(发布到私服)
三种生命周期

Clean生命周期
 Clean
Default生命周期
 Compile   test   package   install   deploy
Site生命周期
  Site

3.4 命令和生命周期的阶段的关系

不同的生命周期的命令可以同时执行
Mvn clean package

4 项目构建

M2e插件的安装

Maven在eclipse的配置

1、选择3.3.9版本的maven软件

maven 版本管理 maven统一版本管理_maven_20


2、修改默认的本地仓库地址

maven 版本管理 maven统一版本管理_tomcat_21


项目构建

1、新建maven项目

maven 版本管理 maven统一版本管理_maven_22


2、调过骨架,如果不跳过骨架选择创建出的项目目录是不全的

maven 版本管理 maven统一版本管理_jar_23


2、填写坐标

maven 版本管理 maven统一版本管理_tomcat_24


3、创建工程

maven 版本管理 maven统一版本管理_jar_25


4、处理红色叉号

手动在webapp文件夹下创建一个WEB-INF文件夹,在里面放一个web.xml文件

maven 版本管理 maven统一版本管理_maven 版本管理_26


5、处理编译版本(使处理项目的jre版本使用为1.7来编译)

在pom.xml中添加如下代码

<build>
<!-- 配置了很多插件 -->
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>3.5.1</version>  
			<configuration>
				<source>1.7</source>
				<target>1.7</target>
				<encoding>UTF-8</encoding>
			</configuration>
		</plugin>
	</plugins>
</build>

5、创建一个servlet

maven 版本管理 maven统一版本管理_Maven_27


修改web.xml

删除重复的代码

xmlns=http://java.sun.com/xml/ns/javaee

maven 版本管理 maven统一版本管理_maven_28


添加jar包

在pom中添加如下代码:

<dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.9</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>servlet-api</artifactId>
		<version>2.5</version>
		<scope>provided</scope>
	</dependency>
	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>jsp-api</artifactId>
		<version>2.0</version>
		<scope>provided</scope>
	</dependency>
	
</dependencies>

会发现jar包已添加到项目中

maven 版本管理 maven统一版本管理_jar_29


启动项目

右击项目----run as –maven build ….------并在Goals栏中输入tomcat:run点击run即可启动,但这样的方式启动其实是使用maven自带的tomcat插件(tomcat-maven-plugin:1.1)来启动的,如果想自定启动接口则在Goals栏中输入-Dmaven.tomcat.port=8088 tomcat:run此处的8088则是设置的tomcat启动端口

maven 版本管理 maven统一版本管理_tomcat_30


下面是启动后的后台打印日志,通过观察可看出使用maven默认的tomcat-maven-plugin:1.1插件启动的tomcat版本是Apache Tomcat/6.0.29

maven 版本管理 maven统一版本管理_Maven_31


另外,如果你不想使用默认的tomcat6.0.29,也可以配置使用tomcat7的插件,在pom.xml中添加如下插件配置

<plugin>
	<groupId>org.apache.tomcat.maven</groupId>
	<artifactId>tomcat7-maven-plugin</artifactId>
	<version>2.2</version>
	<configuration>
	<port>8003</port>  <!-- 端口号 -->
	<path>/testMavenWeb</path>  <!-- 访问名称 -->
	</configuration>
</plugin>

注意:在配置成tomcat7插件启动项目时,在Run As —> Maven build… —> Goals栏中输入不再是tomcat:run了,而是换成tomcat7:run

4.2 在idea中创建Maven的Web项目

IntelliJ IDEA创建maven web项目(IDEA新手适用)

5 依赖管理

Jar包的管理

需求:整合struts2 页面上传一个客户id 跳转页面

5.1 添加依赖:

打开maven仓库的视图:

maven 版本管理 maven统一版本管理_maven_32

5.2 重建索引

maven 版本管理 maven统一版本管理_tomcat_33


如果在Maven Repositories中的Local Repositories中的Local Repository点不开,则要右键Local Repository---->Rebuild Index

1、创建maven项目(同上)

2、跳过骨架(同上)

3、填写坐标信息(同上)

4、添加web.xml文件(同上)

5、修改编译版本(同上)

6、添加坐标 选择Dependencies标签 点击add

maven 版本管理 maven统一版本管理_maven 版本管理_34


7、手动输入要添加的坐标,选择版本,Scope:为依赖范围,这里的依赖范围有5种:compile、provided、runtime、test、system。

maven 版本管理 maven统一版本管理_tomcat_35


8、可以看到 pom.xml文件中多出了如下代码

maven 版本管理 maven统一版本管理_tomcat_36


9、同样的方式添加servlet-api.jar和jsp-api.jar 注意选择scope为provided,原因是因为tomcat中已经存在了这两个jar包

10、写action代码

import com.opensymphony.xwork2.ActionSupport;
public class CutomerAction extends ActionSupport {
	private Long custId;
	public Long getCustId() {
		return custId;
	}
	public void setCustId(Long custId) {
		this.custId = custId;
	}
	public String findById(){
		
		return SUCCESS;
	}
	
}

11、添加struts.xml文件放到resources目录中

maven 版本管理 maven统一版本管理_tomcat_37


内容:

<filter>
    <filter-name>struts2</filter-name>
     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

5.3 依赖范围

5.3.1 Compile(默认) struts2-core

编译(compile)时需要 测试时需要,运行时需要,打包时需要

5.3.2 Provided jsp-api.jar servlet-api.jar

编译(compile)时需要,测试(test)时也需要 ,运行时不需要,打包时不需要

5.3.3 Runtime 数据库驱动包

编译时不需要,测试时需要,运行时需要,打包时需要

5.3.4 Test junit.jar

编译时不需要,测试时需要,运行时不需要,打包也不需要

5.4 怎么解决循环依赖

目前知道有2个办法可以解决

第一个办法是用build-helper-maven-plugin插件来规避。比如A依赖B,B依赖C,C依赖A的情况。这个插件提供了一种规避措施,即临时地将工程A、B、C合并成一个中间工程,编译出临时的模块D。然后A、B、C再分别依赖临时模块D进行编译

这种方法可以解决无法构建的问题,但是只是一个规避措施,工程的依赖关系依然是混乱的

第二个办法是通过重构,从根本上消除循环依赖

如何重构

目前也知道2个重构的思路

第一个办法是平移,比如A和B互相依赖,那么可以将B依赖A的那部分代码,移动到工程B中,这样一来,B就不需要继续依赖A,只要A依赖B就可以了,从而消除循环依赖

第二个办法是下移,比如A和B互相依赖,同时它们都依赖C,那么可以将B和A相互依赖的那部分代码,移动到工程C里,这样一来,A和B相互之间都不依赖,只继续依赖C,也可以消除循环依赖

这两种重构方式都是可行的,具体采用哪种方式要根据实际情况来判断。不管采取哪种方式,都需要对代码进行修改,有时候并不是那么容易的

6 Maven项目Debug模式不能查看源码问题

在Maven项目中Debug模式中当想要断点查看源码运行时发现无法查看时,该如何解决?像下图一样。。。

maven 版本管理 maven统一版本管理_Maven_38

  1. 点击Edit Source Lookup Path…,弹出Edit Source Lookup Path窗口,点击添加,如下。

    接着选择Java Project选择我们要debug的项目
  2. 如果上面一轮操作还是没能显示debug源码,那么接着下面操作,右击项目—>Debug As—>Debug Configurations—>Source中选中要Debug的项目并点Debug按钮。

7 Maven的常用插件

maven-clean-plugin

maven-surefire-plugin

maven-compiler-plugin

maven-resources-plugin

maven-install-plugin

maven-dependency-plugin

maven-jar-plugin

maven-assembly-plugin

maven-assembly-plugin

Maven使用时的常见问题

查看项目中依赖了哪些有效依赖

在项目带有pom.xml的目录下执行mvn help:effective-pom
在项目带有pom.xml的目录下执行mvn dependency:resolve
在项目带有pom.xml的目录下执行mvn dependency:tree

Maven有哪些目标

什么是目标?
书上这么说的:一个目标是一个明确的任务,它可以作为单独的目标运行,或者作为一个大的构建的一部分和其它目标一起运行。一个目标是Maven中的一个“工作单元(unit of
work)”。
一个Maven插件是一个单个或者多个目标的集合。

resources:resources------>compiler:compile----->resources:testResources----->compiler:testCompile----->surefire:test----->jar:jar
冒号前面的是插件,冒号后面的是目标,插件:目标。其实我感觉这里的“目标”有点类似一个类当中的方法。

Maven当中啥叫构件?

构件指的就是artifact,其实也就是仓库当中每个artifactId位置下的东西,当中包括jar包、pom.xml等文件

在一个Maven仓库中,所有的东西存储在
一个与Maven项目坐标十分匹配的目录结构中。你可以打开浏览器,然后浏览中
央Maven仓库http://repo1.maven.org/maven2/ 来看这样的结构。你会看到坐标
为org.apache.commons:commons-email:1.1的构件能在目录/org/apache/commons/
commons-email/1.1/下找到,文件名为commons-email-1.1.jar。Maven仓库的标准是按
照下面的目录格式来存储构件,相对于仓库的根目录:

/<groupId>/<artifactId>/<version>/<artifactId>-<version>.<packaging>

生成站点和报告

在项目的目录下,运行以下命令:mvn site

如果一个项目当中依赖了同一个构件但是不同版本会有冲突问题吗?

忽略测试失败方法

通常,你会开发一个带有很多失败单元测试的系统。 如果你正在实践测试驱动开发(TDD),你可能会使用测试失败来衡量你离项目完成有多远。 如果你有失败的单元
测试,但你仍然希望产生构建输出,你就必须告诉 Maven 让它忽略测试失败。 当
Maven 遇到一个测试失败,它默认的行为是停止当前的构建。 如果你希望继续构
建项目,即使 Surefire 插件遇到了失败的单元测试,你就需要设置 Surefire 的
testFailureIgnore 这个配置属性为 true。

<project>
[...]
	<build>
		<plugins>
			<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-surefire-plugin</artifactId>
			<configuration>
				<testFailureIgnore>true</testFailureIgnore>
			</configuration>
			</plugin>
		</plugins>
	</build>
[...]
</project>

也可以通过表达式从命令行通过 -D 参数设置。

mvn test -Dmaven.test.failure.ignore=true

跳过单元测试

可能你有一个很大的系统,单元测试需要花好多分钟来完成,而你不想在生成最终输出前等单元测试完成。

mvn install -Dmaven.test.skip=true

或者

<project>
	[...]
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<configuration>
					<skip>true</skip>
				</configuration>
			</plugin>
		</plugins>
	</build>
	[...]
</project>

Maven本地仓库有jar包却提示找不到 / 生成.lastUpdated文件(Maven仓库_remote.repositories文件的作用)

  • Maven本地仓库有jar包却提示找不到 / 生成.lastUpdated文件(Maven仓库_remote.repositories文件的作用)

Maven .lastUpdated文件对项目的影响

Maven打包的时候如何指定特定参数到pom文件实现特定参数打包