01_Maven

news2025/1/20 13:34:37

文章目录

  • Maven
    • 安装Maven
    • Maven的工作流程
    • 配置Maven
    • Maven的使用
      • module和project的关系
      • 如何用Maven导包
    • 如何用Maven进行项目构建
      • 指令介绍
      • clean指令
      • compile指令
      • package指令
      • install指令
    • Maven的依赖管理
      • 如何导包
      • scope作用域
      • 依赖传递
      • 依赖冲突
    • 使用Maven开发项目
    • Junit
      • 如何使用Junit

Maven

  • Maven是一个项目管理工具,主要有两个功能:
    • 项目构建
      • 指可以帮助我们编译项目打包项目(可以帮助我们把自己的项目打包成一个.jar文件)、安装项目、部署项目
    • 依赖管理
      • 当我们的项目变得复杂之后,项目中的依赖越来越多,管理起来也越来越复杂,Maven可以帮助我们去管理这些依赖。

安装Maven

版本说明

  • JDK:1.8
  • Maven:https://maven.apache.org/download.cgi(不要下最新版本)

解压

  • 证明安装成功 证明安装成功

配置环境变量

  • 打开高级系统设置,配置系统变量
    • 在这里插入图片描述
  • 配置环境变量
    • 在这里插入图片描述
      最后在cmd中输入mvn -v,查看当前版本

Maven的工作流程

传统写代码的问题

  1. jar包反复存储,占用空间
  2. 手动管理,容易混乱

Maven的工作流程图

在这里插入图片描述

  • 本地仓库:其实就是本地存放Jar包的一个路径,统一的集中式的去管理本地的所有jar包
  • 中央仓库:中央仓库其实就是Maven 提供的一个仓库,里面收录了世界上所有的开源的jar包,但是在国外,网速慢。
  • 镜像仓库:阿里等公司会去定期同步中央仓库,把中央仓库的内容同步过来。这样我们后续在下载jar包的时候,就可以让他指定去镜像仓库下载,这样下载的速度就会比较快。

配置Maven

  • 配置settings.xml
    • conf文件里
    • 配置本地仓库的路径
      在这里插入图片描述
    • 配置镜像仓库
      在这里插入图片描述
    • 配置JDK的编译版本
      在这里插入图片描述

源码

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

</settings>

-------------------------------------------------------------------------------------

<settings>
	...
    <profiles>
        <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>
    </profiles>
    ...
</settings>
  • 配置idea
    • 在Settings中搜索Maven
      在这里插入图片描述
    • Other Settings —> Settings for New Projects —> Maven
      在这里插入图片描述

Maven的使用

Maven工程的要求:

  1. 在项目的根路径下,有一个pom.xml文件

  2. 工程目录是如下的结构:

  • ProjectName

    • src(src里面不直接写包)
      • main
        • java(写代码的地方,指源代码的路径)
        • resources(配置文件地方,指配置文件的路径)
      • test
        • java(单元测试代码,指测试类的存放路径)
        • resources(单元测试的配置文件,指测试类需要用到的文件)
  • pom.xml(在项目的根目录下)

eg:
在这里插入图片描述


怎么把一个项目转换成maven项目

  1. src里面建几个包
    • src/main/java
      • mark as sources
    • src/main/resources
      • mark as resources
    • src/test/java
    • src/test/resources
  2. 创建一个pom.xml
  3. 对着pom.xml点击add as maven project

怎么通过idea创建一个Maven项目

在这里插入图片描述

  • GroupId:指公司名、组织名
    • eg:com.coo1heisenberg
  • ArtifactId:项目名
    • eg:test_maven

module和project的关系

  • project

    一个项目是IDEA开发工作的顶级组织单位。在其完成的形式中,一个项目可能代表一个完整的软件解决方案
    项目是以下内容的集合:

    • 工作成果:源代码、脚本、配置文件、文档、包等。
    • 用于开发、编译、运行和测试代码的SDK和库。
    • 在项目上下文中表示你的工作偏好设置
      • 一个项目有一个或者多个模块作为其部件
  • module

    • 模块是项目的一部分,你可以独立的编译、运行、测试和调试。
    • 模块是一种在维护公共项目配置的同事降低大型项目复杂性的方法。
    • 模块可以重复使用:如果需要,可以再多个项目中包含一个模块。

如何用Maven导包

  1. 打开https://mvnrepository.com/。搜索要用的包,找到指定的版本
  2. 拷贝坐标
    • groupIdartifactIdversion 叫做坐标,可以唯一确定一个包
  3. 只需要在 pom.xml文件中声明jar包的坐标就可以了,添加了之后点击 import changes

eg:
在这里插入图片描述


如何用Maven进行项目构建

指令介绍

