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中添加如下代码:
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构建配置
项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
默认情况下,构建不需要额外配置,都有对应的缺省配置。可以定制一些配置,以达到修改默认构建的行为和产物
比如
- 指定构建打包文件的名称
xml
<build>
<finalName>xxx-版本号.jar/war</finalName>
</build>
- 打包时指定包含文件格式和排除文件
场景
java下只允许存在java类
resources下只允许存在资源类
但是mybatis的mapper一般放在java下
解决方法
xml
<build>
<resources>
<resource>
<!---设置资源所在目录-->
<directory>src/main/java</directory>
<includes>
<!--设置包含的资源类型-->
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
作用
将java下任意的xml文件作为资源文件打包
- 打包插件版本过低,配置更高版本插件
插件本质是本地仓库的jar包
xml
<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包
xml
<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)
xml
<groupId>com.atguigu.maven</groupId>
<artifactId>maven_parent</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
子工程
xml
<parent>
<artifactId>maven_parent</artifactId>
<!--groupId和父工程保持一致-->
<groupId>com.atguigu.maven</groupId>
<!--version和父工程保持一致-->
<version>1.0</version>
</parent>
<!--artifactId(模块名)自己的名字-->
<artifactId>maven_son</artifactId>
如果在父工程中直接使用dependencies
,在父工程中的依赖会传递给子工程
而使用dependencyManagement
,子工程需要手动选择需要继承的依赖,但会和普通依赖不太一样(不需要版本号)
xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
聚合
将多个项目组织到一个父级项目中,以便一起构建和管理的机制,可以更好的管理一组相关的子项目,同时简化构建和部署的过程。
简单来说,就是父工程执行什么操作,子工程就跟着进行什么操作
在父工程中,包含子工程的路径
(就是文件的相对路径)
聚合无需手动操作,IDEA会自动创建
xml
<modules>
<module>maven_son</module>
</modules>
父工程在执行操作时,会带着将modules下的子工程一并执行
Maven私服(Nexus)
一般是公司内部使用,所以一般设置在局域网中,不绝对,但公司一般为了安全性都会设置在公司网内
本地------>私服------>中央
maven-central
:设置中央仓库连接
maven-public
:存储中央仓库下载的包
maven-releases
:私服包正式版
maven-snapshots
:私服包快照版
将jar包部署到Nexus
xml
<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包
xml
<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>