Maven
命令方式构建项目
mvn compile
:编译项目,生成target文件(不编译测试代码)
mvn package
:打包项目,生成jar或war文件(不指定默认jar包)
mvn clean
:清理编译或打包后的项目结构
mvn install
:打包后上传到maven本地仓库
mvn deploy
:打包后上传到私服仓库
mvn site
:生成站点
mvn test
:执行测试源码
这些命令都是利用maven插件进行操作的,因此如果哪个命令出问题,可以更改插件解决
例如,war包打包插件和jdk版本不匹配,在pom.xml中添加如下代码:
<build><plugins><plugin><groupId>org. apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.2.2</version></plugin></plugins>
</build>
下载依赖失败怎么办
原因
- 网络问题
- 本地Maven仓库或缓存被污染或损坏,导致mavne无法正确使用现有的依赖项
- 版本不存在
解决方法
- 进入本地仓库删除对应文件夹,重新进行下载尝试
- 去mvnrepository查询
编译周期
每个命令都有一个周期,执行顺序为
compile——>test——>package——>install——>deploy
执行某个动作前会先执行他之前的动作
例如执行package,会先执行compile和test
依赖范围
一般来说,使用mvnrepository的scope就行,不需要修改
通过设置坐标的依赖范围(scope),可以设置对应jar包的作用范围:编译环境(写代码)、测试环境(test)、运行环境(jar/war包)
compile
:缺省值,在上述三种classpath均会生效
test
:只在测试classpath生效,编译用不了,jar/war的lib下也没有依赖
provided
:只对编译和测试classpath有效
由于jar/war放在服务器上,比如tomcat,它本身提供相关包,部署到服务器上时,使用的是tomcat的lib包,所以不需要再运行环境使用该依赖。只是在编码(给出代码提示)和测试(提供测试环境)时需要使用这个依赖,最终运行版本由服务器决定
典型pom包为servlet-api,给出的scope为provided
runtime
:只对测试、运行classpath有效。
如JDBC驱动实现依赖(SPI实现),编译时使用的JDK提供的JDBC接口,不需要JDBC驱动实现,但测试和运行时需要提供,这样才能找到JDBC驱动实现,否则会报错
system
:和provided作用范围相同,不推荐使用
import
:导入依赖范围,只能与dependencyManagement元素配合使用,可以将目标pom.xml中dependencyManagement的配置导入到当前pom.xml的dependencyManagement中
Build构建配置
项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
默认情况下,构建不需要额外配置,都有对应的缺省配置。可以定制一些配置,以达到修改默认构建的行为和产物
比如
- 指定构建打包文件的名称
<build><finalName>xxx-版本号.jar/war</finalName>
</build>
- 打包时指定包含文件格式和排除文件
场景
java下只允许存在java类
resources下只允许存在资源类
但是mybatis的mapper一般放在java下
解决方法
<build><resources><resource><!---设置资源所在目录--><directory>src/main/java</directory><includes><!--设置包含的资源类型--><include>**/*.xml</include></includes></resource></resources>
</build>
作用
将java下任意的xml文件作为资源文件打包
- 打包插件版本过低,配置更高版本插件
插件本质是本地仓库的jar包
<build><plugins><plugin><groupId>org. apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><!--configuration是给tomcat进行配置--><configuration><port>8090</port><path>/</path><uriEncoding>UTF-8</uriEncoding><server>tomcat7</server></configuration></plugin></plugins>
</build>
添加后会出现tomcat相关plugin
这样就无需再进行复杂操作,直接通过插件运行java项目即可
依赖传递
A——>B,B——>C,A能否依赖C取决于B依赖C时使用的依赖范围及配置
B——>C
compile
:可以传递
test、provided
:不能传递
设置<option>
为true:不能传递(终止传递)
依赖冲突
自动选择原则
- 短路优先原则
- 在依赖同一个不同版本的jar包时优先选择依赖链短的
- A——>B——>C——>D(1.x)
- A——>D(2.x)
- 此时依赖的是2.x,短
- 长度相同时,优先声明原则(第二原则)
- 相同时依赖先依赖的
- A——>D(1.0)
- A——>D(2.0)
- 因为在pom中先定义的1.0,所以依赖的是1.0
手动选择
不想使用maven的自动选择原则,可以手动选择需要的包
实例前提:pom中依赖了maven_B和maven_C,而且B和C都依赖了druid
想使用maven_C中的druid包
<dependencies><dependency><groupId>com.atguigu.maven</groupId><artifactId>maven_B</artifactId><version>1.0</version><exclusions><exclusion><groupId>com.alibaba</groupId><artifactId>druid</artifactId></exclusion></exclusions></dependency>
</dependencies>
其实使用<option>
阻止B的依赖传递也可以,但是这是B是自己的项目时可以干的,一般依赖的包时不允许修改的
Maven工程继承和聚合关系
继承
在Maven项目中,让一个项目从另一个项目中继承配置信息
的机制,可以在多个项目中共享同一配置信息,简化项目的管理和维护工作
作用
在父工程中统一管理项目的依赖信息
背景
- 对大型项目进行模块拆分
- 一个project下创建了很多个module
- 每一个module都需要自己的依赖信息
语法
父工程(删除src和test,只保留pom.xml)
<groupId>com.atguigu.maven</groupId><artifactId>maven_parent</artifactId><version>1.0</version><packaging>pom</packaging>
子工程
<parent><artifactId>maven_parent</artifactId><!--groupId和父工程保持一致--><groupId>com.atguigu.maven</groupId><!--version和父工程保持一致--><version>1.0</version></parent><!--artifactId(模块名)自己的名字--><artifactId>maven_son</artifactId>
如果在父工程中直接使用dependencies
,在父工程中的依赖会传递给子工程
而使用dependencyManagement
,子工程需要手动选择需要继承的依赖,但会和普通依赖不太一样(不需要版本号)
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId>
</dependency>
聚合
将多个项目组织到一个父级项目中,以便一起构建和管理的机制,可以更好的管理一组相关的子项目,同时简化构建和部署的过程。
简单来说,就是父工程执行什么操作,子工程就跟着进行什么操作
在父工程中,包含子工程的路径
(就是文件的相对路径)
聚合无需手动操作,IDEA会自动创建
<modules><module>maven_son</module>
</modules>
父工程在执行操作时,会带着将modules下的子工程一并执行
Maven私服(Nexus)
一般是公司内部使用,所以一般设置在局域网中,不绝对,但公司一般为了安全性都会设置在公司网内
本地——>私服——>中央
maven-central
:设置中央仓库连接
maven-public
:存储中央仓库下载的包
maven-releases
:私服包正式版
maven-snapshots
:私服包快照版
将jar包部署到Nexus
<distributionManagement><snapshotRepository><!--setting.xml中的nexus server的id--><id>nexus-mine</id><!--随便取--><name>Nexus Snapshot</name><!--私服地址 注意是正式版还是快照版--><url>http://localhost:8081/repository/maven-snapshots/</url></snapshotRepository>
</distributionManagement>
下载私服的jar包
<repositories><repository><id>nexus-mine</id><name>nexus-mine</name><url>http://localhost:8081/repository/maven-snapshots/</url><snapshots><enabled>true</enabled></snapshots><releases><enabled>true</enabled></releases></repository>
</repositories>