目录
- 项目管理利器——maven
- 第1章 maven概述
- 1-1 项目管理利器-maven简介
- 1.1.1 什么是maven
- 1.1.2 什么是依赖管理
- 1.1.3 传统项目的依赖管理
- 1.1.4 maven项目的依赖管理
- 1.1.5 什么是项目构建
- 1.1.6 Maven好处
- 1-1 项目管理利器-maven简介
- 第2章 maven快速入门
- 2-1 环境搭建
- 下载后解压的目录对应的含义
- 配置环境变量
- 2-2 第一个maven案例hellomaven
- 文件结构
- 网上实例
- 2-1 环境搭建
- 第3章 Maven核心知识
- 3-1 maven常用的构建命令
- 3-2 maven自动建立目录骨架
- 3-3 maven中的坐标和仓库
- 3.3.1 Maven仓库的概述
- 3.3.2 修改本地仓库位置
- 3.3.3 三种仓库的关系
- 3-4 在eclipse中安装maven插件以及创建maven项目
- 3-5 maven的生命周期和插件
- 3.5.1 maven的三种生命周期
- 3.5.2 命令与生命周期关系
- 3.5.3 插件
- 3-6 maven中Pom.xml解析
- 3.6.1 基础配置
- 3.6.2 构建配置
- 3.6.3 分发配置
- 3.6.4 仓库配置
- 3.6.5 profile配置
- 3.6.6 报表配置
- 3.6.7 环境配置
- 3.6.8 项目信息配置
- 3-7 maven依赖范围
- 3.7.1 什么是依赖范围?
- 3.7.2 依赖范围在pom.xml中如何体现?
- 3.7.3 有哪些依赖范围?
- 表格总结
- 3-8 maven依赖传递和依赖原则
- 3-9 maven聚合和继承
- 3.9.1 继承
- 3.9.2 聚合
- 3.9.3 继承与聚合的关系
- 第4章 如何构建web项目
- 4-1 使用maven构建web项目
项目管理利器——maven
简介:maven是优秀的项目管理和构建工具,能让我们更为方便的来管理和构建项目,从最基础的环境配置,到maven核心知识点的应用,本笔记将带领大家进行一段轻松的maven之旅。让我们一起使用maven来构建和管理Java项目吧!
第1章 maven概述
视频来源:慕课网
1-1 项目管理利器-maven简介
1.1.1 什么是maven
是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的。Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
1.1.2 什么是依赖管理
一个java项目需要外部的第三方jar包来进行支持。我们说这个java项目依赖了这些jar包。
依赖管理就是将项目所依赖的jar包按照一定规则进行规范化管理。
1.1.3 传统项目的依赖管理
传统的依赖管理就是程序员需要什么jar包,去网上进行下载,然后手动添加到工程中。
缺点:
- jar包从网上不好找
- jar包没有进行统一管理,容易造成jar包重复及版本冲突
- jar包全部添加到工程中,造成工程过大
1.1.4 maven项目的依赖管理
maven项目有一个文件叫pom.xml。我们通过在此文件中配置jar包的坐标即可将jar包引入到工程中。Jar包的坐标可从maven仓库中获取。
好处:
- 通过pom配置来引入jar包,避免了jar包的版本冲突。
- Maven团队维护了一个jar包仓库,十分全,避免了去网上寻找jar包的尴尬,节省时间。
1.1.5 什么是项目构建
项目构建是一个项目从编写源代码到编译,测试,运行,打包,部署,运行的过程。
1.1.5.1 传统项目构建过程
(1) 在eclipse中新建一个WEB工程。
(2) 进行编码及编写配置文件
(3) 对源代码进行编译运行,生成class文件
(4) 打成war包,部署至tomcat
1.1.5.2 Maven项目构建过程
一个命令tomcat:run完成对项目的构建。
1.1.6 Maven好处
- 一步构建:一个命令即可启动。
- 依赖管理:对jar包统一管理,避免冲突等问题
- 跨平台:可在windows及linux下运行
- 有利于提高大型项目的团队开发效率
- 越来越多的公司使用maven
第2章 maven快速入门
本章介绍如何在windows环境下搭建maven环境,以及用一个简单的案例来快速体验下maven项目的构建过程。
2-1 环境搭建
下载地址:http://maven.apache.org/download.cgi
下载后解压的目录对应的含义
目录在F:\java\资料\java组件\maven3.6.2
bin目录:maven的运行文件。mvn.cmd正常运行mvn,mvnDebug.cmd已debug方式运行maven。
boot目录:maven运行需要类加载器。
conf目录:maven的配置文件目录,核心配置文件为其中的setting.xml。
lib目录:maven所需要的jar包。
配置环境变量
2-2 第一个maven案例hellomaven
maven管理的项目,在项目名称文件夹下有src文件夹和pom.xml文件,运行后会有target文件夹。其中src下又有main、test、resources文件夹,分别存放实现业务需求的方法、测试方法、静态文件。pom.xml则是此项目的jar包配置管理文件。
下面实现一个HelloWorld方法,看一下项目的文件结构
文件结构
网上实例
参考
第3章 Maven核心知识
本章介绍maven中的重要知识点:如maven的目录骨架分析,默认仓库的更改,坐标的概念,依赖的概念,eclipse中插件的安装。
3-1 maven常用的构建命令
maven命令语句
mvn -v 查看maven版本
mvn compile 用来将src/main/java下的文件编译为class文件,并输出到target中。
mvn test test 用来将src/main/test下的文件进行编译,同时执行一次
mvn package 打包,将项目进行打包,如果是jar打包为jar,war打包为war。
mvn clean 删除编译产生的target文件夹
mvn install 安装jar包到本地仓库中
3-2 maven自动建立目录骨架
2种方式,详细说明
3-3 maven中的坐标和仓库
相关信息参考文献:
坐标:构件
仓库:本地仓库和远程仓库
详细说明
镜像仓库
说明
更改仓库位置
说明
3.3.1 Maven仓库的概述
maven仓库用来存储jar包。maven项目都是从仓库中获取jar包。maven仓库分三种:本地仓库,远程仓库,中央仓库。
本地仓库:用来存储从远程仓库及中央仓库下载的jar包,自己来维护。项目使用的jar包优先从本地仓库获取。本地仓库的默认位置在\({user.home}/.m2/repository。\){user.home}表示用户所在的位置。
远程仓库:如果本地仓库没有所需要的jar包,默认去远程仓库下载。远程仓库由公司来进行维护又可称为私服。
中央仓库:中央仓库由maven团队来进行维护,服务于整个互联网。其仓库中存储大量的jar包。
3.3.2 修改本地仓库位置
本地仓库的配置在settings.xml文件中修改。
3.3.3 三种仓库的关系
本地项目需要jar包,先从本地仓库中获取,如果本地仓库中没有,则从私服中获取,如果私服没有,则从中央仓库获取。获取到后,本地仓库及远程仓库各存储一份。如果没有远程仓库,本地仓库则直接从中央仓库获取,然后在本地仓库存储一份。
3-4 在eclipse中安装maven插件以及创建maven项目
视频
详细说明:4.4节:创建web
3-5 maven的生命周期和插件
3.5.1 maven的三种生命周期
maven对项目的构建分为三套相互独立的生命周期。
cleanLifecycle:在项目构建前,先进行一些清理工作。
defaultLifecycle:构建的核心部分,编译,测试,打包,部署。
siteLifecycle:生成项目报告,站点,发布报告。
maven的每个生命周期都有很多阶段,每个阶段对应一个执行命令。
clean
1、clean生命周期:清理项目,包含三个phase。
1)pre-clean:执行清理前需要完成的工作
2)clean:清理上一次构建生成的文件
3)post-clean:执行清理后需要完成的工作
default
2、default生命周期:构建项目,重要的phase如下。
1)validate:验证工程是否正确,所有需要的资源是否可用。
2)compile:编译项目的源代码。
3)test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
4)package:把已编译的代码打包成可发布的格式,比如jar。
5)integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。
6)verify:运行所有检查,验证包是否有效且达到质量标准。
7)install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。
8)deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
site
3、site生命周期:建立和发布项目站点,phase如下
1)pre-site:生成项目站点之前需要完成的工作
2)site:生成项目站点文档
3)post-site:生成项目站点之后需要完成的工作
4)site-deploy:将项目站点发布到服务器
3.5.2 命令与生命周期关系
每个maven命令对应生命周期的某一阶段,例如clean命令对应maven的clean阶段。test命令对应maven的default阶段。
执行命令会自动将该阶段以前的命令执行,例如执行clean命令,将自动执行pre-clean命令。
执行某个生命周期某个阶段,不会影响生命周期其他阶段。
如果要执行多个生命周期的命令,中间用空格隔开,例如mvn clean compile。
3.5.3 插件
我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的。进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,例如maven-compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码。
用户可以通过两种方式调用Maven插件目标。第一种方式是将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已,例如Maven默认将maven-compiler-plugin的compile目标与 compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标。第二种方式是直接在命令行指定要执行的插件目标,例如mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。
MAVEN插件介绍和配置
3-6 maven中Pom.xml解析
参考资料
setting.xml主要用于配置maven的运行环境等一系列通用的属性,是全局级别的配置文件;而pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件。
3.6.1 基础配置
一个典型的pom.xml文件配置如下:
4.0.0
com.winner.trade
trade-core
1.0.0-SNAPSHOT
jar
...
com.winner.trade
trade-test
1.0.0-SNAPSHOT
test
false
org.slf4j
slf4j-api
UTF-8
1.5
1.5
...
一般来说,上面的几个配置项对任何项目都是必不可少的,定义了项目的基本属性。
这里有必要对一个不太常用的属性classifier做一下解释,因为有时候引用某个jar包,classifier不写的话会报错。
classifier元素用来帮助定义构件输出的一些附属构件。附属构件与主构件对应,比如主构件是 kimi-app-2.0.0.jar,该项目可能还会通过使用一些插件生成 如kimi-app-2.0.0-javadoc.jar (Java文档)、 kimi-app-2.0.0-sources.jar(Java源代码)这样两个附属构件。这时候,javadoc、sources就是这两个附属构件的classifier,这样附属构件也就拥有了自己唯一的坐标。
classifier的用途在于:
- maven download javadoc / sources jar包的时候,需要借助classifier指明要下载那个附属构件
- 引入依赖的时候,有时候仅凭groupId、artifactId、version无法唯一的确定某个构件,需要借助classifier来进一步明确目标。比如JSON-lib,有时候会同一个版本会提供多个jar包,在JDK1.5环境下是一套,在JDK1.3环境下是一套
引用它的时候就要注明JDK版本,否则maven不知道你到底需要哪一套jar包:
net.sf.json-lib
json-lib
2.4
jdk15
3.6.2 构建配置
myPorjectName
${basedir}/target
install
../filter.properties
resources
true
src/main/resources
**/*.properties
**/*.xml
jdbc.properties
${basedir}\src\main\java
${basedir}\src\main\scripts
${basedir}\src\test\java
${basedir}\target\classes
${basedir}\target\test-classes
org.apache.maven.wagon
wagon-ssh
2.8
maven-assembly-plugin
2.5.5
assembly
package
single
false
${finalName}
false
assembly.xml
false
...
true
...
pom里面的仓库与setting.xml里的仓库功能是一样的。主要的区别在于,pom里的仓库是个性化的。比如一家大公司里的setting文件是公用的,所有项目都用一个setting文件,但各个子项目却会引用不同的第三方库,所以就需要在pom里设置自己需要的仓库地址。
3.6.3 分发配置
true
repo-id
repo-name
file://${basedir}/target/deploy
site-id
site-name
scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web
3.6.4 仓库配置
repo-id
repo-name
http://192.168.1.169:9999/repository/
default
3.6.5 profile配置
false
1.7
Windows XP
Windows
x86
5.1.2600
mavenVersion
2.0.3
/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
profile配置项在setting.xml中也有,是pom.xml中profile元素的裁剪版本,包含了id,activation, repositories, pluginRepositories和properties元素。这里的profile元素只包含这五个子元素是因为setting.xml只关心构建系统这个整体(这正是settings.xml文件的角色定位),而非单独的项目对象模型设置。如果一个settings中的profile被激活,它的值会覆盖任何其它定义在POM中或者profile.xml中的带有相同id的profile。
pom.xml中的profile可以看做pom.xml的副本,拥有与pom.xml相同的子元素与配置方法。它包含可选的activation(profile的触发器)和一系列的changes。例如test过程可能会指向不同的数据库(相对最终的deployment)或者不同的dependencies或者不同的repositories,并且是根据不同的JDK来改变的。只需要其中一个成立就可以激活profile,如果第一个条件满足了,那么后面就不会在进行匹配。
3.6.6 报表配置
http://java.sun.com/j2se/1.5.0/docs/api/
sunlink
javadoc
3.6.7 环境配置
jira
http://jira.clf.com/
3.6.8 项目信息配置
banseon-maven
http://www.clf.com/
A maven project to study maven.
Demo
[email protected]
[email protected]
[email protected]
http:/hi.clf.com/
HELLO WORLD
banseon
[email protected]
Project Manager
Architect
demo
http://hi.clf.com/
No
-5
Apache 2
http://www.clf.com/LICENSE-2.0.txt
repo
Abusiness-friendly OSS license
scm:svn:http://svn.baidu.com/banseon/maven/
scm:svn:http://svn.baidu.com/banseon/maven/
http://svn.baidu.com/banseon
demo
http://www.clf.com/
3-7 maven依赖范围
3.7.1 什么是依赖范围?
maven项目不同的阶段引入到classpath中的依赖是不同的,例如,编译时,maven会将与编译相关的依赖引入classpath中,测试时,maven会将测试相关的的依赖引入到classpath中,运行时,maven会将与运行相关的依赖引入classpath中,而依赖范围就是用来控制依赖于这三种classpath的关系。
3.7.2 依赖范围在pom.xml中如何体现?
pom文件如下配置:
junit
junit
4.7
test
其scope标签就是依赖范围的配置,默认是compile,可选配置有test、provided、runtime、system、import
3.7.3 有哪些依赖范围?
即标签的可选配置:compile、test、provided、runtime、system、import,下面一一介绍:
1) 编译依赖范围(compile),该范围就是默认依赖范围,此依赖范围对于编译、测试、运行三种classpath都有效,举个简单的例子,假如项目中有spring-core的依赖,那么spring-core不管是在编译,测试,还是运行都会被用到,因此spring-core必须是编译范围(构件默认的是编译范围,所以依赖范围是编译范围的无须显示指定)
org.springframework
spring-core
2.5 compile
2)测试依赖范围(test),顾名思义就是针对于测试的,使用此依赖范围的依赖,只对测试classpath有效,在编译主代码和项目运行时,都将无法使用该依赖,最典型的例子就是 Junit, 构件在测试时才需要,所以它的依赖范围是测试,因此它的依赖范围需要显示指定为test ,当然不显示指定依赖范围也不会报错,但是该依赖会被加入到编译和运行的classpath中,造成不必要的浪费 。
junit
junit
4.7
test
3)已提供依赖范围(provided),使用该依赖范围的maven依赖,只对编译和测试的classpath有效,对运行的classpath无效,典型的例子就是servlet-api,编译和测试该项目的时候需要该依赖,但是在运行时,web容器已经提供的该依赖,所以运行时就不再需要此依赖,如果不显示指定该依赖范围,并且容器依赖的版本和maven依赖的版本不一致的话,可能会引起版本冲突,造成不良影响。
javax-servlet
servlet-api
2.0
provided
4)运行时依赖范围(runtime),使用该依赖范围的maven依赖,只对测试和运行的classpath有效,对编译的classpath无效,典型例子就是JDBC的驱动实现,项目主代码编译的时候只需要JDK提供的JDBC接口,只有在测试和运行的时候才需要实现上述接口的具体JDBC驱动。
5)系统依赖范围(system),该依赖与classpath的关系与provided依赖范围完全一致,但是系统依赖范围必须通过配置systemPath元素来显示指定依赖文件的路径,此类依赖不是由maven仓库解析的,而且往往与本机系统绑定,可能造成构件的不可移植,因此谨慎使用,systemPath元素可以引用环境变量:
javax.sql
jdbc-stext
2.0
system
${java.home}/lib/rt.jar
6)导入依赖范围(import),该依赖范围不会对三种classpath产生影响,该依赖范围只能与dependencyManagement元素配合使用,其功能为将目标pom文件中dependencyManagement的配置导入合并到当前pom的dependencyManagement中。有关dependencyManagement的功能请了解maven继承特性。
表格总结
scope | 编译 | 测试 | 运行 |
---|---|---|---|
compile | Y | Y | Y |
test | Y | ||
provided | Y | Y | |
runtime | Y | Y | |
system | Y | Y |
3-8 maven依赖传递和依赖原则
A->B,B->C====>A->C
别人总结
可以在A的pom.xml用这个标签消除对C的依赖
3-9 maven聚合和继承
别人总结
3.9.1 继承
在构建多个模块的时候,往往会多有模块有相同的groupId、version,或者有相同的依赖,为了减少pom文件的配置,跟我们的项目中类的继承一样,在父工程中配置了pom,子项目中的pom可以继承.
可继承的POM元素
- groupId:项目组ID,项目坐标的核心元素
- version:项目版本,项目坐标的核心元素
- description:项目的描述信息
- organnization:项目的组织信息
- inceptionYear:项目的创始年份
- url:项目的URL地址
- developers:项目的开发者信息
- dependencies:项目的依赖配置
- dependencyManagement:项目的依赖管理配置
- repositories:项目的仓库配置
- build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
继承POM的用法
面向对象设计中,程序员可以通过一种类的父子结构,在父类中声明一些字段和方法供子类继承,这样可以做到“一处声明、多处使用”,类似的我们需要创建POM的父子结构,然后在父POM中声明一些配置,供子POM继承。
子工程gropid 和version没写,是因为子工程的groupid和version和父工程的一样.所以子工程继承了父工程,但是当子工程的groupid,version和父工程的不一样的时候,就需要自己重写.父模块只是为了帮助消除配置的重复,因此它本身不包含除POM之外的项目文件,也就不需要src/main/java之类的文件夹了。
integral-kernel-parent
pom
com.dmsdbj.cloud
cloud-integral-parent
0.0.2-SNAPSHOT
在父pom 中定义了整个项目所需要的依赖,如tools等.
com.dmsdbj.cloud
cloud-tool
0.0.2-SNAPSHOT
provided
org.projectlombok
lombok
provided
依赖管理
当多有模块中有相同的依赖时,我们可以将这些依赖提取出来,同一在父POM中声明,这样就可以简化子模块的配置了,但是这样还是存在问题,当想在项目中加入一些,不需要这么多依赖的模块,如果让这个模块也依赖那些不需要的依赖,显然不合理。
Maven提供的dependentcyManagement元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活度。在dependentcyManagement元素下的依赖声明不会引入实际的依赖,而是定义了依赖的版本,对版本进行同一管理,避免出现版本不一致的情况:
org.springframework.boot
spring-boot-dependencies
${spring-boot-dependencies.version}
pom
import
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud-dependencies.version}
pom
import
dependencyManagement声明的依赖既不会给项目引入依赖,也不会给它的子模块引入依赖,不过这段配置是会被继承的。真正地引入到项目中是在子项目的pom文件中进行定义声明的.
dependencyManagement声明依赖能够统一规范项目中依赖的版本,当依赖的版本在父POM中声明之后,子模块在使用依赖的时候就无效声明版本,也就不会发生多个子模块使用依赖版本不一致的情况。这可以降低依赖冲突的几率。
3.9.2 聚合
在我们的项目中有controller,service,dao层,每一个里面都有pom文件,在构建的需要把每一个都进行构建,但是有了聚合,我们创建一个额外的模块。然后通过该模块,来构建整个项目的所有模块把他们聚合到一起,能够使用一条命令就构建多个模块,聚合工程的结构如下:
pom文件如下:
e3-parent
cn.e3mall
1.0-SNAPSHOT
../e3parent/pom.xml
4.0.0
cn-manager
1.0-SNAPSHOT
e3-manager-pojo
e3-manager-dao
e3-manager-interface
e3-manager-service
e3-manager-web
pom
一个特殊的地方就是packaging,其值为pom,如果没有声明的话,默认为jar,对于聚合模块来说,其打包方式必须为pom,否则无法构建。
modules里的每一个module都可以用来指定一个被聚合模块,这里每个module的值都是一个当前pom的相对位置。
3.9.3 继承与聚合的关系
继承是为了减少配置,配置是为了方便快速构建项目.
继承:在子工程的pom 文件中定义元素
聚合:它知道有哪些被聚合的模块,但那些被聚合的子模块不知道这个聚合模块的存在.
为了方便,有的工程既是聚合工程也是父工程.
第4章 如何构建web项目
介绍如何使用maven创建web项目,如何安装jetty插件和tomcat插件,并简介如何将项目打包到jetty和tomcat中,并运行。
4-1 使用maven构建web项目
https://www.cnblogs.com/hongmoshui/p/7994759.html