maven 3.8.X使用
安装简单使用
1.官网下载maven包,安装配置环境:
mvn --version
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: C:\Program Files\apache-maven-3.8.6
Java version: 17.0.10, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk-17
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 11", version: "10.0", arch: "amd64", family: "windows"
2.修改settings.xml文件
- 指定本地仓库目录
<localRepository>/data/maven/repo</localRepository>
- 配置镜像,指定下载jar包地址(如:阿里镜像源)
3.idea编辑器(eclipse\Intellij idea)设置
- 指定本地maven目录
- 指定maven的settings文件路径,同时idea访问的repository仓库也对应变化
4.maven项目创建
5.maven项目结构
- src/main/java 代码目录
- src/main/resources 资源文件目录
- src/test/java 单位测试代码目录
- src/test/resources 测试资源文件目录
- Maven Dependencies 通过maven拉取的项目依赖包存放目录
- target 存放构建后文件的目录
6.maven官方仓库查看依赖包
www.mvnrepository.com
7.maven构建
mvn clean package
mvn package
附加参数:
-DskipTests # 不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下
-Dmaven.test.skip=true # 不执行测试用例,也不编译测试用例类
Maven编译打包相关
- 指定maven-complier-plugin编译打包时的JDK版本
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
- Maven常用命令及其作用:
- maven clean: 对项目进行清理,删除target目录下编译的内容
- maven compile:编译项目源代码
- maven test:对项目进行运行测试
- maven package: 打包文件并存放到项目的target目录下,打包好的文件通常都是编译后的class文件
- maven install:在本地仓库生成仓库的安装包,可供其他项目引用
- 常用命令使用场景举例:
- mvn clean package依次执行了clean、resources、complie、testResources、testComplie、test、jar(打包)等7个阶段,package命令完成了项目编译、单元测试、打包功能,但没有把打包好的可执行jar包(war包或其他形式的包)部署到本地maven仓库和远程maven私服仓库
- mvn clean install依次执行了clean、resources、complie、testResources、testCompile、test、jar(打包)、install等8个阶段,install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其他形式的包)部署到本地maven仓库,但没有部署到远程maven私服仓库
- mvn clean deploy依次执行了clean、resources、complie、testResources、testComplie、test、jar(打包)、install、deploy等9个阶段,deploy命令完成了项目编译、单元测试、打包功能,同时能把打好的可执行jar包(war包或其他形式的包)部署到本地maven仓库和远程maven私服仓库
- 打包相关的常见问题
- mvn clean install 和 mvn install的区别
- 根据maven在执行一个生命周期命令时,理论上讲,不做mvn install得到的jar包应该是最新的,除非使用其他方式修改jar包的内容,但没有修改源代码;
- 平时可以使用mvn install,不使用clean会节省时间,但是最保险的方式还是mvn clean install,这样可以生成最新的jar包或其他包
- maven两种跳过单元测试方法的区别
- mvn package -Dmaven.test.skip=true
不但跳过了单元测试的运行,同时也跳过了测试代码的编译 - mvn package -DskipTests
跳过单元测试,但是会继续编译。如果没时间修改单元测试的bug,或者单元测试编译错误,则使用第一种,不要使用第二钟
类似的,还有以下命令:
mvn clean install -U -Dmaven.test.skip=true
mvn clean install -U -DskipTests
- Maven项目查找jar包是由哪个配置引入的:
mvn dependency:tree -Dverbose -Dincludes=要查询的内容
mvn dependency:tree -Dverbose -Dincludes=io.springfox:jakarta.springfox-swagger2
dependency:tree: 表示树状显示。
-Dverbose:表示可以显示所有的引用,包括因为多次引用重复而忽略的。
-Dincludes:可以制定查询条件。
settings文件解析
用于配置Maven构建工具的各种设置
<?xml version="1.0" encoding="UTF-8"?>
<!--
Apache Software Foundation (ASF) 下的许可,根据一个或多个贡献者许可协议。
查看 NOTICE 文件以获取有关版权所有权的其他信息。ASF 根据 Apache License,Version 2.0(“许可”)
向您授予此文件的使用权;除非遵守许可,否则您不得使用此文件。您可以在
<http://www.apache.org/licenses/LICENSE-2.0> 获取许可的副本。
除非适用法律要求或书面同意,否则软件按“原样”分发,不附带任何明示或暗示的保证或条件。
有关特定语言的管理权限,请参阅许可。
-->
<!--
| 这是 Maven 的配置文件。它可以在两个级别指定:
|
| 1. 用户级别。此 settings.xml 文件为单个用户提供配置,
| 通常位于 ${user.home}/.m2/settings.xml。
|
| 注意:可以使用 CLI 选项覆盖此位置:
|
| -s /path/to/user/settings.xml
|
| 2. 全局级别。此 settings.xml 文件为机器上的所有 Maven 用户提供配置
| (假设他们都在使用相同的 Maven 安装)。通常位于
| ${maven.conf}/settings.xml。
|
| 注意:可以使用 CLI 选项覆盖此位置:
|
| -gs /path/to/global/settings.xml
|
| 此示例文件中的部分旨在为您的 Maven 安装提供一个运行的起点。
| 在适当的情况下,提供了默认值(未指定设置时使用的值)。
|
|-->
<settings xmlns="<http://maven.apache.org/SETTINGS/1.2.0>"
xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>"
xsi:schemaLocation="<http://maven.apache.org/SETTINGS/1.2.0> <https://maven.apache.org/xsd/settings-1.2.0.xsd>">
<!-- localRepository
| Maven 用于存储构件的本地仓库路径。
|
| 默认:${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<!-- interactiveMode
| 这将决定 Maven 在需要输入时是否提示您。如果设置为 false,
| Maven 将使用合理的默认值,可能基于其他设置来提供参数值。
|
| 默认:true
<interactiveMode>true</interactiveMode>
-->
<!-- offline
| 确定 Maven 在执行构建时是否尝试连接到网络。
| 这会影响到构建中的工件下载、工件部署等。
|
| 默认:false
<offline>false</offline>
-->
<!-- pluginGroups
| 这是要在解析插件时搜索插件的附加组标识符列表,例如
| 当调用命令行时像 "mvn prefix:goal" 这样。如果这些组标识符
| 尚未包含在列表中,Maven 将自动添加
| "org.apache.maven.plugins" 和 "org.codehaus.mojo"。
|-->
<pluginGroups>
<!-- pluginGroup
| 指定要用于插件查找的其他组标识符。
<pluginGroup>com.your.plugins</pluginGroup>
-->
</pluginGroups>
<!-- proxies
| 这是要在此机器上用于连接到网络的代理列表。
| 除非以其他方式指定(通过系统属性或命令行开关),
| 否则此列表中标记为活动的第一个代理规范将被使用。
|-->
<proxies>
<!-- proxy
| 用于连接到网络的一个代理的规范。
|
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
-->
</proxies>
<!-- servers
| 这是用服务器 ID 作为键的认证配置列表。
| 每当 Maven 必须连接到远程服务器时,都可以使用认证配置。
|-->
<servers>
<!-- server
| 指定连接到特定服务器时使用的认证信息,由此系统内部使用的唯一名称标识。
|
| 注意:您应该同时指定用户名/密码或 privateKey/passphrase,因为这些配对是一起使用的。
|
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>
-->
<!-- 另一个示例,使用密钥进行身份验证。
<server>
<id>siteServer</id>
<privateKey>/path/to/private/key</privateKey>
<passphrase>可选;如果未使用,留空。</passphrase>
</server>
-->
</servers>
<!-- mirrors
| 这是一个用于从远程仓库下载工件的镜像列表。
|
| 工作原理如下:POM 可以声明要在解析某些工件时使用的仓库。
| 但是,此仓库可能在某些时候会遇到网络流量过大的问题,
| 因此人们已将其镜像到多个地方。
|
| 该仓库定义将有一个唯一的 ID,因此我们可以为该仓库创建一个镜像引用,
| 用作备用下载站点。镜像站点将是该仓库的首选服务器。
|-->
<mirrors>
<!-- mirror
| 指定要用作特定仓库替代的存储库镜像站点。该镜像服务器所服务的
| 仓库具有与此镜像的 mirrorOf 元素匹配的 ID。ID 用于继承和直接查找,
| 并且在一组镜像中必须是唯一的。
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>用于此镜像的人类可读名称。</name>
<url><http://my.repository.com/repo/path></url>
</mirror>
-->
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>虚拟仓库,最初使用 HTTP 镜像外部仓库。</name>
<url><http://0.0.0.0/></url>
<blocked>true</blocked>
</mirror>
</mirrors>
<!-- profiles
| 这是一个可通过多种方式激活的配置集合,
| 可以修改构建过程。在 settings.xml 中提供的配置文件
| 旨在为本地环境提供允许构建在本地环境中工作的
| 机器特定路径和仓库位置。
|
| 例如,如果您有一个集成测试插件 - 如 cactus - 需要知道
| Tomcat 实例的安装位置,您可以在此处提供一个变量,
| 以便在构建过程中对 cactus 插件进行配置。
|
| 如上所述,可以通过多种方式激活配置文件。
| 其中一种方式 - 此文档(settings.xml)中的 activeProfiles 部分 - 将在稍后讨论。
| 另一种方式实际上依赖于系统属性的检测,其中属性的值匹配特定值,
| 或仅测试其是否存在。配置文件还可以通过 JDK 版本前缀激活,
| 其中“1.4”值可能在 JDK 版本为“1.4.2_07”时激活配置文件。
| 最后,可以直接从命令行指定活动配置文件的列表。
|
| 注意:对于在 settings.xml 中定义的配置文件,您只能指定
| 构件仓库、插件仓库和用于 POM 中插件的自由形式属性。
|
|-->
<profiles>
<!-- profile
| 指定要在构建过程中引入的一组配置,使用上述描述的一种或多种机制进行激活。
| 为了继承目的,并且为了通过 <activatedProfiles/> 或命令行激活配置文件,
| 配置文件必须具有唯一的 ID。
|
| 对于配置文件标识的鼓励最佳做法是使用一致的命名约定
| 为配置文件,例如 'env-dev'、'env-test'、'env-production'、
| 'user-jdcasey'、'user-brett' 等。这将使得更直观理解
| 引入的配置文件集合试图完成什么任务,特别是在调试时只有
| 配置文件 ID 列表的情况下。
|
| 此配置文件示例使用 JDK 版本来触发激活,并提供特定于 JDK 的仓库。
<profile>
<id>jdk-1.4</id>
<activation>
<jdk>1.4</jdk>
</activation>
<repositories>
<repository>
<id>jdk14</id>
<name>JDK 1.4 构建的仓库</name>
<url><http://www.myhost.com/maven/jdk14></url>
<layout>default</layout>
<snapshotPolicy>always</snapshotPolicy>
</repository>
</repositories>
</profile>
-->
<!--
| 这里是另一个配置文件,由系统属性 'target-env' 激活,
| 其值为 'dev',为 Tomcat 实例提供特定路径。
| 要使用此功能,您的插件配置可能看起来像这样:
|
| ...
| <plugin>
| <groupId>org.myco.myplugins</groupId>
| <artifactId>myplugin</artifactId>
|
| <configuration>
| <tomcatLocation>${tomcatPath}</tomcatLocation>
| </configuration>
| </plugin>
| ...
|
| 注意:如果只想在某人将 'target-env' 设置为任何内容时注入此配置,
| 可以省略激活属性中的 <value/>。
|
<profile>
<id>env-dev</id>
<activation>
<property>
<name>target-env</name>
<value>dev</value>
</property>
</activation>
<properties>
<tomcatPath>/path/to/tomcat/instance</tomcatPath>
</properties>
</profile>
-->
</profiles>
<!-- activeProfiles
| 所有构建的活动配置文件列表。
|
<activeProfiles>
<activeProfile>alwaysActiveProfile</activeProfile>
<activeProfile>anotherAlwaysActiveProfile</activeProfile>
</activeProfiles>
-->
</settings>
这个示例 **
settings.xml
** 文件包含了许多 Maven 的配置选项,包括本地仓库路径、代理设置、服务器认证、镜像设置和配置文件激活等。您可以根据项目和环境的需要进行相应的配置调整。
IntelliJ IDEA的默认maven配置
安装路径: C:\Program Files\JetBrains\IntelliJ IDEA 2022.2\plugins\maven\lib\maven3\conf
遇到的问题
1. maven如何在打包时指定main入口?
查看下面插件配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.chq.ddns.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
2. mvn clean package -DskipTests报错信息:
报错信息如下:
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:3.2.0:repackage (default) on project project-center-provider: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:3.2.0:repacka
ge failed: Unable to load the mojo 'repackage' in the plugin 'org.springframework.boot:spring-boot-maven-plugin:3.2.0' due to an API incompatibility: org.codehaus.plexus.component.repository.exception.ComponentLookupException: org/springframework/boot/maven/RepackageMojo has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0
问题描述:
org/springframework/boot/maven/RepackageMojo是由较新版本的Java Runtime(类文件版本61.0)编译的,该版本的Java运行时只能识别52.0以下的类文件版本
原因分析:
通过对应表可知,这个文件是由java 17版本编译的,而现在系统中只能识别java 8以下的版本,java版本不一致导致打包失败,需要在出错的模块的打包插件中设置一个版本就好了
java对照表:
49 = Java 5
50 = Java 6
51 = Java 7
52 = Java 8
53 = Java 9
54 = Java 10
55 = Java 11
56 = Java 12
57 = Java 13
58 = Java 14
指定spring-boot-maven-plugin插件版本,不然红圈地方就会显示为unknown,这就导致引用最新的版本,造成不一致的问题,导致以上报错
总结:
之前有些模块的打包插件的版本也没有添加是可以正常使用的,但是今天突然不行了,后来发现spring boot 3.0版最近正式发布了,3.0版是基于java 17 的,不指定的话,默认引用最新的导致这种问题的发生,所以大家做的时候,所有模块的打包插件的版本一定要指定一下,避免出现这种问题,当然这个版本号最好在总的pom文件中定义一下,子模块中直接引用就可以了,不用在每个子模块中一一定义了