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的工作流程
传统写代码的问题:
jar包反复存储,占用空间- 手动管理,容易混乱
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

- 在Settings中搜索Maven
Maven的使用
Maven工程的要求:
-
在项目的根路径下,有一个
pom.xml文件 -
工程目录是如下的结构:
-
ProjectName
- src(src里面不直接写包)
- main
- java(写代码的地方,指源代码的路径)
- resources(配置文件地方,指配置文件的路径)
- test
- java(单元测试代码,指测试类的存放路径)
- resources(单元测试的配置文件,指测试类需要用到的文件)
- main
- src(src里面不直接写包)
-
pom.xml(在项目的根目录下)
eg:

怎么把一个项目转换成maven项目:
- 在
src里面建几个包src/main/java- mark as sources
src/main/resources- mark as resources
src/test/javasrc/test/resources
- 创建一个
pom.xml - 对着
pom.xml点击add as maven project
怎么通过idea创建一个Maven项目:

- GroupId:指公司名、组织名
- eg:
com.coo1heisenberg
- eg:
- ArtifactId:项目名
- eg:
test_maven
- eg:
module和project的关系
-
project
一个项目是IDEA开发工作的顶级组织单位。在其完成的形式中,一个项目可能代表一个完整的软件解决方案
项目是以下内容的集合:- 工作成果:源代码、脚本、配置文件、文档、包等。
- 用于开发、编译、运行和测试代码的SDK和库。
- 在项目上下文中表示你的工作偏好设置
- 一个项目有一个或者多个模块作为其部件
-
module
- 模块是项目的一部分,你可以独立的编译、运行、测试和调试。
- 模块是一种在维护公共项目配置的同事降低大型项目复杂性的方法。
- 模块可以重复使用:如果需要,可以再多个项目中包含一个模块。
如何用Maven导包
- 打开https://mvnrepository.com/。搜索要用的包,找到指定的版本
- 拷贝坐标
groupId、artifactId、version叫做坐标,可以唯一确定一个包
- 只需要在
pom.xml文件中声明jar包的坐标就可以了,添加了之后点击import changes
eg:

如何用Maven进行项目构建
指令介绍
项目构建其实就是 Maven可以帮助我们去检查项目,编译项目,测试项目,打包项目,安装项目,部署项目

clean指令
Maven指令的执行依赖于一些jar包
- 方式一:通过
cmd执行

- 方式二:通过idea自带的命令行执行
- 得以管理员身份打开idea,否则识别不出
mvn命令

