SpringBoot实践(三十三):Maven使用及POM详解

news2024/11/28 4:44:46

文章目录

    • maven是什么
    • maven怎么装
    • settings.xml
      • 本地仓库地址:localRepository
      • 远程镜像:mirrors
      • JDK 版本:profile
      • 私服配置
    • POM.xml中的常用标签
      • project
      • modelVersion
      • groupId
      • artifactId
      • version
      • properties
      • dependencies
      • build和plugins
      • resources
      • dependencyManagement
      • repositories
      • distributionManagement
      • modules
    • 依赖管理

maven是什么

Maven是一个Java工程的管理工具,跟其相同功能的工具如Gradle,Maven通过项目对象模型(POM:Project Object Model)用来描述整个项目,也就是POM.xml文件,使用Maven能够方便的管理JAR包依赖,Maven将当前工程需要的JAR 包从远程仓库下载到本地并自动完成依赖的传递,每个JAR有唯一标识也就是坐标,这是依赖可维护性的基础,Maven中的坐标是通过groupId、artifactId、version、packaging、classfier等这些元素定义。

maven怎么装

maven下载,windos系统下载后无需安装,放在一个路径中不带空格的文件夹,如program Files这个目录不能放,然后在系统环境变量中配置一下maven/bin的路径:
在这里插入图片描述
path中添加%MAVEN_HOME%\bin
在这里插入图片描述
验证maven安装成功,ctrl+R,进入cmd:
在这里插入图片描述

settings.xml

Maven安装目录下conf/settings.xml是maven配置文件,主要完成maven默认的本地仓库地址,远程仓库地址,jdk版本,profile,私服地址等的定义,大部分情况下需要修改部分标签,顶级标签如下,具体的使用方式和描述如下:Maven配置文件标签详解

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                          https://maven.apache.org/xsd/settings-1.0.0.xsd">
  <localRepository/>
  <interactiveMode/>
  <usePluginRegistry/>
  <offline/>
  <pluginGroups/>
  <servers/>
  <mirrors/>
  <proxies/>
  <profiles/>
  <activeProfiles/>
</settings>

大部分情况下需要修改的标签介绍如下;

本地仓库地址:localRepository

windos下载安装后默认的本地仓库地址是windos用户下的/.m2/repository文件中,需要在conf/settings.xml中配置本地的仓库地址:

<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>D:\softtools\my-maven</localRepository>

远程镜像:mirrors

同时,默认的远程仓库国内肯定是可慢或者不可达,需要修改成settings.xml中的配置:

	<mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
	</mirror>

JDK 版本:profile

这个根据maven中当前的配置情况和本地项目依赖情况配置jdk版本:

<profile>
    <id>jdk-1.8</id>
    <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
    </activation>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
       <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    </properties>
</profile>

私服配置

规范情况下会使用内网搭建的nexus私服来代替远程镜像,本地项目直接从私服地址拉取依赖包,这样做的好处有:

  • 防止内部代码外协;
  • 规范化所有项目的基础依赖,统一版本号,比如springboot相关依赖;
  • 可以将内部工程进行模块化后内部进行共享和依赖,比如常用的工具类封装成common工程等;
    在这里插入图片描述
    如果已经搭建并配置好nexus,在settings.xml中修改配置如下;
.修改maven配置文件
[root@jenkins ~]# vim /etc/maven/settings.xml
#找到 <servers> 标签,添加 Nexus 默认认证信息:
  <server>
    <id>my-nexus-releases</id>
    <username>admin</username>      #nexus的账号
    <password>admin123</password>   #nexus的密码
  </server>
  <server>
    <id>my-nexus-snapshot</id>
    <username>admin</username>      #nexus的账号
    <password>admin123</password>   #nexus的密码
  </server>
  </servers>

#找到 <mirrors> 标签,添加镜像:1
  <mirror>
  <!--This sends everything else to /public -->
  <id>nexus</id>
  <mirrorOf>*</mirrorOf>  
  <url>http://192.168.81.210:8081/repository/maven-public/</url>    #nexus中maven-public的地址
  </mirror>

