Maven的简单使用

news2024/11/27 22:25:48

Maven使用

  • Maven的作用
    • 1. 自动构建标准化的java项目结构
      • (1) 项目结构
        • ① 约定目录结构的意义
        • ② 约定大于配置
      • (2)项目创建
        • 坐标
          • 坐标的命名方法(约定)
    • 2. 帮助管理java中jar包的依赖
      • (1) 配置使用
        • 依赖引入
        • 属性配置
      • (2) maven指令
      • (3) 依赖的范围
      • (4) 依赖传递
      • (5) 依赖的排除和覆盖
      • (6) 项目聚合
      • (7) 项目继承
        • 如果存在子模块不想继承父模块中某些依赖的情况时(父模块中的模块并不是子模块都需要的模块)
        • 项目管理的配置要求
    • 3. 实现项目的快速部署
  • 总结

Maven的作用

1. 自动构建标准化的java项目结构

(1) 项目结构

Maven生成项目的结构

① 约定目录结构的意义

Maven为了让构建过程能够尽可能自动化完成,所以必须约定目录结构的作用。例如:Maven执行编译操作,必须先去Java源程序目录读取Java源代码,然后执行编译,最后把编译结果存放在target目录。

② 约定大于配置

Mave对于目录结构这个问题,没有采用配置的方式,而是基于约定。这样会让我们在开发过程中非常方便。如果每次创建Maven工程后,还需要针对各个目录的位置进行详细的配置,那肯定非常麻烦。
目前开发领域的技术发展趋势就是:约定大于配置,配置大于编码。

(2)项目创建

选择Maven(使用的版本是Idea 2020.1.1)
在这里插入图片描述
输入项目名,选择项目的存储文件夹
在这里插入图片描述

选择maven的相关信息
在这里插入图片描述

坐标

坐标对于一个maven项目是唯一的

  <groupId>org.example</groupId>
  <artifactId>learingmaven</artifactId>
  <version>1.0-SNAPSHOT</version>
坐标的命名方法(约定)
<!--
    对于一个工程就是一个项目的情况
    groupId: 域名反过来  如 com.baidu
    artifactId:项目的名字 如 baiduwenku
    version: 版本号,这一般由运维人员指定, 1.0-SNAPSHOT 是最初的快照版本的意思,还有1.0-RELEASE(发布版本)

    对于一个工程项目中的一个模块的情况 (如百度文库这个项目有前端,后端,公共模块)
    groupId: 域名反过来,后面再加上模块名  如 com.baidu.qianduan
    artifactId:模块的名字 如 qianduan
    version: 版本号,这一般由运维人员指定, 1.0-SNAPSHOT 是最初的快照版本的意思,还有1.0-RELEASE(发布版本)
-->

2. 帮助管理java中jar包的依赖

利用远程仓库管理所有jar包。 解决jar包依赖中版本冲突的问题(利用依赖传递的特性)

(1) 配置使用

依赖引入

引入依赖时会首先查看本地仓库是否存在对应的jar包,存在直接使用,不存在则从网上下载到本地仓库中,如果网上也不存在则报错

java中的jar包是通过在配置文件中配置相关依赖引入的,配置需要的信息就是坐标信息(groupId, artifactId,version)。
查询地址 maven查询官网,搜索对应的包,选择版本,复制对应的依赖到配置文件即可。
在这里插入图片描述
依赖标签<dependency>需要被大标签<dependencies>包裹,如下

  <dependencies>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

刷新可以更新配置的依赖,进入对应的jar包
在这里插入图片描述
下载的jar包可以在本地仓库找到在这里插入图片描述

属性配置

通过properties里面加入变量标签引入属性,这样可以便于版本信息的复用和更改在这里插入图片描述

(2) maven指令

在这里插入图片描述

指令作用
clean清楚生成的target文件
validate校验
compile编译
test执行测试单元(Test开头的类)
package项目打包(jar,war等)
install把项目安装到本地仓库中

maven指令执行时是安装顺序执行的,比如要执行compile指令,则会先执行clean和validate指令,执行install指令则会执行他前面的那些指令。

(3) 依赖的范围