- 得以管理员身份打开idea,否则识别不出
- 方式三:直接使用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包复制到本地仓库中
- 需要掌握根据
groupId、artifactId、version找本地的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里,同时依赖了两个版本。是以最后一个指定的为准
- 是指这同一个项目的不同的版本的jar包,声明优先仅仅指的是第二级后面的依赖,谁先在
- 就近原则
- 在进行依赖传递的时候,谁传递的次数比较少,以谁为准
- 就近原则的优先级高于声明优先原则
- 手动排除
- 手动去排除传递过来的依赖
- 声明优先原则
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开发项目
路径问题的建议:
- 不要用绝对路径
- 最好使用类加载器的方式去读文件
切换成Maven之后,开发模式的变化:
- 之前需要手动下
jar包,拷贝,添加到库文件;现在只用引入坐标 - 之前读配置文件,使用
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);
}
相关文章:
01_Maven
文章目录 Maven安装MavenMaven的工作流程配置MavenMaven的使用module和project的关系如何用Maven导包 如何用Maven进行项目构建指令介绍clean指令compile指令package指令install指令 Maven的依赖管理如何导包scope作用域依赖传递依赖冲突 使用Maven开发项目Junit如何使用Junit …...
C语言题目练习
目录 前言 1、转置矩阵 1.1 题目 描述 输入描述: 输出描述: 1.2解题 分析: 程序: 2、KiKi判断上三角矩阵 2.1 题目 描述 输入描述: 输出描述: 2.2 解题 分析: 程序: 3、…...
物联网安全|TrustAsia助力PSWG应对全球物联网产品安全合规挑战
万物互联时代,随着物联网连接数快速增长,物联网设备的潜在网络安全隐患也日益增长,可能导致设备故障、数据被盗、篡改、隐私泄露等问题的发生,甚至成为网络攻击的跳板,对互联网基础设施构成严重威胁。 我们看到&#…...
基于单片机的医院输液系统设计
目 录 摘 要 Ⅰ Abstract Ⅱ 引 言 1 1系统方案设计与论证 3 1.1系统硬件结构总体设计方案 3 1.2点滴速度测量电路方案的选择与论证 3 1.3液面检测电路方案的选择与论证 4 1.4通过电机控制滴速电路的方案与论证 4 1.5显示器接口电路方案选择与论证 5 1.6键盘接口电路方案选择与…...
安卓简单登录
注意 有的朋友不知道登录咋写,这里我就简单给出相应代码,用的本地存储,没用网络请求,有需要可以替换成想要的,废话不多上代码 登录 import androidx.appcompat.app.AppCompatActivity;import android.content.Context…...
【计算机网络】DNS/ICMP协议/NAT技术
文章目录 一、DNS(Domain Name System)1.DNS背景2.域名3.浏览器中输入url后,发生的事情 二、ICMP协议1.什么是ICMP协议2.ICM功能3.ICMP的报文格式4.ping命令5.traceroute命令 三、NAT技术1.NAT技术背景2.NAT IP转换过程3.NAPT4.NAT技术的缺陷5.NAT和代理服务器 四、TCP/IP五层模…...
2403C++,C++20协程通道
原文 通道是一个可用来连接协程,实现不同协程间通信的并发安全队列. Test fun test know channel() runBlocking<Unit> {val channel Channel<Int>()//生产者val producer GlobalScope.launch {var i 0while (true) {delay(1000)channel.send(i)println("…...
C语言从入门到实战——预处理详解
预处理详解 前言一、预定义符号1.1 __FILE__1.2__LINE__1.3 __DATE__1.4__TIME__1.5__STDC__ 二、 #define定义常量三、 #define定义宏四、 带有副作用的宏参数五、 宏替换的规则六、宏函数的对比七、 #和##7.1 #运算符7.2 ##运算符 八、 命名约定九、 #undef十、命令行定义十一…...
【LabVIEW FPGA】CIC滤波器
一、CIC滤波器应用概述 在通信数字信号上下变频时,经常会用到对数字信号的升采样和降采样,即通过CIC数字速率器实现变采样率。 二、滤波器IP 首先设置滤波器基本参数(filter specification) 滤波器类型(Filter Type…...
砝码称重 蓝桥杯
在C中,fabs()和abs()都用于计算数字的绝对值,但它们之间有一些区别。 fabs(double x):计算浮点数x的绝对值,返回一个double类型的结果。 abs(int x):计算整数x的绝对值,返回一个int类型的结果。 数组的默…...
AmzTrends x TiDB Serverless:通过云原生改造实现全局成本降低 80%
本文介绍了厦门笛卡尔数据(AmzTrends)在面临数据存储挑战时,选择将其数据分析服务迁移到 TiDB Serverless 的思路和实践。通过全托管的数据库服务,AmzTrends 实现了全局成本降低 80% 的效果,同时也充分展示了 TiDB Ser…...
[最佳实践] Windows上构建一个和Linux类似的Terminal
感谢大佬批评指正,现已更新 preview Target:致力打造最赏心悦目Window下的终端,同时能够很接近Linux的使用习惯 key word:windows终端美化 windows terminal windows powershell 类似Linux下的Window终端 Window也能用ll windows…...
租赁系统|手机租赁软件|租赁系统功能开发
当如今的生活用品越来越多、交流更加便捷时,人们的消费需求也变得越来越丰富。不可避免地,我们会遇到这样一种情况:需要新的手机,但资金有限。此时,手机租赁小程序呼之欲出。这种创意不仅使我们能够充分利用各类闲置物…...
【设计模式 04】建造者模式
如果要构建的对象很复杂,那么可以将整个构建过程拆分成多个步骤,并为每一个步骤定义一个抽象的接口。并添加一个指导者用来控制构建产品的顺序和步骤。 Java实现: // 产品类 class Product {private String part1;private String part2;pub…...
Python使用错误总结
【1】cannot import name ‘ParameterSource’ from ‘click.core’ 其根本原因在于是black模块,其模块版本可能过时,升级black模块版本即可: pip install black --upgrade【2】partially initialized module ‘charset_normalizer’ has n…...
【Java EE初阶三十】JVM的简单学习
1. JVM 内存区域划分 一个运行起来的 Java 进程,就是一个 JVM 虚拟机,需要从操作系统申请一大块内存,就会把这个内存,划分成不同的区域,每个区域都有不同的作用. JVM 申请了一大块内存之后,也会划分成不同的内…...
thinkphp5水平分割表partition,以及查询操作
前言 先交代下背景,在一个项目中,有一个数据表有水平分表的需求。当时想找到一种方法,把对数据库的操作,写到一个模型里,通过去换模型属性中的table来达到代码不变操作的数据表变化的效果。 我们都知道,模型要想关联数据表的话&a…...
docker部署aria2-pro
前言 我平时有一些下载视频和一些资源文件的需求,有时候需要离线下载,也要速度比较快的方式 之前我是用家里的玩客云绝育之后不再写盘当下载机用的,但是限制很多 我发现了aria2 这个下载器非常适合我,而有个大佬又在原来的基础…...
vue中Mixins
使用 Mixins 的主要优点包括: 代码复用: 可以将常用的逻辑封装在 Mixin 中,然后在多个组件中重复使用。逻辑分离: 将不同功能的代码分开管理,使代码更加清晰和易于维护。灵活性: Mixins 允许你在组件中引入多个 Mixin,并且可以根…...
linux常用指令(定期更新)
linux常用指令 1.页相关页大小 2.系统参数3.启动参数4.网络参数查询网卡所属numa节点信息网络测速相关iperf测试sar监控网卡流量查看网卡txqueuelen和mtu抓包tcpdump 网络数据收发状态snmp协议栈netstat -i所有网口TX-OK、RX-OKnetstat-s查看各个协议的收发数据ethtool -S单个网…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