项目构建其实就是 Maven可以帮助我们去检查项目,编译项目,测试项目,打包项目,安装项目,部署项目

在这里插入图片描述

clean指令

Maven指令的执行依赖于一些jar

  • 方式一:通过cmd执行
    在这里插入图片描述
  • 方式二:通过idea自带的命令行执行
    • 得以管理员身份打开idea,否则识别不出mvn命令
      在这里插入图片描述
  • 方式三:直接使用maven的可视化插件(常用)
    在这里插入图片描述

compile指令

  • compile是编译的意思,可以帮助我们生成一个target文件夹
  • 以后,只能在java文件夹中写代码,在resources文件夹里面,写配置文件
    • src/main/java中的代码,会编译到target/classes里面
    • src/main/java中的配置文件、其他文件,不会进入到target/classes里面
    • src/main/resources中的代码,会拷贝到target/classes里面
  • test文件是运行单元测试的,只会运行test文件里面java的单元测试
    • 先引入Maven中的Junit
    • Assert.assertEquals():在单元测试里面,使用Assert断言帮我们完成自动化的检验工作
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

package指令

package可以帮助我们把项目打包

  • 打包的名字:artifactId-version.jar(是artifactId加上文件的版本)
  • 打包的格式:
    • jar

      • 默认的打包格式
    • war

      • 需要指定
      • 指定的格式为:
<!-- 指定打包的格式,默认为jar ,可以配置为 war 和 pom -->
<packaging>jar</packaging>

install指令

  • install命令可以帮助我们把package生成的jar包复制到本地仓库中
  • 需要掌握根据 groupIdartifactIdversion找本地的jar
    eg:在这里插入图片描述

Maven的依赖管理

如何导包

按照上面说到的三步流程执行即可

scope作用域

每个依赖包都有自己作用范围
<scope>XXX</scope>
eg:

在这里插入图片描述

  • test
    • 仅仅在测试包(src/test/java)路径下有效,在 src/main/java路径下失效。
  • provided
    • 在编译的时候生效,在运行的时候失效
  • runtime
    • 在编译的时候失效,在运行的时候生效
    • 最常见的是:数据库的驱动包
    • 设计原因:就是防止写代码的时候,用了MySQL特有的类,切数据库的时候不好操作
  • compile
    • 默认的作用域
    • 在编译和运行的时候都生效

依赖传递

  • 指依赖具有传递性
  • eg:引入了commons-dbcp,而commons-dbcp又引入了commons-pool
    在这里插入图片描述

依赖冲突

  • 当在同一个项目中,导入同一个依赖的不同的版本,就会有冲突的问题。
    在这里插入图片描述
  • 如何解决依赖冲突
    • 声明优先原则
      • 是指这同一个项目的不同的版本的jar包,声明优先仅仅指的是第二级后面的依赖谁先在pom.xml中声明,以谁为准
      • 如果在pom.xml里,同时依赖了两个版本。是以最后一个指定的为准
    • 就近原则
      • 在进行依赖传递的时候,谁传递的次数比较少,以谁为准
      • 就近原则的优先级高于声明优先原则
    • 手动排除
      • 手动去排除传递过来的依赖

eg:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.22</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.13</version>
</dependency>

其中:
spring-context依赖了spring-beans(5.3.22) 优先!!!
spring-jdbc依赖了spring-beans(5.3.13)


--------------------------------------------------

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.13</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.22</version>
</dependency>(优先!!!)


--------------------------------------------------

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.4</version>

	<!-- 手动排除 -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </exclusion>

        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </exclusion>
    </exclusions>
    
</dependency>

  • 提取常量
    • 这个是一个避免依赖冲突的方法。是后面工作中主要推荐的做法。
    • 常量名字不要随便取

eg:

    <properties>
		<!--
			1. 提取了常量之后,可以避免依赖冲突的问题
		
			2. 提取了常量之后,可以方便我们后期管理这些依赖(查看版本,更换版本)
		-->
		
        <spring.version>5.3.3</spring.version>
        <mysql.version>5.1.47</mysql.version>
        <druid.version>1.2.6</druid.version>
    
    
    </properties>


    <dependencies>



        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>


        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>


        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>


        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>


        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        
    </dependencies>

使用Maven开发项目


路径问题的建议

  1. 不要用绝对路径
  2. 最好使用类加载器的方式去读文件

切换成Maven之后,开发模式的变化

  1. 之前需要手动下jar包,拷贝,添加到库文件;现在只用引入坐标
  2. 之前读配置文件,使用new FileInputStream();现在读配置文件,需要用classLoader,配置文件的位置需要在src/main/resource

eg:
以连接池中的druid举例:

public class druidDemo {
    public static void main(String[] args) throws Exception {
        testNormal();
    }

