Maven配置及使用

news2024/11/18 13:46:00

1. Maven简介和安装

1.1. Maven是一个依赖管理工具

  • 问题:
    1. jar包的规模
      随着使用框架越来越多,或框架的封装程度越来越高,项目中使用的jar包也越来越多。项目中,一个模块里用到上百个jar包是非常正常的
    2. jar包的来源
      • jar包所属技术官网
      • 第三方下载网站
      • 使用maven后,依赖对应的jar包能够自动下载,方便、快捷、规范
    3. jar包的导入问题
      在web工程中,jar包必须存放在指定位置
      使用maven之后,通过配置依赖的坐标,查找本地仓库中相应jar包,若本地仓库没有,统一从镜像网站或中央仓库中下载
    4. jar包之间的依赖
      框架中使用的jar包,不仅数量庞大,而且彼此之间存在错综复杂的依赖关系,而且jar包之间可能产生冲突;使用maven几乎不需要管理这些关系,只需要调整极个别的地方,极大减轻了我们的工作量。

1.2. Maven介绍

Maven是一款为Java项目管理构建、依赖管理的工具,使用maven可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量

Maven的工作原理模型图
在这里插入图片描述

1.3. 安装和配置

https://maven.apache.org/docs/history.html
各个工具选用版本:

工具版本
Maven3.8.8
JDK17
Tomcat10

1.3.1. Maven功能配置

需要修改maven/conf/settings.xml配置文件,修改maven的一些默认配置。我们主要修改的配置:

  1. 依赖本地缓存位置(本地仓库位置)
<!-- conf/settings.xml -->
 <localRepository>D:\maven-repository</localRepository>
  1. maven下载镜像
<!--配置国内阿里镜像-->
<!--在mirrors节点(标签)下添加中央仓库镜像-->
<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
</mirror>
  • maven选用编译项目的jdk版本
<!--在profiles节点(标签)下添加jdk编译版本-->
<profile>
    <id>jdk-17</id>
    <activation>
      <activeByDefault>true</activeByDefault>
      <jdk>17</jdk>
    </activation>
    <properties>
      <maven.compiler.source>17</maven.compiler.source>
      <maven.compiler.target>17</maven.compiler.target>
      <maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
    </properties>
</profile>

1.4. 基于IDEA创建Maven工程

Maven工程相对之前的项目,多出一组gavp属性: GroupId、ArtifactId、Version、Packaging,其中前三个是必要的,Packaging 属性为可选项

  • Packaging定义规则:指示将项目打包为什么类型的文件,idea根据packaging值,识别maven项目类型

    • jar(默认值):普通的Java工程,打包以后是.jar结尾的文件。
    • war:代表Java的web工程,打包以后.war结尾的文件。
    • pom:不会打包,用来做继承的父工程。

1.4.1. Maven工程项目结构说明