依赖的范围注意是依赖中<scope> </scope>指定

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>${javax.servlet-api}</version>
      <scope>provided</scope>
    </dependency>

这个依赖的范围一般在中央仓库( maven查询官网)处就会有说明。

依赖范围有

  1. 编译(main/java)
  2. 测试 (main/test)
  3. 运行/打包

范围指定的关键词

编译测试打包例子
test××junit 测试
provided×servlet(因为tomcat上有servlet所以不需要打包)
compile默认的依赖范围
runtime×反射方法,如数据库驱动 class.forName()
system×功能类似provided,不会依赖仓库中的jar包,而是引用本地物理路径的jar包,路径由<sysyemPath>\指定

(4) 依赖传递

如图,意思就是A项目引用B,B项目的依赖会条加到A中。但是,如果B项目中的依赖范围限定为test或者provided(说白了就是不被打包)的话,依赖就不会传递给A。
当然依赖中也有一个标签<optional>用于说明是否进行传递(默认值为false,进行传递)

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<optional>false</optional>
		</dependency>

在这里插入图片描述

(5) 依赖的排除和覆盖

如果不想要引用项目上传的相关依赖包的话,可以使用上面说到的限制依赖范围和使用标签<optional>,但是这两种方法都是修改到了被引用项目B的源码。如果源码B不可更改的情况下可以使用下面两个方法

  1. 使用<exclusions>标签
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<optional>false</optional>
			<exclusions>

				<exclusion>
					<groupId> 排除包1 </groupId>
					<artifactId> 排除包1 </artifactId>
				</exclusion>

				<exclusion>
					<groupId> 排除包2 </groupId>
					<artifactId> 排除包2 </artifactId>
				</exclusion>
			</exclusions>

		</dependency>
  1. 直接在自己的项目里面指定需要的包
    这种方法只需要正常写就行,指定包的groupId, artifactId, version。就可以覆盖掉依赖传递上来的包。

(6) 项目聚合

项目聚合就是通过一个项目管理多个模块,这样如果A依赖与B,B发生改变的时候就不需要对A和B进行重新编译,会自动进行。
而且这样可以使用项目各个模块在同一个文件中,方便编码。
①创建管理项目
在这里插入图片描述
② 删除maven自动构建的src文件(因为这个项目只是作为管理用的,不进行代码编写)
在这里插入图片描述
③ 在管理文件夹下右键点击model,创建模块在这里插入图片描述
创建前端模块
在这里插入图片描述
创建后端模块在这里插入图片描述
创建完成的目录
在这里插入图片描述
在聚合项目parent的配置文件中加入<modules>标签,告知聚合的模型名

十分重要: 在聚合项目中一定一定要把打包方式改变为pom,不然会报错

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>org.example</groupId>
    <artifactId>parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    
     <packaging>pom</packaging>
    
    <modules>
        <module>frontend</module>
        <module>backend</module>
    </modules>


</project>

完成上面的配置后,直接对聚合项目执行maven指令,他的子项目也会执行对应的操作。请添加图片描述

(7) 项目继承

继承主要是用于各个模块可能没有联系,但是需要进行部分依赖的版本统一,如各个模块mysql驱动版本要一致。继承和聚合是可以同时存在的。

  1. 继承可以在创建模块时选择需要继承的父配置
    在这里插入图片描述
  2. 可以在子配置中添加<parent>标签
    在这里插入图片描述

这样子模块就会继承父模块的依赖。在这里插入图片描述

如果存在子模块不想继承父模块中某些依赖的情况时(父模块中的模块并不是子模块都需要的模块)

父模块中的模块并不是子模块都需要的模块,这种情况下就需要把非必须依赖放在父模块配置文件的<dependencyManagement>标签中。

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>org.example</groupId>
    <artifactId>parent</artifactId>
    <version>1.0-SNAPSHOT</version>


    <packaging>pom</packaging>

    <modules>
        <module>frontend</module>
        <module>backend</module>
    </modules>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>4.0.1</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


</project>

在使用时则只需要在子模块中正常加入依赖即可,只不过是省略了version
在这里插入图片描述