    private static void testNormal() throws Exception {

        Properties properties = new Properties();


        // 1. 绝对路径不要使用
        //  properties.load(new FileInputStream("druid.properties"));

        ClassLoader classLoader = druidDemo.class.getClassLoader();
        // 现在配置文件 需要用classLoader拿

        // 通过类加载器拿文件,会通过target/classes里面拿
        URL resource = classLoader.getResource("druid.properties");

        properties.load(new FileInputStream(resource.getPath()));

        // 或者
        // properties.load(classLoader.getResourceAsStream("druid.properties"));

        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

        Connection connection = dataSource.getConnection();

        Statement statement = connection.createStatement();

        boolean execute = statement.execute("insert into t_staff(name) values ('zs')");

        System.out.println(execute);
    }
}

<?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>
    <parent>
        <groupId>com.coo1heisenberg</groupId>
        <artifactId>test_maven</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>module1</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <druid.version>1.2.6</druid.version>

    </properties>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

</project>
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?
characterEncoding=utf8&useSSL=false&serverTimezone=UTC
username=root
password=123456

Junit

Junit是一个被广泛使用的测试工具,可以帮助我们运行我们指定的方法

如何使用Junit

  • 导包
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
  • 使用

    • @Test
    • @After
      • 修饰的方法会在测试方法运行之后执行
      • 在每一次测试方法的前后都会运行
      • 一般用来准备数据
    • @Before
      • 修饰的方法会在测试方法运行之前执行
      • 在每一次测试方法的前后都会运行
      • 一般用来销毁数据
    • @BeforeClass
    • @AfterClass
  • 使用的注意事项:

    • @BeforeClass@AfterClass修饰的方法必须是静态的
    • @Test注解修饰的方法必须是public、必须是void、必须没有参数
    • 测试类必须在 src/test/java 路径下
    • 测试类的命名必须叫做 XxxTest
    • 测试方法(@Test注解修饰的方法)的命名必须叫做 testXxx();
  • 使用断言语句,来完成结果的确认

@Test
public void test1() {
    // 在单元测试里面,使用Assert 断言帮我们完成自动化的检验工作。
    Assert.assertEquals(new Integer(3), max);
}

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

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

相关文章

(黑马出品_03)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_03&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术Docker 今日目标1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2…

代码学习记录11

随想录日记part11 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.04 主要内容&#xff1a;今天的主要内容是深入了解栈和队列中比较难的题录类型&#xff1a;滑动窗口最大值与前 K K K 个高频元素&#xff0c;最后对于这三天学习的队列和栈的知识进行总结。…

深圳市萨科微半导体有限公司一直研究新材料新工艺,不断推出新产品,驱动公司不断发展

深圳市萨科微半导体有限公司一直研究新材料新工艺&#xff0c;不断推出新产品&#xff0c;驱动公司不断发展。最近萨科微推出SL40T120FL系列IGBT单管&#xff0c;和CMOS运算放大器SLA333等产品&#xff0c;为新能源汽车、太阳能光伏、交流电机、变频器、开关电源和工业伺服器行…

如何应对IT服务交付中的问题?看了本文DevOps就懂了

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

Java常用类库:Math类

在Java编程语言中&#xff0c;java.lang.Math类提供了一系列用于执行基本数学运算的静态方法。这些方法允许你执行各种数学计算&#xff0c;如三角函数、指数函数、对数函数、取整函数等。在本教程中&#xff0c;我们将介绍Math类的常用方法及其用法。 常用方法 以下是Math类…

线性代数 --- 特征值与特征向量

特征值与特征向量 已知任意向量x&#xff0c;现有矩阵A对x进行操作后&#xff0c;得到新的向量Ax。这就好比是自变量x与函数f(x)的关系一样&#xff0c;向量x通过类似“函数”的处理得到了一个新的向量Ax。这个新的向量可能和原向量x方向相同&#xff0c;也可能不同(事实上大多…

1911_野火FreeRTOS教程阅读笔记_请求任务切换

1911_野火FreeRTOS教程阅读笔记_请求任务切换 全部学习汇总&#xff1a; g_FreeRTOS: FreeRTOS学习笔记 (gitee.com) 还有一部分任务切换请求的代码没有分析。 实现上是一个宏定义&#xff0c;实现的工作主要的核心点还是请求PendSV的exception。当这个调用的时候&#xff0c;下…

基于AM62X+FPGA/MCU的B码对时定制化整机解决方案

什么是IRIG-B码对时 IRIG-B(inter-range instrumentationgroup-B)码是一种时间同步标准&#xff0c;通常用于精确的时间测量和数据同步&#xff0c;广泛应用于电力、通信、航空等领域。 IRIG-B码为每秒一帧的时间串码&#xff0c;一帧串码中包含100个码元&#xff0c;频率为1K…