#找到 <profiles> 标签,添加仓库信息:
  <profile>
    <id>nexus</id>
    <!--Enable snapshots for the built in central repo to direct -->
    <!--all requests to nexus via the mirror -->
    <repositories>
      <repository>
        <id>central</id>
        <url>http://192.168.81.210:8081/repository/maven-public/</url>    #nexus中maven-public的地址
        <releases><enabled>true</enabled></releases>
        <snapshots><enabled>true</enabled></snapshots>
      </repository>
    </repositories>
   <pluginRepositories>
      <pluginRepository>
        <id>central</id>
        <url>http://192.168.81.210:8081/repository/maven-public/</url>    #nexus中maven-public的地址
        <releases><enabled>true</enabled></releases>
        <snapshots><enabled>true</enabled></snapshots>
      </pluginRepository>
    </pluginRepositories>
  </profile>

#激活仓库:
<activeProfiles>
  <!--make the profile active all the time -->
  <activeProfile>nexus</activeProfile>
</activeProfiles>

POM.xml中的常用标签

当我们在idea中创建了一个maven工程后,最外层目录会有POM.xml,用来进行项目依赖管理,其中有很多标签/属性来定义当前正在开发的Java项目,全量的POM标签可参考:Maven 菜鸟教程,这里只介绍部分最常用和需要知道的标签。

<project xmlns = "http://maven.apache.org/POM/4.0.0"
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!-- 模型版本 -->
    <modelVersion>4.0.0</modelVersion>
    <!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
    <groupId>com.companyname.project-group</groupId>
    <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
    <artifactId>project</artifactId>
    <!-- 版本号 -->
    <version>1.0</version>
    <!-- 其他标签 -->
</project>

project

工程的根标签,也是POM中最顶级的标签,所有标签都在这个project标签内;

modelVersion

模型版本需要设置为 4.0。

groupId

这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.alibaba.project-group 拥有所有的和银行相关的项目。

artifactId

这是工程的标识,它通常是工程的名称。

version

这是工程的版本号。在同个 artifact 仓库中可以用来区分不同的版本。例如:com.alibaba.bank:consumer-banking:1.1

properties

properties标签内可以把版本号作为变量进行声明,方便maven依赖标签用${变量名}的形式动态获取版本号。这样做的优点是当版本号发生改变时,仅仅需要更新properties标签中的变量值就行,比如定义一个lombok的版本号:

    <properties>
        <java.version>13</java.version>
        <lombok.version>1.18.10</lombok.version>
    </properties>

那么在依赖定义的时候可以直接使用lombok.version进行引用。

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <version>${lombok.version}</version>
        </dependency>

dependencies

这里是依赖定义的顶级标签,其下是dependency标签,每个依赖通过groupId,artifactId,version三个标签找到唯一的jar包,但也有一些作用范围或者排除项,如下:

    <dependencies>
        <dependency>
        	<!--组织ID-->
            <groupId></groupId>
            <!--项目ID-->
            <artifactId></artifactId>
            <!--版本号-->
            <version></version>
            <!--依赖类型-->
            <type></type>
            <!--类别(类目)-->
            <classifier></classifier>
            <!--指定依赖的范围-->
            <scope></scope>
            <!--指定本地jar路径,和scope一起使用-->
            <systemPath></systemPath>
            <!--排除依赖列表-->
            <exclusions>
                <exclusion>
                    <artifactId></artifactId>
                    <groupId></groupId>
                </exclusion>
            </exclusions>
            <!--指定是否需要被依赖-->
            <optional></optional>
        </dependency>
    </dependencies>