项目管理的配置要求
<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>org.example</groupId>
    <artifactId>parent</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>pom</packaging>

    <modules>
        <module>frontend</module>
        <module>backend</module>
    </modules>

<!--    管理所有jar包的版本号-->
    <properties>
        <mysql-connector-java.version>8.0.23</mysql-connector-java.version>
        <javax.servlet-api.version>4.0.1</javax.servlet-api.version>
    </properties>

<!--    模块公共依赖放这-->
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector-java.version}</version>
        </dependency>
    </dependencies>

<!--    模块非必须依赖放这-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>${javax.servlet-api.version}</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


</project>

3. 实现项目的快速部署

这里说明了功能,过程可自行查找。

总结

在这里插入图片描述

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

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

相关文章

Vitis AI 进阶认知(Torch量化基础+映射+量化参数+对称性+每通道+PTQ+QAT+敏感性)

目录 1. 介绍 2. 基本概念 2.1 映射函数 2.2 量化参数 2.3 校准 2.4 对称与非对称量化 2.5 Per-Tensor and Per-Channel 2.6 PTQ 2.7 QAT 2.8 敏感性分析 2.6 退火学习率 3. 几点建议 4. 总结 1. 介绍 Practical Quantization in PyTorch | PyTorchQuantization i…

OpenCV几何图像变换(4)亚像素图像截取函数getRectSubPix()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从图像中以亚像素精度检索像素矩形。 getRectSubPix 函数从 src 中提取像素&#xff1a; p a t c h ( x , y ) s r c ( x center.x − ( dst.…

怎么为pdf文件加密设置密码?8个实用pdf文件加密方法

随着数字化信息的普及&#xff0c;保护PDF文件免受未授权访问和篡改的需求日益增强。为了确保您的重要文档安全无虞&#xff0c;加密PDF文件并设置密码成为了一个至关重要的步骤。以下是详细指导&#xff0c;帮助您为PDF文档加密并设置密码&#xff0c;确保其内容的安全。怎么为…

深入理解Java虚拟机(类加载器)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 类加载器 类加载器有什么作用呢&#xff1f; 对于任意的一个类&a…

基于一阶高斯低通滤波器的软件设计

前言 一阶RC低通滤波器&#xff08;巴特沃斯滤波&#xff09;-CSDN博客 一阶高斯低通滤波器不是一个直接的概念&#xff08;因为一阶滤波器通常不产生高斯型频率响应&#xff09;&#xff0c;这里我用软件的方式来模拟高斯低通滤波器的效果。 有纰漏请指出&#xff0c;转载…

C++竞赛初阶L1-13-第五单元-循环嵌套(29~30课)538: T456457 第 n 小的质数

题目内容 输入一个正整数 n&#xff0c;求正整数范围中第 n 小的质数。 输入格式 一个不超过 30000 的正整数 n。 输出格式 第 n 小的质数。 样例 1 输入 10 全部程序代码&#xff1a; #include<bits/stdc.h> using namespace std; int main() {long long n,i;ci…

【数据分享】《中国社会统计年鉴》(2006-2023)

而今天要限时免费分享的数据就是2006-2023年间出版的《中国社会统计年鉴》并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 一、《中国社会统计年鉴》是一部反映我国社会发展相关领域基本情况的综合性统计资料年刊。书中收录了年全国和…

Leetcode每日刷题之1004.最大连续1的个数|||(C++)

1.题目解析 本题的目的是找出能最多翻转k个0的情况下最长连续的1的个数&#xff0c;并且这是一个二进制数组&#xff0c;只存在0和1&#xff0c;翻转0就是将0变为1 2.算法原理 首先我们想到的一定是暴力枚举&#xff0c;即依次列举出在最多翻转k个0的情况下所有连续1的子数组的…

类和对象(下)(2)

类和对象&#xff08;下&#xff09;(2) static成员 • ⽤static修饰的成员变量&#xff0c;称之为静态成员变量&#xff0c;静态成员变量⼀定要在类外进⾏初始化。 • 静态成员变量为当前类的所有对象所共享&#xff0c;不属于某个具体的对象&#xff0c;不存在对象中&#…

m4a转wav,使用FFmpeg和Python将M4A文件转换为WAV