|-- pom.xml                               # Maven 项目管理文件,用于描述项目的依赖和构建配置等信息。
|-- src
    |-- main                              # 项目主要代码
    |   |-- java                          # Java 源代码目录
    |   |   `-- com/example/myapp         # 开发者代码主目录
    |   |       |-- controller            # 存放 Controller 层代码的目录
    |   |       |-- service               # 存放 Service 层代码的目录
    |   |       |-- dao                   # 存放 DAO 层代码的目录
    |   |       `-- model                 # 存放数据模型的目录
    |   |-- resources                     # 资源目录,存放配置文件、静态资源等
    |   |   |-- log4j.properties          # 日志配置文件
    |   |   |-- spring-mybatis.xml        # Spring Mybatis 配置文件
    |   |   `-- static                    # 存放静态资源的目录
    |   |       |-- css                   # 存放 CSS 文件的目录
    |   |       |-- js                    # 存放 JavaScript 文件的目录
    |   |       `-- images                # 存放图片资源的目录
    |   `-- webapp                        # 存放 WEB 相关配置和资源
    |       |-- WEB-INF                   # 存放 WEB 应用配置文件
    |       |   |-- web.xml               # Web 应用的部署描述文件
    |       |   `-- classes               # 存放编译后的 class 文件
    |       `-- index.html                # Web 应用入口页面
    `-- test                              # 项目测试代码
        |-- java                          # 单元测试目录
        `-- resources                     # 测试资源目录

1.5. Maven构建项目

  1. 命令方式构建
命令描述
mvn compile编译项目,生成target文件
mvn package打包项目,生成jar或war文件
mvn clean清理编译或打包后的项目结构
mvn install打包后上传到maven本地仓库
mvn deploy只打包,上传到maven私服仓库
mvn site生成站点
mvn test执行测试源码

如果war包打包插件和jdk版本不匹配:pom.xml 添加以下代码即可

<build>
    <!-- jdk17 和 war包版本插件不匹配 -->
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.2.2</version>
        </plugin>
    </plugins>
</build>
  1. idea可视化方式构建
    在这里插入图片描述

2. Maven依赖管理

通过定义POM文件,Maven能够自动解析项目的依赖关系,并通过Maven仓库自动下载和管理依赖

2.1. 核心信息配置(GAVP)

<!-- 模型版本 -->
<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.0</version>
<!--打包方式默认:jar-->
<packaging>jar/pom/war</packaging>

2.2. 依赖管理配置

  1. 依赖管理和添加
<!-- 
   通过编写依赖jar包的gav必要属性,引入第三方依赖!
   scope属性是可选的,可以指定依赖生效范围!
   依赖信息查询方式:
      1. maven仓库信息官网 https://mvnrepository.com/
      2. mavensearch插件搜索
 -->
<dependencies>
    <!-- 引入具体的依赖包 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
        <!-- 依赖范围 -->
        <scope>runtime</scope>
    </dependency>
</dependencies>
  1. 依赖版本统一提取和维护
<!--声明版本-->
<properties>
  <!--命名随便,内部制定版本号即可!-->
  <junit.version>4.12</junit.version>
  <!-- 也可以通过 maven规定的固定的key,配置maven的参数!如下配置编码格式!-->
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <!--引用properties声明版本 -->
    <version>${junit.version}</version>
  </dependency>
</dependencies>

2.3. 依赖范围

依赖范围描述
compile编译依赖范围。对于三种 classpath 均有效。例如,log4j 在编译、测试、运行过程都是必须的。
test测试依赖范围。只对测试 classpath 有效。例如,Junit 依赖只有在测试阶段才需要。
provided已提供依赖范围。只对编译 classpath 和测试 classpath 有效。例如,servlet-api 依赖对于编译、测试阶段而言是需要的,但是运行阶段,由于外部容器已经提供,故不需要 Maven 重复引入该依赖。
runtime运行时依赖范围。只对测试 classpath、运行 classpath 有效。例如,JDBC 驱动实现依赖,其在编译时只需 JDK 提供的 JDBC 接口即可,只有测试、运行阶段才需要实现了 JDBC 接口的驱动。

2.4. Build构建配置

默认情况下,构建不需要额外配置。也可以在pom.xml定制一些配置,来修改默认构建的行为和产物

  1. 指定打包命名
<!-- 默认的打包名称:artifactid+verson.打包方式 -->
<build>
  <finalName>定义打包名称</finalName>
</build>  
  1. 指定打包文件
    应用场景:mybatis中有时会将用于编写SQL语句的映射文件和mapper接口都写在src/main/java下的某个包中,此时映射文件就不会被打包
<build>
    <!--设置要打包的资源位置-->
    <resources>
        <resource>
            <!--设置资源所在目录-->
            <directory>src/main/java</directory>
            <includes>
                <!--设置包含的资源类型-->
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>
</build>
  1. 配置依赖插件
<build>
  <plugins>
      <!-- java编译插件,配jdk的编译版本 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
      <!-- tomcat插件 -->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
         <version>2.2</version>
          <configuration>
          <port>8090</port>
          <path>/</path>
          <uriEncoding>UTF-8</uriEncoding>
          <server>tomcat7</server>
        </configuration>
      </plugin>
    </plugins>
</build>

3. Maven依赖传递和依赖冲突

3.1. Maven依赖传递特性

依赖的传递性:假如有Maven项目A、B、C,B依赖A,C依赖B。那么我们可以说 C依赖A。依赖关系为:C—>B—>A, 执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中,这就是依赖的传递性

  • 传递的原则
    • B 依赖 C 时使用 compile 范围:可以传递
    • B 依赖 C 时使用 test 或 provided 范围:不能传递。
    • B 依赖 C 时,若配置了以下标签,则不能传递
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.15</version>
    <optional>true</optional>
</dependency>

3.2. Maven依赖冲突特性

当直接或间接引用出现相同的jar包,一个项目就会出现相同的重复jar包,就是依赖冲突。依赖冲突避免出现重复依赖,并且终止依赖传递。
在这里插入图片描述

  • 解决依赖冲突的方式
    1. 自动选择原则
    • 短路优先原则(第一原则)
      A—>B—>C—>D—>E—>X(version 0.0.1)
      A—>F—>X(version 0.0.2)
      则A依赖于X(version 0.0.2)。
    • 依赖路径长度相同情况下,则“先声明优先”(第二原则)
      A—>E—>X(version 0.0.1)
      A—>F—>X(version 0.0.2)
      在<depencies></depencies>中,先声明的,路径相同,会优先选择
    1. 手动排除
<dependency>
  <groupId>com.wyb.maven</groupId>
  <artifactId>pro01-maven-java</artifactId>
  <version>1.0-SNAPSHOT</version>
  <scope>compile</scope>
  <!-- 使用excludes标签配置依赖的排除  -->
  <exclusions>
    <!-- 在exclude标签中配置一个具体的排除 -->
    <exclusion>
      <!-- 指定要排除的依赖的坐标(不需要写version) -->
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>

4. Maven工程继承和聚合关系

4.1. Maven工程继承关系

  • 继承:在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以在多个项目中共享同一配置信息,简化项目的管理和维护工作。
  • 继承作用:在父工程中统一管理项目中的依赖信息。
    • 背景
      • 对一个比较大型的项目进行模块拆分。
      • 一个 project 下面,创建了很多个 module。
      • 每一个 module 都需要配置自己的依赖信息。

4.1.1. 继承语法

  1. 父工程
<groupId>com.wyb.maven</groupId>
  <artifactId>pro03-maven-parent</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom -->
  <packaging>pom</packaging>
  1. 子工程
<!-- 使用parent标签指定当前工程的父工程 -->
<parent>
  <!-- 父工程的坐标 -->
  <groupId>com.wyb.maven</groupId>
  <artifactId>pro03-maven-parent</artifactId>
  <version>1.0-SNAPSHOT</version>
</parent>

<!-- 子工程的坐标 -->
<!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略 -->
<!-- <groupId>com.wyb.maven</groupId> -->
<artifactId>pro04-maven-module</artifactId>
<!-- <version>1.0-SNAPSHOT</version> -->
  1. 父工程依赖统一管理
    父工程声明版本
<!-- 使用dependencyManagement标签配置对依赖的管理 -->
<!-- 被管理的依赖并没有真正被引入到工程 -->
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>6.0.10</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>6.0.10</version>
    </dependency>
  </dependencies>
</dependencyManagement>

子工程饮用版本

<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。  -->
<!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 -->
<!-- 具体来说是由父工程的dependencyManagement来决定。 -->
<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
  </dependency>
</dependencies>

4.2. Maven工程聚合关系

  • 聚合:将多个项目组织到一个父级项目中,以便一起构建和管理的机制。聚合可以帮助我们更好地管理一组相关的子项目,同时简化它们的构建和部署过程。
  • 聚合作用:
    1. 管理多个子项目:将多个子项目组织在一起,方便管理和维护。
    2. 构建和发布一组相关的项目:在一个命令中构建和发布多个相关的项目,简化了部署和维护工作。
    3. 优化构建顺序:对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。
    4. 统一管理依赖项:在父项目中管理公共依赖项和插件,避免重复定义。
  • 聚合语法
    父项目中包含的子项目列表
<project>
  <groupId>com.example</groupId>
  <artifactId>parent-project</artifactId>
  <packaging>pom</packaging>
  <version>1.0.0</version>
  <modules>
    <module>child-project1</module>
    <module>child-project2</module>
  </modules>
</project>

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

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

相关文章

力扣算法题总结

lc253 题目&#xff1a;求最多重叠(x,y)的数量 思路&#xff1a;按y排序&#xff0c;把y放入优先队列&#xff0c;逐个比较x&#xff0c;x大于优先队列的堆顶元素就弹出堆顶。 lc148 题目&#xff1a;对链表排序 思路&#xff1a;归并排序。快慢指针找到链表中点&#xff0c…

计算机网络详解:发展史、TCP/IP协议、网络通信与应用开发全流程

文章目录 1. 计算机网络的发展史1.1 初期阶段&#xff1a;网络的萌芽&#xff08;1960年代&#xff09;1.2 第二阶段&#xff1a;TCP/IP协议的引入&#xff08;1970-1980年代&#xff09;1.3 第三阶段&#xff1a;互联网的普及与商业化&#xff08;1990年代&#xff09;1.4 现代…

uniapp 动态修改input样式

最近在用HBuilderx工具开发蓝牙调试工具&#xff0c;项目采用uniapp、vue3.0架构&#xff0c;需求设计为在向蓝牙模块发送数据之前&#xff0c;监测input是否为空&#xff0c;如果为空&#xff0c;则input边框橙红色。界面如下图所示&#xff1a; uniapp架构采用 .vue格式文件&…

深入解析SGD、Momentum与Nesterov:优化算法的对比与应用

目录 1. 梯度下降算法2. BGD、SGD、MBGD3. momentum与dampening3.1 另一种形式的momentum3.1.1 学习率固定3.1.2 学习率不固定 4. nesterov4.1 PyTorch中的Nesterov4.2 Polyak与Nesterov的比较 Ref 1. 梯度下降算法 先考虑一元情形。假设待更新的参数为 θ \theta θ&#xf…

常见统计量与其抽样分布

什么是统计量 我们首先给出统计量的定义:设 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X1​,X2​,⋯,Xn​ 为来自于总体X的一个样本&#xff0c; g ( X 1 , X 2 , ⋯ , X n ) g(X_1,X_2,\cdots,X_n) g(X1​,X2​,⋯,Xn​) 为关于 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X…

React开发环境搭建以及常见错误解决

‌React开发环境搭建主要包括Node.js安装、编辑器选择、创建React项目等步骤‌。 Node.js安装‌ 从Node.js官网下载并安装最新版本的Node.js&#xff0c;安装过程中npm会自动安装。安装完成后&#xff0c;通过命令行输入node -v和npm -v检查安装是否成功。 carawang%node -v…

JS 特殊运算符有哪些?

JavaScript 特殊运算符有哪些&#xff1f; 众多编程语言之中JavaScript &#xff0c;以其强大而全面的功能深受前端开发者喜爱。其丰富的运算符集&#xff0c;不仅包括了广泛应用的算术运算符、比较运算符以及逻辑运算符&#xff0c;还蕴藏着一系列较为冷门但同样功能强大的运算…

【SSM-Day2】创建SpringBoot项目

运行本篇中的代码&#xff1a;idea专业版或者idea社区版本&#xff08;2021.1~2022.1.4&#xff09;->这个版本主要是匹配插件spring boot Helper的免费版(衰) 【SSM-Day2】创建SpringBoot项目 框架->Spring家族框架快速上手Spring Boot&#x1f4e2;用idea插件创建Sprin…

python文件读写知识简记

简单记录一下python文件读写相关知识 一、打开文件 python使用open函数打开文件&#xff0c;函数原型如下 open(file, moder, buffering-1, encodingNone, errorsNone, newline None, closefdTrue, openerNone) file 文件地址 mode 文件打开模式&#xff0c;可设定为如下的…

harmonyOS ArkTS最新跳转Navigation

文章目录 取消标题栏初始页面(load)设置为竖屏 自定义标题Tabs&TabContentTabs通过divider实现了分割线各种属性 图片下载 官方文档 Entry Component struct Index {State message: string Hello WorldState djs:number 5build() {Column(){Navigation(){}.title("g…

一文详解GB28181、RTSP、RTMP

GB28181 GB28181 即 GB/T28181—2016《公共安全视频监控联网系统信息传输、交换、控制技术要求》。它是公安部提出的公共安全行业标准&#xff0c;在视频监控领域具有重要地位。 主要目的和应用场景&#xff1a; 目的&#xff1a;解决不同厂家的视频监控设备执行各自标准&…

9.24 C++ 常成员,运算符重载

//my_string.cpp #include "my_string.h" #include <iostream> #include <cstring>using namespace std;My_string::My_string():size(15){this->ptr new char[size];this->ptr[0] \0; //表示串为空串this->len 0;}//有参构造My_…

业务数据批量插入数据库实践

业务数据如何存储一直以来都是项目开发中的一个比较重要的话题。我们要从资源的利用率&#xff0c;业务场景和技术实现多个方面考虑存储的问题。“抛开业务谈技术就是耍流氓”&#xff0c;所有技术架构都要站在实际的业务场景中分析。比如个人端的产品&#xff0c;这种就属于读…

代码随想录算法训练营Day7 | 454.四数相加Ⅱ、383.赎金信、15.三数之和、18.四数之和

454.四数相加Ⅱ 题目 454. 四数相加 II - 力扣&#xff08;LeetCode&#xff09; 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums…

weblogic中间件漏洞复现

后台弱口令getshell 1.开启环境 cd vulhub-master/weblogic/weak_password docker-compose up -d docker ps 2.f访问靶场 访问/console/login/LoginForm.jsp这个目录进行登录&#xff0c; 默认账号密码&#xff1a;weblogic/Oracle123 需要注意的是单个账号进行登录时&…

C++_CH18_构造函数与析构函数

C_CH18_构造函数与析构函数 1 类的默认成员函数 在编写类的时候&#xff0c;C编译器会默认生成6个默认的函数&#xff0c;但是不显示出来&#xff1a; 需要关注以下两个方面: 第一:我们不写时&#xff0c;编译器默认生成的函数行为是什么&#xff0c;是否满足我们的需求。 …

LabVIEW界面输入值设为默认值

在LabVIEW中&#xff0c;将前面板上所有控件的当前输入值设为默认值&#xff0c;可以通过以下步骤实现&#xff1a; 使用控件属性节点&#xff1a;你可以创建一个属性节点来获取所有控件的引用。 右键点击控件&#xff0c;选择“创建” > “属性节点”。 设置属性节点为“D…

实践出真知!8个案例速通栅格系统

在现代设计中&#xff0c;栅格系统作为一种重要的布局方案&#xff0c;能够有效提升设计的秩序感。对于 UI 设计领域&#xff0c;栅格系统也广泛用于跨屏幕的响应式设计&#xff0c;帮助设计师打造更好的多端体验。本文将简要介绍栅格系统的基本概念和搭建方法&#xff0c;并提…

什么是unix中的fork函数?

一、前言 在本专栏之前的文档中已经介绍过unix进程环境相关的概念了&#xff0c;本文将开始介绍unix中一个进程如何创建出新进程&#xff0c;主要是通过fork函数来实现此功能。本文将包含如下内容&#xff1a; 1.fork函数简介 2.父进程与子进程的特征 3.如何使用fork创建新进程…

依赖不对应导致java文件不能正常显示

项目中若出现非正常显示的java文件&#xff0c;检查下是否依赖版本不对应。&#xff08;前提必须是maven项目&#xff09;