Loading

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编译打包相关

  1. 指定maven-complier-plugin编译打包时的JDK版本
<properties>
      <maven.compiler.source>17</maven.compiler.source>
      <maven.compiler.target>17</maven.compiler.target>
</properties>
  1. Maven常用命令及其作用:
  • maven clean: 对项目进行清理,删除target目录下编译的内容
  • maven compile:编译项目源代码
  • maven test:对项目进行运行测试
  • maven package: 打包文件并存放到项目的target目录下,打包好的文件通常都是编译后的class文件
  • maven install:在本地仓库生成仓库的安装包,可供其他项目引用
  1. 常用命令使用场景举例:
  • 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私服仓库
  1. 打包相关的常见问题
  1. mvn clean install 和 mvn install的区别
  • 根据maven在执行一个生命周期命令时,理论上讲,不做mvn install得到的jar包应该是最新的,除非使用其他方式修改jar包的内容,但没有修改源代码;
  • 平时可以使用mvn install,不使用clean会节省时间,但是最保险的方式还是mvn clean install,这样可以生成最新的jar包或其他包
  1. maven两种跳过单元测试方法的区别
  • mvn package -Dmaven.test.skip=true
    不但跳过了单元测试的运行,同时也跳过了测试代码的编译
  • mvn package -DskipTests
    跳过单元测试,但是会继续编译。如果没时间修改单元测试的bug,或者单元测试编译错误,则使用第一种,不要使用第二钟
    类似的,还有以下命令:
mvn clean install -U -Dmaven.test.skip=true
mvn clean install -U -DskipTests
  1. 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

image

指定spring-boot-maven-plugin插件版本,不然红圈地方就会显示为unknown,这就导致引用最新的版本,造成不一致的问题,导致以上报错

总结:
之前有些模块的打包插件的版本也没有添加是可以正常使用的,但是今天突然不行了,后来发现spring boot 3.0版最近正式发布了,3.0版是基于java 17 的,不指定的话,默认引用最新的导致这种问题的发生,所以大家做的时候,所有模块的打包插件的版本一定要指定一下,避免出现这种问题,当然这个版本号最好在总的pom文件中定义一下,子模块中直接引用就可以了,不用在每个子模块中一一定义了

参考

https://zhuanlan.zhihu.com/p/642908572

posted @ 2020-05-03 15:34  集君  阅读(78)  评论(0编辑  收藏  举报