classifier标签groupId,artifactId,version标签后面使用,可以简单地看做字符串的拼接,用于区分不同的工作环境,如果groupId,artifactId,version相同但jdk版本不同,需要定义固定的jdk版本等,具体看该依赖是否要加;
type标签有:pom,jar ,test-jar,maven-plugin,ejb,ejb-client,war,ear,rar,java-source,javadoc,如果不指定,默认为jar.一般开发中常用的是jar,war,pom等;
scope标签主要用于指定依赖的作用范围,其中有如下取值:

  1. compile:maven的默认范围,作用在所有范围 可以依赖传递;
  2. provided :只在编译和测试时生效,正式发布jar包或者war包时该依赖不会被包含进去,不会传递
  3. runtime:只在运行时和测试时生效,典型的是数据库驱动依赖,可以依赖传递
  4. test :只在测试时生效,不会依赖传递;
  5. system:表明该依赖不会从中央仓库查找,而是从用户指定的systemPath位置获取,与systemPath共同使用

systemPath:仅当scope为system时才可以使用。否则,如果设置了这个元素,构建时将会失败。systemPath的路径必须是绝对路径,这里可以利用properties的属性来指定。例如${java.home}/lib。
exclusions:排除依赖中不需要的项
optional:默认值:false。optional=true 表示此依赖包不会在其他项目中被引用加载、不参与maven的依赖传递。

build和plugins

build标签描述如何来编译及打包项目,而具体的编译和打包工作是通过build中配置的 plugin 来完成。当然plugin配置不是必须的,默认情况下Maven 的生命周期足够完成基本操作,可以通过idea右侧的maven的Lifecycle查看,集成外部的plugins目的是绑定生命周期做额外的操作;

<groupId> : 项目或者组织的唯一标识
<artifactId> 项目的通用名称
<artifactId> 项目的通用名称
<version> 项目的版本
 <extensions> 是否加载该插件的扩展,默认为false
<inherited> 该插件的<configuration>中的配置是否可以被继承,默认为true
<configuration> 该插件所需要的特色配置,在父子项目项目之间可以覆盖或被合并
<dependencies> 该插件所特有的依赖类库
<executions> 该插件的某个goal(一个插件可能有多个goal)的执行方式.一个<executions>有如下设置
<id>  唯一标识
<goals> 要执行的插件的goal.这个是可以有多个的
<phase> 插件的goal要嵌入到Maven的phase中执行
<inherited> 该execution是否可被子项目继承
<configuration> 该execution的其他配置参数

可以使用maven-compiler-plugin插件配置JDK版本:

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.10.1</version>
        <!-- 不同的插件的参数配置不一样 -->
        <configuration>
          <source>11</source>
          <target>11</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>

在使用idea在打开通过spring.io创建的springboot工程后,工程的glugin中会默认有spring-boot-maven-plugin标签:

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.example.sprintbootparent.SprintbootParentApplication</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>

在idea右侧的plugins中可以发现spring-boot-maven-plugin提供了6个maven goal:
在这里插入图片描述

  • build-info:生成项目的构建信息文件 build-info.properties
  • help:用于展示spring-boot-maven-plugin的帮助信息。
  • repackage:可生成可执行的jar包或war包。插件的核心goal。
  • run:运行 Spring Boot 应用
  • tart:在集成测试阶段,控制生命周期
  • stop:在集成测试阶段,控制生命周期,
    打包主要使用的是repackage ,它是spring-boot-starter-parent为插件设置的默认goal。这个goal绑定在maven的 package生命周期上,完整命令为mvn package spring-boot:repackage。在 mvn package 执行打包之后,repackage 再次打包生成可执行的 jar包或war包。
    还有一个妙用就是,将spring-boot-maven-plugin引入普通非springboot工程的pom,执行 mvn package 命令,即可打jar包(插件默认打jar包),target文件夹里的 *.jar即为可执行,jar包默认胖包;普通工程使用spring-boot-maven-plugin标签
    在这里插入图片描述

resources

用户控制工程中的资源目录,如springboot默认使用aplication.properties,如果想用别的可以使用该标签。

dependencyManagement

标签的作用是进行依赖(jar包)的版本控制,防止依赖版本出现多个而发生冲突,用来管理子项目的公共的依赖,保证所有的子项目使用依赖项的统一版本,如springboot工程的默认添加如下:

   <dependencyManagement>
        <dependencies>
            <!-- 整合spring boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

