01_Maven

文章目录

  • 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);
}

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

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

相关文章

xss.pwnfunction.com靶机 Warmups

通关要求弹出警告框alert(1337) 没有用户交互 不能使用外链接 在chrome中测试 Ma Spaghet! 通过分析代码我们可以看到它直接用innerHTML将接收的内容赋值 但是我们不能使用<script>标签因为&#xff1a;HTML 5 中指定不执行由 innerHTML 插入的 <script> 标签。 所…

字符串标记高亮脚本

源码 #!/bin/bash # usage: # echo hhh|mark str [font_color] [background_color] # font_color and background_color is optional, default is black&whiterp_str$1 f_color30 b_color47if [ "${f_color}a" "a" ]; thenf_color30 fiif [ "${…

985硕的4家大厂实习与校招经历专题分享(part1)

先简单介绍一下我的个人经历&#xff1a; 985硕士24届毕业生&#xff0c;实验室方向:CV深度学习 就业&#xff1a;工程-java后端 关注大模型相关技术发展 校招offer: 阿里巴巴 字节跳动 等10 研究生期间独立发了一篇二区SCI 实习经历:字节 阿里 京东 B站 &#xff08;只看大厂…

Stable Diffusion 解析:探寻 AI 绘画背后的科技神秘

AI 绘画发展史 在谈论 Stable Diffusion 之前&#xff0c;有必要先了解 AI 绘画的发展历程。 早在 2012 年&#xff0c;华人科学家吴恩达领导的团队训练出了当时世界上最大的深度学习网络。这个网络能够自主学习识别猫等物体&#xff0c;并在短短三天时间内绘制出了一张模糊但…

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

&#xff08;黑马出品_04&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术异步通信 今日目标1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯 1.2.技术对比 2.快速入门2.1.安装RabbitMQ2.1.1.单机部署(1).下载镜像方式…

Amazon Bedrock 上的新一代 Anthropic 模型 Claude 3

如您所知&#xff0c;Amazon Bedrock 是利用基础模型 (FM) 构建生成式 AI 解决方案的最简单的途径&#xff0c;其中包括使用 Anthropic 的先进模型 Claude。而如今&#xff0c;新一代 Claude 模型已经到来。到目前为止&#xff0c;我已经制作了 3 个单独视频来介绍 Claude 3 的…

图论练习5

Going Home Here 解题思路 模板 二分图最优匹配&#xff0c;前提是有完美匹配&#xff08;即存在一一配对&#xff09;左右集合分别有顶标&#xff0c;当时&#xff0c;为有效边&#xff0c;即选中初始对于左集合每个点&#xff0c;选择其连边中最优的&#xff0c;然后对于每…

Unity 给刚体一个力或速度

创建平面和小球&#xff0c;给力或给速度让其弹起 给小球挂载刚体&#xff08;Rigibdody&#xff09;和脚本 &#xff08;力是累计或者衰减的&#xff0c;直接给速度就是赋值&#xff0c;但如果速度就和力类似了&#xff09; using System.Collections; using System.Collect…

开发手札:unity2022+vscode1.87联合开发

不得不说&#xff0c;时间的力量是很强大的&#xff0c;同时熵增理论适用于任何地方。 在现在的公司干了五年多了&#xff0c;五年前配置的内网开发机&#xff0c;i7 870016g1t hddgtx1080已经卡爆了&#xff0c;特别是硬盘掉速严重&#xff0c;开机开软件没有一两分钟都…

代码随想录算法训练营第四十四天|309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费,总结

系列文章目录 代码随想录算法训练营第一天|数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 代码随想录算法训练营第二天|977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II 代码随想录算法训练营第三天|链表理论基础&#xff…

CVPR 2024 | Modular Blind Video Quality Assessment:模块化无参视频质量评估

无参视频质量评估 (Blind Video Quality Assessment&#xff0c;BVQA) 在评估和改善各种视频平台并服务用户的观看体验方面发挥着关键作用。当前基于深度学习的模型主要以下采样/局部块采样的形式分析视频内容&#xff0c;而忽视了实际空域分辨率和时域帧率对视频质量的影响&am…

前端处理接口直接返回的图片

有时候接口会直接返回图片而不是连接&#xff0c;前端需要处理后才能使用。 首先你可能需要设置responseType: blob’处理响应数据格式。 直接使用 将接口及参数动态拼接成img.src直接使用 <img src"http://test.com/api/img?size50x50" alt"">i…

【Java设计模式】十一、组合模式

文章目录 1、组合模式2、案例3、总结 1、组合模式 下面的文件系统&#xff0c;树形结构&#xff0c;有文件夹节点和文件节点&#xff08;有无儿子节点的区别&#xff09;&#xff0c;使用这两种节点也要做区分。 组合模式&#xff08;部分整体模式&#xff09;&#xff0c;就…

前端运算符比较与计算中的类型转换,运算规则

题目&#xff1a; 下面表达式的值分别都是什么&#xff08;类型转换&#xff09; 0 0 0 2 true 2 false false false false 0 false undefined false null null undefined\t\r\n 0JS中的原始类型有哪些 原始值类型就是 存储的都是值&#xff0c;没有函数可以调用的。…

解决ts报错:类型“entry”上不存在属性“$AppTools”

uniapp ts 项目&#xff0c;已经将AppTools挂在了vue的原型上&#xff0c;但是在vue页面使用时报错&#xff0c;如图&#xff1a; 解决&#xff1a; 在项目根目录下的tsconfig.json文件添加如下配置&#xff1a; "include": ["src/**/*"],这样报错就消失…

32单片机基础:输入捕获测频率

接线图如下图所示&#xff1a; 我们复制之前写过的代码6-3 PWM驱动LED呼吸灯 在PWM模块中&#xff0c;执行的逻辑是&#xff0c;初始化TIM2的通道1&#xff0c;产生一个PWM波形&#xff0c;输出引脚是PA0&#xff0c;通过SetCompare1的函数&#xff0c;可以调节CCR1寄存器的值…

算法相关计算

1 内存管理相关 1 .1 float 6.9 f 的内存计算方法 二进制小数的计算&#xff1a; &#xff08;1&#xff09;小数的二进制算法和整数的大致相反&#xff0c;就是不断的拿小数部分乘以2取积的整数部分&#xff0c;然后正序排列。比如求0.9的二进制&#xff1a; 0.9*21.8 取 1…

【网络】主机连接 TCP 三次握手

【网络】主机连接 TCP 三次握手 一、TCP连接3次握手二、TCP连接4次挥手三、为什么tcp要三次握手&#xff0c;两次行不四、为什么TCP挥手需要4次五、Netstat命令的连接状态包括:六、练习题 一、TCP连接3次握手 1、建立连接的时候是3次握手&#xff0c;客户端向服务器端发送SYN&…

微软亚太区AI智能应用创新业务负责人许豪,将出席“ISIG-AIGC技术与应用发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;AIGC开放社区、RPA中国、LowCode低码时代&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索A…

手写分布式配置中心(四)增加实时刷新功能(长轮询)

上一篇文章中实现了短轮询&#xff0c;不过短轮询的弊端也很明显&#xff0c;如果请求的频率较高&#xff0c;那么就会导致服务端压力大&#xff08;并发高&#xff09;&#xff1b;如果请求的频率放低&#xff0c;那么客户端感知变更的及时性就会降低。所以我们来看另一种轮询…