你可以使用Python程序或Linux命令来将M4A文件转换为WAV文件。下面分别介绍这两种方法。 方法一:使用FFmpeg命令行工具(Linux命令) FFmpeg 是一个强大的多媒体处理工具,支持音视频转换、处理等操作。你可以在终端中使用以下命令将M4A文件转换为WAV文件: ffmpeg -i input…

网络通信(1)

网络&#xff1a; 不同主机间的通信问题 实现网络通信 物理层面 有一个 信息通路 &#xff08;有线 &#xff1b;无线 &#xff1b;5G&#xff1b;4G&#xff1b;星链 &#xff09;软件层面(逻辑层面) 也需要 一个通路 网络编程 Open System Interconnect (OSI网…

[OC]萝卜圈玩行车记录仪

图1-1&#xff0c;你的手动小车 代码是 #机器人驱动主程序 #请在main中编写您自己的机器人驱动代码 import tkinter as tk import turtle v0 # 速度 accFalse;slowFalse;leftFalse;rightFalse # 按键状态 step0.5 # 一次速度变化量 def keyup_press(event):global acc;accTru…

归并排序(Java实现)

目录 归并排序的思想 代码实现 思路 代码 归并排序的特点 归并排序的思想 归并排序的核心思想是分治&#xff0c;分而治之&#xff0c;就是把数组先分成若干个子数组&#xff0c;先将这些子数组排序后&#xff0c;再合并到一起去。 我们常说的归并排序是二路归并排序&…

uview-plus upload组件在上传视频在小程序环境下点击无反应

你们好&#xff0c;我是金金金。 场景 我正在使用uniapp开发微信小程序&#xff0c;使用的vue3&#xff0c;所以集成的uview-plus这个ui库 代码非常的简单&#xff0c;就是一个上传组件 在h5环境下点击是可以上传视频的&#xff0c;在微信小程序开发者工具里面点击完全没反应…

初阶数据结构之计数排序

非比较排序 计数排序 计数排序⼜称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应⽤。 操作步骤&#xff1a; 1&#xff09;统计相同元素出现次数 2&#xff09;根据统计的结果将序列回收到原来的序列中 #include "CountSort.h" void Count(int* arr, int n)…

利用GBDT进行对表格类数据的机器学习的实战项目

一&#xff1a;题目简介 在数据集中&#xff0c;每个样本都对应一个葡萄牙大学的学生。原始数据集中共有4424名学生&#xff0c;。对于每个学生&#xff0c;我们获得了人口统计数据、宏观经济数据以及课程前两个学期的表现。目标是预测学生在三年或四年学习后的状态&#xff1…

虚拟机桥接模式下设置静态IP

虚拟机桥接模式下设置静态ip 1. 设置虚拟机网络适配器为桥接模式2. 配置 CentOS 虚拟机的静态 IP3. 重启网络服务4. 验证配置5. 网络测试 要将 CentOS 虚拟机的网络模式从 NAT 模式更改为桥接模式&#xff0c;并设置静态 IP 地址以与 Windows 内网保持在相同网段&#xff0c;你…

PPP简介

介绍PPP特性的定义和目的。 定义 PPP&#xff08;Point-to-Point Protocol&#xff09;协议是一种点到点链路层协议&#xff0c;主要用于在全双工的同异步链路上进行点到点的数据传输。 目的 PPP协议是在串行线IP协议SLIP&#xff08;Serial Line Internet Protocol&#x…

vue---echarts环形图

1、完整代码直接可以cv <template><div id"main1"></div> </template><script> import * as echarts from echarts; // import { mapState } from vuex; // import { Alarm_Device } from ../utils/api.js; export default {name: P…

视频美颜SDK与直播美颜工具的架构设计与性能优化

本篇文章&#xff0c;小编将深入讲解视频美颜SDK与直播美颜工具的架构设计&#xff0c;并分享一些性能优化的实践经验。 一、视频美颜SDK的架构设计 视频美颜SDK的核心在于其模块化的设计思路。通常&#xff0c;视频美颜SDK由以下几个主要模块组成&#xff1a; 1.图像预处理…