Maven的简单使用

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. 实现项目的快速部署

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

总结

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT 3.5/4.0 新手使用手册(详细版)

1. 什么是 ChatGPT&#xff1f; ChatGPT是由 OpenAI 开发的先进人工智能语言模型&#xff0c;能够理解并生成自然语言文本。它可以帮助你进行写作、回答问题、提供建议&#xff0c;甚至参与对话。ChatGPT 3.5 和 4.0 是两个不同版本&#xff0c;它们都拥有强大的语言处理能力&…

24/8/17算法笔记 策略梯度reinforce算法

import gym from matplotlib import pyplot as plt %matplotlib inline#创建环境 env gym.make(CartPole-v0) env.reset()#打印游戏 def show():plt.imshow(env.render(mode rgb_array))plt.show() show()定义网络模型 import torch #定义模型 model torch.nn.Sequential(t…

算法日记day 44(动归之编辑距离|回文字串|最长回文子序列)

一、编辑距离 题目&#xff1a; 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1&#xff1a; 输入&#xff1a;word1 "…

仿照ContentLoadingProgressBar 的特点在Android项目中自定义Loading对话框

ContentLoadingProgressBar 是 Android 中的一个控件&#xff0c;继承自 ProgressBar。它在 ProgressBar 的基础上添加了一些特殊功能&#xff0c;主要用于在加载内容时显示进度。它的一些主要特点如下&#xff1a; 自动隐藏和显示&#xff1a;ContentLoadingProgressBar 会在…

初级python代码编程学习----简单的图形化闹钟小程序

我们来创建一个简单的图形化闹钟程序通常需要使用图形用户界面&#xff08;GUI&#xff09;库。以下是使用Python的Tkinter库创建一个基本闹钟程序的步骤&#xff1a; 环境准备 确保已安装Python。安装Tkinter库&#xff08;Python 3.8及以上版本自带Tkinter&#xff0c;无需…

软件测试学习笔记丨Allure2报告添加附件报告定制

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/31810 一、Allure2报告中添加附件-图片 1.1 附件类型 TEXT ("text/plain", "txt") CSV ("text/csv", "csv") TSV ("text/tab-separated-v…

leetcode:2119. 反转两次的数字(python3解法)

难度&#xff1a;简单 反转 一个整数意味着倒置它的所有位。 例如&#xff0c;反转 2021 得到 1202 。反转 12300 得到 321 &#xff0c;不保留前导零 。 给你一个整数 num &#xff0c;反转 num 得到 reversed1 &#xff0c;接着反转 reversed1 得到 reversed2 。如果 reverse…

GEC6818开发板的学习

1、开发板的简介 首先连接 开发板与电脑,需电脑安装串口驱动:例CH340 2、开发板的特性: 像素:800*480Pix分辨率:高,宽两个维度的像素点数目开发板色深为32位一个像素点占4个字节:分别为灰度保留位、RGB三原色各占一位3、为什么要内存映射 虽然LCD设备本质上也可以看作…

OW-VISCap——开放世界视频实例分割方法研究

概述 论文地址&#xff1a;https://arxiv.org/pdf/2404.03657 本文提出了一种名为 OW-VISCap&#xff08;开放世界视频实例分割和字幕&#xff09;的方法。其三大贡献是 开放世界对象查询&#xff1a;除了已知对象查询外&#xff0c;还引入了开放世界对象查询&#xff0c;以发…

【安全靶场】-DC-7

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 一、收集信息 1.查看主机是否存活 nmap -T4 -sP 192.168.216.149 2.主动扫描 看开放了哪些端口和功能 n…

WPF调用CEF插件运行时启动CefSharp.BrowserSubprocess.exe三个进程

cefsharp.browsersubprocess.exe 是CefSharp&#xff08;一个基于Chromium的开源浏览器控件&#xff09;的一部分。这个可执行文件通常在以下情况下启动&#xff1a; 渲染进程&#xff1a;CefSharp使用多进程架构&#xff0c;类似于Chrome浏览器。cefsharp.browsersubprocess.e…

ArcGIS 数据服务在三维 Cesium/SuperMap 项目中使用遇到的一些问题及其解决方法

ArcGIS 数据服务在三维 Cesium/SuperMap 项目中使用遇到的一些问题及其解决方法 一、三维系统支持的 ArcGIS 服务及其投影 1、动态服务 ArcGIS 动态服务的数据&#xff0c;支持任意投影在三维系统中加载。 2、切片服务 ArcGIS 切片服务仅支持 3857(web 墨卡托投影)&#x…

19529 照明灯安装

### 详细分析 这个问题可以通过二分查找和贪心算法来解决。我们需要找到一个最大值&#xff0c;使得在这个最大值下&#xff0c;能够在给定的坐标上安装 k 个照明灯&#xff0c;并且相邻的照明灯之间的距离至少为这个最大值。 ### 思路 1. **排序**&#xff1a;首先对给定的…

arthas源码刨析:启动 (1)

文章目录 arthas-bootBootstrap Created with Raphal 2.3.0 开始 检查监听端口 jps 列表java应用 下载 lib 依赖 功能移交给 arthas-core 结束 arthas-boot 该module 的代码只有3个类&#xff1a; Bootstrap 启动类 Bootstrap &#xff0c;开头的注解就是 alibaba 的 cli 中…

凡图公益行:凡图家庭教育以行动筑梦,点亮孩子心中的光芒

在教育的路上&#xff0c;每一步都承载着未来的希望&#xff0c;凡图(山东)教育科技集团有限公司一直致力于为每一个孩子及家庭提供最优质的心理咨询服务。 在这样的背景下&#xff0c;凡图家庭教育以独特的使命感和责任感&#xff0c;成为了众多家庭信赖的伙伴。 也因此成为…

阿里Qwen2开源大模型本地部署及调试全攻略

阿里Qwen2开源大模型本地部署及调试全攻略 #Qwen2系列大模型性能卓越&#xff0c;超越业界知名模型。开源后受到AI开发者关注&#xff0c;支持多种语言&#xff0c;提升多语言理解。在预训练和微调上优化&#xff0c;实现智能水平提升。Qwen2系列模型在各项能力上均领先&#…

glibc 2.24 下 IO_FILE 的利用

文章目录 glibc 2.24 下 IO_FILE 的利用介绍&#xff1a;新的利用技术fileno 与缓冲区的相关利用实例&#xff1a;1. _IO_str_jumps -> overflow实例&#xff1a; 2. _IO_str_jumps -> finish实例: 最后拓展一下上一篇博客house of orange题目的做法: glibc 2.24 下 IO_F…

怎么对前端的一些按钮做一个权限校验

在一般情况下,我们需要对一些按钮做一个权限校验,来保证只有有权限的用户才能看到 1.创建一个js文件,来写我们的全局方法 我的方法是这样的 import Vue from vue;Vue.mixin({methods:{hasAuth(perm) {var authority this.$store.state.menu.permList;if (authority.indexOf(…

又搞到两款海外AI神器,确实强!

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 今天给大家安利两款海外AI神器&#xff0c;均已解除专业版限制&#xff0c;免翻&#xff0c;即可使用AI图片/视频修复(清晰度增强)、AI图片/视频一键抠图、AI证件照、美颜相机等强大功…

STM32的GPIO

GPIO基本控制 GPIO(General-Purpose input/output,通用输入/输出接口) 用于感知外部信号&#xff08;输入模式&#xff09;和控制外部设备&#xff08;输出模式&#xff09; 简单模块&#xff1a;LED,按键&#xff0c;蜂鸣器&#xff0c;温度传感器&#xff0c;使用一个GPIO…