Maven

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>

下载依赖失败怎么办

原因

  1. 网络问题
  2. 本地Maven仓库或缓存被污染或损坏,导致mavne无法正确使用现有的依赖项
  3. 版本不存在

解决方法

  1. 进入本地仓库删除对应文件夹,重新进行下载尝试
  2. 去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构建配置

项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。

默认情况下,构建不需要额外配置,都有对应的缺省配置。可以定制一些配置,以达到修改默认构建的行为和产物

比如

  1. 指定构建打包文件的名称
xml 复制代码
<build>
	<finalName>xxx-版本号.jar/war</finalName>
</build>
  1. 打包时指定包含文件格式和排除文件
    场景
    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文件作为资源文件打包

  1. 打包插件版本过低,配置更高版本插件

插件本质是本地仓库的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>
相关推荐
祁思妙想24 分钟前
6.《双指针篇》---⑥和为S的两个数字(中等但简单)(牛客)
java·数据结构·算法
hummhumm27 分钟前
Oracle 第19章:高级查询技术
java·数据库·python·sql·mysql·oracle·database
LKID体1 小时前
docker加载目录中所有的镜像
java·docker·容器
小周不摆烂1 小时前
Java基础-组件及事件处理(上)
java·开发语言
hummhumm1 小时前
Oracle 第26章:Oracle Data Guard
java·大数据·前端·数据库·后端·python·oracle
哎呦没1 小时前
导师双选系统开发新解:Spring Boot技术
java·spring boot·后端
web3探路者1 小时前
加密货币行业与2024年美国大选
java·大数据·web3·区块链·团队开发·开源软件
为啥不能修改昵称啊1 小时前
静态数据区,堆,栈
java·jvm·算法
爱吃土豆的程序员1 小时前
HTTP慢速攻击原理及解决办法
java·http慢速攻击
AskHarries1 小时前
Spring Boot关闭时,如何确保内存里面的mq消息被消费完?
java·spring boot·后端