如果该工程有子工程,在子工程的pom中添加:

    <parent>
        <artifactId>springboot-parent</artifactId>
        <groupId>com.example</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

那么子工程使用springboot相关包不需要指定版本号:

		<!-- 此处未使用<version>指定版本号,同时在<properties>中也未声明 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

这是因为spring-boot-dependencies,定义了几百个依赖版本号,子项目继承了父项目的依赖定义;

repositories

repositories标签的作用是用来配置maven项目的远程仓库,settings.xml定义后不需要特殊定义,私服需要修改;

distributionManagement

distributionManagement的作用是"分发构件至远程仓库",mvn deploy 用来将项目生成的构件分发到远程Maven仓库。本地Maven仓库的构件只能供当前用户使用,在分发到远程Maven仓库之后,所有能访问该仓库的用户都能使用你的构件,私服时使用;

modules

父项目定义子项目用到;

    <modules>
        <module>springboot-demo</module>
        <module>springboot-security</module>
        <module>juc</module>
        <module>springboot-nacos</module>
        <module>springcloud-gateway</module>
        <module>springcloud-login</module>
        <module>springboot-common</module>
    </modules>

依赖管理

在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学生管理系统】用户登录三种验证方式—图片验证、短信验证、邮件验证

目录 一、页面需求展示 二、验证方式—按钮组件 三、手机短信验证 四、邮件验证 五、图片验证邮件验证 &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、页面需求展示 二、验证方式—按钮组件 2.1前端 <el-form-item labe…

【Linux】第十章 进程间通信(管道+system V共享内存)

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

工作流的例子

工作流的例子目录概述需求&#xff1a;设计思路实现思路分析1.配置bean2.examples3.no bean4.activiti-api-basic-process-example5.taskspringweb参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c…

C++ 多态类型

多态 C在面向对象中&#xff0c;多态就是不同对象收到相同消息&#xff0c;执行不同的操作。在程序设计中&#xff0c;多态性是名字相同的函数&#xff0c;这些函数执行不同或相似的操作&#xff0c;这样就可以用同一个函数名调用不同内容的函数。简而言之“一个接口&#xff…

2022 国赛postgresql

安装postgresql配置postgresql [root@linux3 ~]# postgresql-setup --initdb //初始化数据库Initializing database in ‘/var/lib/pgsql/data’Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log[root@linux3 ~]# systemctl enable postgresql.service Created …

澳洲最热门职业,护士排第一,医生竟然不如程序员?

2022澳洲最新的职业紧缺名单出炉了&#xff0c;令人惊讶的是护士竟然排行第一名&#xff0c;可见澳洲的医疗人力资源紧缺的问题。 既然人力资源紧缺&#xff0c;那么首当其冲的医生作为高学历且同属医疗行业的代表理应收到重视&#xff0c;然而令人意外的是&#xff0c;通过榜单…

Linux一篇入门(以Ubuntu为例)

一、Linux与Windows区别 Linux&#xff1a;无盘符&#xff0c;只有一个根目录&#xff08;/&#xff09; Windows&#xff1a;有盘符 二、目录相关常见命令 Linux命令格式&#xff1a; cmd -option parameter cdm命令&#xff0c;就是一个操作 parameter一般是要做的对象…

韩国程序员面试考什么?

大家好&#xff0c;我是老三&#xff0c;在G站闲逛的时候&#xff0c;从每日热门上&#xff0c;看到一个韩国的技术面试项目&#xff0c;感觉有点好奇&#xff0c;忍不住点进去看看。 韩国的面试都考什么&#xff1f;有没有国内的卷呢&#xff1f; 可以看到&#xff0c;有8.…

抽象类和接口

文章目录 前言 一、今日回顾 1.《高等数学》 2.阅读&#xff1a; 3.英语&#xff1a; 二、编程的那些事 1.引入库 2.读入数据 总结 前言 一、今日回顾 1.《高等数学》 2.阅读&#xff1a; 3.英语&#xff1a; 二、编程的那些事 1.抽象类的描述 在java中&#xff0…

