Maven笔记
一.Maven的概念及作用
1.Maven本质上是一个项目对象模型(POM),是一个基于java平台的自动化构建工具(编译-测试-打包-部署->自动构建),也是项目管理工具.
2.Maven的设计核心:约定优于配置(convention over configuration),这也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需要做的决定的数量,获得简单的好处,而又不失灵活性.
3.Ant和Maven一种是命令式,一种是声明式.Ant需要我们指明各种动作,以及执行这些动作的顺序,比如编译代码,测试代码等.而Maven则默认大家都知道有各种动作,默认大家都遵守一个良好的目录结构,一个通用的构建过程.因此,使用Maven时我们只需要告诉Maven我们希望构建什么,而不需要告诉它如何构建.因为Maven已经在构建生命周期,阶段和目标中定义好了,我们要做的就是编写声明式的pom.xml文件.Gradle结合以上两个的优点,继承了Ant的灵活和Maven的生命周期管理,它被google作为了Android御用管理工具.它不用XML作为配置文件格式,采用了DSL格式,使得脚本更加简洁.Gradle引入了基于Groovy语言的DSL语法来代替XML配置,因此它的配置文件是一个Groovy文件.Gradle还把Maven的设计核心(Convention Over Configuration)发扬光大,而Gradle的配置即代码又超越了Maven.在Gradle中任何配置都可以作为代码被执行的,我们也可以随时使用已有的Ant脚本,Java类库,Groovy类库来辅助完成构建任务的编写.
4.完整的Maven项目构建过程包括:
清理:删除上次编译的结果,为重新编译做准备.
编译:java->class.
测试:针对于项目中的关键点进行测试,也可以用项目中的测试代码去测试开发代码.
报告:将测试的结果进行显示.
打包:将项目中包含的多个文件压缩成一个文件,用于安装或部署(java->jar,web项目->war).
安装:将打成的包放到本地仓库(本地仓库里没有想要的jar包就去远程仓库(*仓库,*仓库镜像,私服nexus)下载,*仓库镜像就是对*仓库的分流).
部署:将打成的包放到服务器上准备运行.
5.Maven通过坐标对项目所依赖的jar包进行统一规范管理.
6.管理jar包:
I.在pom.xml中添加依赖可以添加第三方jar包(在这个网址中搜索想要的jar包名称:http://mvnrepository.com/).
II.jar包之间的依赖关系(自动下载并关联所有jar包,且不会冲突).
7.如果项目非常庞大,就不适合使用package来划分模块,一个模块对应一个工程才利于分工协作.借助于maven就可以将一个项目拆分成多个工程.
8.Maven的约定目录结构:
I.main->执行项目,test->测试项目,两个目录下都有java和resources(java:java代码,resources:资源代码/配置代码).
II.target:用于存放编译,打包后的输出文件.
III.pom.xml:项目对象模型
<groupId>域名反转.大项目名</groupId>
<artifactId>子模块名</artifactId>
<version>版本号</version>
二.下载配置Maven
1.下载地址:http://maven.apache.org/download.cgi
2.Binary二进制,source源代码,含有gz的是Linux,zip的是Windows.
3.配置Maven之前先配置jdk(java的运行需要jdk,我安装的是1.7版本的):
I.点击我的电脑->系统属性->高级系统设置->环境变量->新建JAVA_HOME变量,变量值填写jdk的安装目录(例如E:\Java\jdk1.7).
II.寻找Path变量->在变量值最后输入%JAVA_HOME%\bin;(如果是第一次配置环境变量,先在这条语句复制粘贴前检查一下path里面已有的语句末尾是否有英文状态的分号,没有就加上).
III.新建CLASSPATH变量->变量值填写.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面的那个点和分号也要一起复制过去).
4.配置Maven:
I.新建MAVEN_HOME变量,变量值填写Maven的安装路径(例如F:\Maven).
II.再把%MAVEN_HOME%\bin;加入到Path里.
5.最后分别输入java,javac,mvn -v(横杠前面有一个空格),看看是否每次输入都会出来一大段英文,出来了就算成功.
6.配置本地仓库:默认本地仓库为C:\Users\BiggestKing(你的电脑管理员名称)\.m2\repository,可以进入到Maven的安装目录里面的conf\settings.xml中修改默认本地仓库路径(<localRepository>F:/MavenRepository(名字可以随便取)</localRepository>).
7.在编辑器中配置Installations,点击add选择安装maven的目录.
8.在编辑器中配置User Settings,找到安装maven的目录下的conf下的settings.xml.
三.使用Maven
1.打开编辑器->右击->New->点击Other...或者Project...搜索Maven->找到Maven Project并点击.
2.在新建Maven Project的第一个页面要勾选Create a simple project(网络不好可能导致maven项目创建后报错(CoreException: Could not get the value for parameter compilerId for plugin execution default-compile...),因为需要的东西没能全部下载完成).
3.Maven的继承:
I.建立父工程,并且父工程的打包方式(Packaging)为pom.
II.在父工程的pom.xml中编写依赖:
<dependencyManagement>
<dependencies>
<dependency>...</dependency>
</dependencies>
</dependencyManagement>
dependencies和dependencyManagement的区别在于:前者,即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项.后者,如果在子项目中不写该依赖项,那么子项目中是不会从父项目继承该依赖项的,只有在子项目中写了该依赖项,才会从父项目中继承该项,并且version和scope都读取自父项目.
III.在子工程的pom.xml中写:
a.父工程的<groupId>域名反转.大项目名</groupId>
<artifactId>子模块名</artifactId>
<version>版本号</version>
b.当前工程的pom.xml到父工程的pom.xml之间的相对路径.
<parent>
<groupId>域名反转.大项目名</groupId>
<artifactId>子模块名</artifactId>
<version>版本号</version>
<relativePath>../父工程名称/pom.xml</relativePath>
</parent>
IV.在子工程的pom.xml中需要声明使用那些父工程的依赖.
4.Maven的聚合:
I.Maven项目能够识别的:自身包含,本地仓库中的.
II.A依赖于B,则在执行时,必须先将B加入到本地仓库中.
III.聚合的使用:
a.在一个总工程中配置聚合,只能配置在打包方式为pom的Maven项目中.
<modules>
<!-- 项目的根路径 -->
<module>../项目名称</module>
<module>../项目名称</module>
</modules>
b.配置完聚合后,只要操作总工程则会自动操作聚合中配置的工程.
IV.Maven将一个大工程拆分陈若干个子工程,聚合可以将多个子工程合起来.
5.部署maven:
I.打war包到tomcat/webapps目录.
II.maven命令:deploy.
III.配置cargo,pom.xml中的属性信息:
<build>
<finalName>子模块名称</finalName>
<plugins>
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.6.4</version>
<configuration>
<container>
<containerId>tomcat8x</containerId>
<home>E:\apache-tomcat-8.0.36-windows-x64\caf-tomcat-8.0.36</home>
</container>
<configuration>
<type>existing</type>
<home>E:\apache-tomcat-8.0.36-windows-x64\caf-tomcat-8.0.36</home>
</configuration>
</configuration>
<executions>
<execution>
<id>cargo-run</id>
<phase>install</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
6.在编辑器中编写完pom.xml后,需要update.
7.第一次执行Maven项目需要点击Maven build...,然后在Goals一栏输入命令,最后run起来,之后再执行可以直接点击Maven build,这玩意保存了上次在Maven build...里输入的命令(像clean,install,test这三个命令已经有了也可以直接点击,不用在Maven build...里输入命令).
四.执行maven
1.必须在pom.xml所在的目录中执行.
2.maven常用命令(cmd中可执行):
I.mvn compile 编译main目录下的java文件.
II.mvn test-compile 编译测试程序.
III.mvn test 测试.
IV.mvn report 报告测试程序执行的结果.
V.mvn package 打包成jar/war.
VI.mvn install 将开发的模块放入本地仓库,供其他模块使用.
VII.mvn clean 删除target目录(编译文件的目录).
VIII.mvn deploy 部署项目.
五.依赖:A中的某些类需要使用B中的某些类,则称之为A依赖B.在maven项目中如果要使用一个当时不存在的jar或模块,可以通过依赖实现(去本地仓库或*仓库找).
1.compile(支持compile,test,run,默认) test(支持test) provided(支持compile,test) runtime(支持test,run) system(支持compile,test).
2.maven在编译,测试,运行项目时各自使用一套classpath.
3.依赖排除:当我们只需要A.jar不需要B.jar,就需要用到依赖排除.
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
......
</exclusions>
4.依赖的传递性:如果A.jar依赖于B.jar依赖于C.jar,那么也可以说A.jar依赖于C.jar(仅当B.jar依赖于C.jar的范围是compile).
5.依赖的原则:
I.在同一个pom.xml文件中有2个相同的依赖,后面的依赖会覆盖前面的依赖.
II.在不同的pom.xml文件中有2个相同的依赖,先声明的依赖会覆盖后声明的依赖.
六.maven的生命周期
1.生命周期和构建的关系:生命周期中的顺序:a,b,c,当我们执行c时,实际执行的是a,b,c.
2.生命周期包含的三个阶段:
I.clean lifecycle:清理
pre-clean clean post-clean.
II.default lifecycle:默认
有很多,常用的有test-compile test package install.
III.site lifecycle:站点
pre-site site post-site site-deploy.
七.统一JDK版本(JDK只能够识别source folder中的源码)
1.右键->Properties->build path->Libraries->删除原本的Library->add Library->JRE System Library->第二个选项选择JDK.
2.右键->Properties->Project Facets->java verson.
3.通过maven改JDK版本
<profiles>
<profile>
<id>jdk-17</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<maven.compiler.source></maven.compiler.source>
<maven.compiler.target></maven.compiler.target>
<maven.compiler.compilerVersion></maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>