02 maven.txt
UP 返回
1.简介
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理
安装:下载bin.zip,解压,配置环境:
系统变量:MAVEN_HOME = C:\Users\guoyongfeng\apache-maven-3.5.0
系统变量:path = %MAVEN_HOME%\bin
mvn -version查看版本
2.阿里云仓库(直接全部复制到mirrors就可以了)
<!-- 阿里云仓库 -->
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
<!-- 中央仓库1 -->
<mirror>
<id>repo1</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo1.maven.org/maven2/</url>
</mirror>
<!-- 中央仓库2 -->
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>
3.Maven项目结构:
ProjectName
|-src
| |-main
| | |-java 项目源码
| | |-resources 项目资源文件,比如各种配置
| |-test
| |-java 测试代码,如Junit
| |-resources 测试资源文件
|-target 目标文件输出位置(如.class .jar .war文件)
|-pom.xml maven核心配置文件
4.maven的一些命令
mvn help:system 会自动从官网下载一些必须包
mvn compile 完成编译操作。执行完毕后,会生成target目录,该目录中存放了编译后的字节码文件。
mvn clean 执行完毕后,会将target目录删除。
mvn test 完成单元测试操作。执行完毕后,会在target目录中生成三个文件夹:surefire、surefire-reports(测试报告)、test-classes(测试的字节码文件)
mvn package 完成打包操作。执行完毕后,会在target目录中生成一个文件,该文件可能是jar、war
mvn install 执行 mvn install命令,完成将打好的jar包安装到本地仓库的操作。执行完毕后,会在本地仓库中出现安装后的jar包,方便其他工程引用
mvn 组合命令
mvn clean compile
mvn clean test
mvn clean package
mvn clean install
5.pom.xml格式
<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>
<groupId>com.dm</groupId> <!-- 组id -->
<artifactId>maventest2</artifactId> <!-- 项目id -->
<version>0.0.1-SNAPSHOT</version> <!-- 版本 -->
<!-- ◀以上是自动生成的(GAV:maven的坐标) -->
<dependencies>
<dependency>
<groupId>junit</groupId> <!-- ◀普通的引包 -->
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>compile</scope> <!-- ◀依赖范围,可以不写 -->
</dependency>
<dependency>
<groupId>com.dm</groupId> <!-- ◀引用本地其他的maven项目。其中的参数就是被引用的项目的各个属性 -->
<artifactId>maventest1</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
6.一些问题汇总
6.1 eclipse默认是运行在jre上的,但是maven的插件需要使用jdk(jre没有编译功能),使用maven install会报错,需要点击Windows→Preferences→Java→Installed JREs,Add选择Standard VM,选择jdk所在目录
6.2 jar坐标查找地址:
http://www.mvnrepository.com
http://search.maven.org/
6.3 依赖范围(和依赖传递有关):
maven配置中依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
test:测试依赖范围。只对于测试classpath有效
provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
runtime:运行时提供。例如:jdbc驱动
6.4 依赖传递:
项目test2的pom中引用test1,就是直接依赖;test3中引用了test2,那test3和test1就是间接依赖,test1和tset2是第一直接依赖,test3和test2是第二直接依赖。
test2中的依赖范围如果是compile的,其依赖就可以被传递给test3;如果依赖范围是test,就无法传递过去,test3需要自己导入依赖
6.5 依赖冲突:(就近引用)
假如test1使用junit4.10依赖,并且scope是compile,那test2,test3都可以使用test1的junit4.10,因为传递下来了
假如test2使用junit4.9依赖,那test3会使用【就近的一个依赖】,也就是使用junit4.9
6.6 可选依赖
<optional> true/false<optional> 是否可选,也可以理解为是否向下传递。如果是true则不传递,如果是false就传递,默认为false
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<optional>true</optional>
</dependency>
6.7 排除依赖:(test3引用test2,同时希望test2中的部分包不要被传递进来)
exclusions可用于排除依赖,注意exclusions是写在dependency中
<dependency>
<groupId>com.dm</groupId>
<artifactId>test2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions> <!-- ▶如果有多个可以继续添加exclusion -->
<exclusion>
<groupId>com.dm</groupId> <!-- 组id -->
<artifactId>test1</artifactId> <!-- 项目id(在test2中被引用的依赖。即test3不希望test2引用的test1被传递过来)-->
</exclusion>
</exclusions>
</dependency>
6.8 可以通过pom.xml配置插件来更改项目编译compile的jdk版本(放在project标签里):
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source> <!-- maven项目的编译器默认是1.5的,这里可以指定jdk版本 -->
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
6.9 eclipse创建maven项目时可以选择jar或者war来创建普通项目后者web项目。maven的web项目目录结构比简单项目多了个webapp目录,需要在webapp项目中自己添加WEB-INF目录和web.xml文件
这些文件可以自己先在eclipse中创建一个web工程(Dynamic Web Project,注意创建的时候要点击next勾选生成web.xml,否则没有该文件。如果eclipse无法创建这种工程,参https://blog.csdn.net/maihilton/article/details/82499923),然后把WebContent下的WEB-INF整个复制到maven项目的webapp下就可以了
7 maven生命周期(不重要)
7.1 在Maven中有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:
Clean Lifecycle: 在进行真正的构建之前进行一些清理工作。
Default Lifecycle: 构建的核心部分,编译,测试,打包,部署等等。
Site Lifecycle: 生成项目报告,站点,发布站点。
7.2 Clean生命周期:清理项目
Clean生命周期一共包含了三个阶段:
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在clean之后立刻完成的工作
也就是说,mvn clean 等同于 mvn pre-clean clean
如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。
这是Maven很重要的一个规则,可以大大简化命令行的输入。
7.3 Default生命周期:构造项目
Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如 JAR 。
pre-integration-test
integration-test
post-integration-test
verify
install 将包安装至本地仓库,以让其它项目依赖。
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享
运行任何一个阶段的时候,它前面的所有阶段都会被运行
这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包,安装到本地仓库
此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。
7.4 Sit生命周期:生成项目站点
这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能
Manager比较喜欢,文档及统计数据自动生成,很好看。我们就不用学,以后自己研究
pre-site 执行一些需要在生成站点文档之前完成的工作
site 生成项目的站点文档
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy 将生成的站点文档部署到特定的服务器上
DOWN 返回