一次函数与二次函数的联系

首先&#xff0c;无论是一次函数还是二次函数&#xff0c;都是函数&#xff0c;所以便可以从表达式&#xff0c;图像&#xff0c;函数的四个性质&#xff08;即有界性&#xff0c;单调性&#xff0c;奇偶性&#xff0c;周期性&#xff09;去看他们之间的联系 一次函数与二次函…

2022第8届中国大学生程序设计竞赛CCPC桂林站, 签到题4题

文章目录A. LilyM.Youth FinaleC.Array ConcatenationE.Draw a triangleA. Lily A. Lily time limit per test1 second memory limit per test512 megabytes inputstandard input outputstandard output They serve the purpose of changing hydrogen into breathable oxygen,…

MySQL数据库 -- 库和表的操作

关于数据库方面&#xff0c;还是需要多多练习的&#xff0c;否则很多指令不容易记住&#xff0c;所以大家也要在自己的电脑上多写写&#xff0c;熟悉熟悉~ 目录 库的操作 创建数据库 操纵数据库 查看数据库 显示创建语句 修改数据库 数据库的删除 数据库备份和恢复 …

重学数据库基础

幸福找到我&#xff0c;幸福说&#xff1a;“瞧这个诗人&#xff0c;他比我本人还要幸福” 一、数据库相关概念 数据库 存储数据的仓库&#xff0c;数据是有组织的进行存储英文&#xff1a;DataBase&#xff0c;简称 DB 数据库管理系统 管理数据库的大型软件英文&#xff1a;Da…

CSI室内指纹定位——相关通信名词解释

目录 1、无线信道 2、时域与频域 3、信道频率响应&#xff08;Channel Frequency Response,CFR&#xff09; 4、信道冲激响应&#xff08;Channel Impulse Response, CIR&#xff09; 5、信道带宽 6、带宽 7、子载波 9、波长 10、频率 11、振幅 12、相位 13、相位差…

高数值孔径(NA)物镜的聚焦分析

1. 摘要 高NA物镜广泛用于光刻&#xff0c;显微等技术。因此&#xff0c;聚焦仿真中考虑光的矢量性质至关重要。VirtualLab可以非常便捷地对此类镜头进行光线追迹和场追迹分析。通过场追迹&#xff0c;可以清楚地观察由于矢量效应引起的聚焦光斑失对称现象。利用相机探测器和电…

第十四届蓝桥杯(Web应用开发)模拟赛1期-大学组

数据类型检测 请看这篇数据类型检测 渐变色背景生成器 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name&…

java面试官:程序员,请你告诉我是谁把公司面试题泄露给你的?

前情提要&#xff1a; 面试官&#xff1a;你好&#xff01;请先做一下自我介绍&#xff01; 程序员&#xff1a;balabalabala... 前戏先过了.... 面试官&#xff1a;先介绍SpringCloud核心组件及其作用 程序员&#xff1a;SpringCloud由以下5个核心组件构成...另外&#x…

MySQL事务基本操作(方式1)

在观看本文前 你需要了解什么事事务 如果不太了解 可以先查看我的文章 MySQL事务基本概念 首先 我们这里有一张 staff 用户表 然后来一波 减岁交易大法 赵敏买个了 黄飞鸿十年时光 那么就是 先查询确认赵敏加上十岁不会过百 将赵敏年龄加十岁 确认黄飞鸿减去十岁不会小于零 然…

Java项目(三)-- SSM开发社交网站(9)--后台图书管理功能

后台图书管理功能 富文本编辑器wangEditor 基于javascript与css开发是Web富文本编辑器&#xff0c;轻量、简洁、易用、开源免费。 代码演示 我们在test.ftl中添加富文本编辑器演示下 <!DOCTYPE html> <html lang"en"> <head><meta charset&…

CMake中string的使用

CMake中的string命令用于字符串操作,其格式如下&#xff1a; Search and Replacestring(FIND <string> <substring> <out-var> [...])string(REPLACE <match-string> <replace-string> <out-var> <input>...)string(REGEX MATCH &l…