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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

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

更快更强,Claude 3全面超越GPT4,能归纳15万单词

ChatGPT4和Gemini Ultra被Claude 3 AI模型超越了&#xff1f; 3月4日周一&#xff0c;人工智能公司Anthropic推出了Claude 3系列AI模型和新型聊天机器人&#xff0c;其中包括Opus、Sonnet和Haiku三种模型&#xff0c;该公司声称&#xff0c;这是迄今为止它们开发的最快速、最强…

Spark(2)-基础tranform算子(一)

一、算子列表 编号名称1map算子2flatMap算子3filter算子4mapPartitions算子5mapPartitionsWithIndex算子6keys算子7values算子8mapValues算子9flatMaplValues算子10union算子11reducedByKey算子12combineByKey算子13groupByKey算子14foldByKey算子15aggregateByKey算子16Shuff…

【DPDK】基于dpdk实现用户态UDP网络协议栈

文章目录 一.背景及导言二.协议栈架构设计1. 数据包接收和发送引擎2. 协议解析3. 数据包处理逻辑 三.网络函数编写1.socket2.bind3.recvfrom4.sendto5.close 四.总结 一.背景及导言 在当今数字化的世界中&#xff0c;网络通信的高性能和低延迟对于许多应用至关重要。而用户态网…

react native封装ScrollView,实现(滑到底部)和(滑到顶部+手指继续向下滑)时拉取新数据

里面的tw是在react native中使用tailwind的第三方库 只求读者把样式看个大概&#xff0c;主要还是功能的实现 ScrollView的官方文档如下 https://reactnative.cn/docs/scrollview import tw from twrnc import { View, Text, ScrollView, RefreshControl } from react-native …

安卓部分手机使用webview加载链接后白屏(Android低版本会出现的问题)

前言 大爷&#xff1a;小伙我这手机怎么打开你们呢这个是白屏什么都不显示。 大娘&#xff1a;小伙我这也是打开你们呢这功能&#xff0c;就是一个白屏什么也没有&#xff0c;你们呢的应用不会有病毒吧。 小伙&#xff1a;我的手机也正常&#xff1b; 同事&#xff1a;我的也正…

linux安装ngnix

一、将nginx-1.20.1.tar.gz上传至linux服务器目录下 二、将nginx安装包解压到/usr/local目录下 tar -zxvf /home/local/nginx-1.20.1.tar.gz -C /usr/local/三、预先安装依赖 yum -y install pcre-devel yum -y install openssl openssl-devel yum -y install gcc gcc-c auto…

《辐射4》是一款什么样的游戏 怎样在mac电脑上玩到《辐射4》辐射4攻略 辐射4开局加点 怎么在Mac电脑玩Steam游戏

辐射4&#xff08;Fallout 4&#xff09;是由Bethesda开发的一款动作角色扮演类游戏&#xff0c;为《辐射》系列游戏作品的第四代&#xff0c;于2015年11月10日发行。游戏叙述了主角一家在核爆当天&#xff08;2077年10月23日&#xff09;&#xff0c;被Vault-Tec&#xff08;避…

统信root重置密码

统信root重置密码 sudo passwd root

Redis(十七)分布式锁

文章目录 面试题分布式锁锁的种类分布式锁需要具备的条件和刚需分布式锁 案例nginx分布式微服务部署&#xff0c;单机锁问题分布式锁注意事项lock/unlocklua脚本自研版的redis分布式锁搞定lua脚本 可重入锁可重入锁种类可重入锁hset实现&#xff0c;对比setnx&#xff08;重要&…

ArrayList的扩容机制

ArrayList 的底层操作机制源码分析 ArrayList中维护一个Object类型的数组elementData transient Object[] elementData; //transient表示瞬间 短暂的&#xff0c;表示该属性不会被序列化当创建ArrayList对象时&#xff0c;如果使用的是无参构造器&#xff0c;则初始elementDa…

【QT】自定义控件的示例

自定义控件&#xff08;很重要&#xff09; 什么是自定义控件&#xff1f; 顾名思义就是创建一个窗口&#xff0c;放入多个控件&#xff0c;拼接起来&#xff0c;一起使用。 为什么需要它&#xff1f; 需求&#xff0c;假设有100个窗口&#xff0c;那如果有两个控件同时被使…