STM32控制气泵和电磁阀实现

一、功能简介 使用STM32控制气泵和电磁阀的开和关&#xff0c;气泵和电磁阀的供电电压为12V。 二、实现过程 1、气泵和电磁阀的开和关均为开关量&#xff0c;实现控制方法有多种&#xff0c;比如继电器&#xff0c;但是继电器动作有噪声且体积较大&#xff0c;更好的方法为使…

【YARN】详解 YARN 中的 ResourceManager

详解 YARN 中的 ResourceManager 1.ResourceManager 核心功能2.通信&#xff08;与三个角色通信&#xff09;3.模块简介3.1 用户交互模块3.2 NM 管理模块3.3 AM 管理模块3.4 Application 管理模块3.5 状态机模块3.6 安全模块3.7 资源分配模块 4.模块详解​​4.1 用户交互模块4.…

如何使用ArcGIS Pro进行坡度分析

坡度分析是地理信息系统中一种常见的空间分析方法&#xff0c;用于计算地表或地形的坡度&#xff0c;这里为大家介绍一下如何使用ArcGIS Pro进行坡度分析&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&…

一般情况下使用耳机壳UV树脂制作耳机壳的成本是多少?

一般情况下使用耳机壳UV树脂制作耳机壳的成本是多少&#xff1f; 使用耳机壳UV树脂制作耳机壳的成本主要包括材料成本、加工成本和其他附加成本。 材料成本主要取决于所采购的UV树脂的数量和单价。如果购买数量较大&#xff0c;单价可能会较低。市场上不同品牌和型号的UV树脂…

ubuntu 20.04 安装 huggingface transformers 环境

1. 安装 cuda 大多数新发布的大语言模型使用了较新的 PyTorch v2.0 版本&#xff0c;Pytorch 官方认为 CUDA 最低版本是 11.8 以及匹配的 GPU 驱动版本。详情见Pytorch官方 如下图&#xff1a; 1.1 下载 cuda cuda 12.1 官方网站&#xff1a; 下载&#xff1a; $wget htt…

部署LVS负载均衡架构

目录 一、ipvsadm 工具 二、NAT模式下部署LVS负载均衡 1、部署NFS共享存储服务器 1.1 安装NFS软件 1.2 新建共享目录和站点文件 1.3 设置共享策略 2、部署节点服务器1 2.1 安装并启动nginx软件 2.2 挂载共享目录到网页站点目录 2.3 修改网关 3、部署节点服务器2 3.…

【网络应用层协议】【MQTT】详解消息队列遥测传输协议MQTT(超详细)

目录 1. MQTT 协议简介 2. MQTT 的特点 3. MQTT 协议原理 4. MQTT协议中的订阅、主题、会话 1. MQTT 协议简介 MQTT&#xff08; Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议 &#xff09;是一种消息列队传输协议&#xff0c;采用订阅、发布机制&…

coqui-ai/TTS 案例model文件

GitHub - coqui-ai/TTS: &#x1f438;&#x1f4ac; - a deep learning toolkit for Text-to-Speech, battle-tested in research and production Coqui AI的TTS是一款开源深度学习文本转语音工具&#xff0c;以高质量、多语言合成著称。它提供超过1100种语言的预训练模型库&…

递增三元组(第九届蓝桥杯)

文章目录 题目原题链接思路分析二分做法1二分做法2双指针做法前缀和解法 题目 原题链接 递增三元组 思路分析 由时间复杂度可知需要至少优化到 O ( n l o g n ) O(nlogn) O(nlogn)才行 而纯暴力枚举三个数组的话&#xff1a; O ( n 3 ) O(n^3) O(n3) 可以考虑将b[]作为标志&…

onlyoffice监听https

修改onlyoffice 在开始将您的ONLYOFFICE Docs切换到HTTPS协议之前&#xff0c;您需要创建一个安全证书和证书私钥。将它们放到安装ONLYOFFICE Docs的计算机上的一个文件夹中。 获得证书后&#xff0c;请执行以下步骤&#xff1a; 所有命令都应以管理员权限执行。要以管理员身份…

【HTML】HTML基础7.3(自定义列表)

目录 标签 效果 代码 注意 标签 <dl> <dt>自定义标题</dt><dd>内容1</dd><dd>内容2</dd><dd>内容3</dd> 。。。。。。 </dl> 效果 代码 <dl><dt>蜘蛛侠系列</dt><dd>蜘蛛侠1</dd…

如何远程连接服务?

"天联"是一种远程连接服务&#xff0c;可以实现异地统一管理、随时随地协同办公和远程数据采集管理等功能。 1. 零售、收银软件应用实现异地统一管理 在医药、餐饮、商超等零售行业中&#xff0c;经常需要对分布在不同地点的店铺进行管理。"天联"提供了远…