Maven的安装配置以及使用入门-----
Maven的安装\配置以及使用
- 配置 maven的 环境变量
- maven项目目录----->>>
- maven的使用
- 包的依赖关系
- complie
- test
- runtime
- provided
- system
- import
- maven本地仓库的配置
- maven远程仓库的配置
- 仓库优先级的问题---->>>
- 配置maven项目编译运行环境配置
- 在Idea中创建maven工程
- maven中pom.xml的配置
- 添加自定义包的依赖
- 依赖的特性与原则
- 依赖的传递性
- 第一原则----依赖的最短路径原则
- 第二原则----第一原则失效时
- 继承与聚合
- 【1】继承关系:
- 【2】聚合关系
- 插件的引入
- 编译器插件
- 资源拷贝插件
- tomcat插件
Maven 的主要目标是让开发人员在最短的时间内了解开发工作的所有状态。为了实现这一目标,马文涉及几个令人关切的领域:
使构建过程变得简单
提供统一的构建系统
提供高质量的项目信息
鼓励更好的发展做法
去官网下载适合的maven
这里用到的是3.8.3版本;
下载之后解压,将文件放到一个合适的目录,我是放在了
之后开始配置maven,maven跟java一样,都需要有一个path的环境变量----
注意---->>在配置maven之前一定要配置好java环境变量;
检查一下java环境变量----->>>
在配置maven时,你可以可建一个MAVEN_HOME, path中引用MAVEN_HOME的方式也可以
配置 maven的 环境变量
在path环境变量下添加maven配置,目标位maven的bin目录
配置完之后检查配配置是否成功-----
在控制输入 mvn -v,如果有反应,说明配置成功
虽然配置成功了,但是由于是第一次配置,还需要一些其他依赖文件,在控制台输入–
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
注意,这会在你本地用户文件夹下创建一个maven项目,找起来比较麻烦,所以建议自己指定一个文件夹来存放maven项目,
你也可以模仿我这么操做----
控制台进入D:\Program Files\mavenProjects文件夹,然后执行上方命令
这个操做会从官网下载一些依赖以及一些配置文件,执行成功会有 BUILD SUCCESS提示;
同时检查
maven项目目录----->>>
出现my-app说明操做成功,至此maven安装与配置就结束了;
生成目标创建了my-app名称目录。。
cd my-app
根据此目录,您将注意到以下标准项目结构。
my-app
|-- pom.xml-- src |-- main |
– java
| -- com |
– mycompany
| -- app |
– App.java-- test
– java-- com
– mycompany-- app
– AppTest.java
目录包含项目源代码,目录包含测试源,文件是项目的项目对象模型(POM)
最后说一下如何让卸载maven,由于不是直接安装的maven,所以
卸载起来很简单------>>
1,环境变量中删除maven配置,
2,删除maven所在文件
3清理maven仓库-----即项目存放的地方
maven中一些常用的命令
构建项目
mvn package
这需要在pom.xml所在文件夹下执行,要不然会提示找不到pom.xml文件错误;
打包好之后控制台会提示----
这是我们打包好的jar文件位置所在D:\mavenProjects\my-app\target\my-app-1.0-SNAPSHOT.jar
用以下命令测试新编译和打包的 JAR:
java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
mvn clean dependency:copy-dependencies package
此命令将清理项目、复制依赖项并打包项目(当然,执行所有阶段到包)。
生成站点
mvn site
maven的使用
要了解maven是什么,首先得分析一下我们传统写java项目的时候 ,我们经常会导入一些依赖包,比如jdbc驱动,jstl标签库,log4j等等,将他们放在classpath中,虽然这些工作难度不大,但是比较繁琐;
maven针对这个问题专门位java项目的开发提供了一套管理和构建工具;
提供了一套标准化的项目结构;
提供了一套标准化的构建流程(编译,测试,打包,发布……);
提供了一套依赖管理机制。
Maven项目结构
一个使用Maven管理的普通的Java项目,它的目录结构默认如下:
a-maven-project —项目名
├── pom.xml – 项目描述文件
├── src —项目根目录
│ ├── main
│ │ ├── java —java源码存放处
│ │ └── resources —资源文件
│ └── test —测试项目的目录
│ ├── java—java源码存放处
│ └── resources —资源文件
└── target 编译,打包好的文件存放处
pom.xml文件分析
groupId类似于Java的包名,通常是公司或组织名称,artifactId类似于Java的类名,通常是项目名称,再加上version,一个Maven工程就是由groupId,artifactId和version作为唯一标识。我们在引用其他第三方库的时候,也是通过这3个变量确定。
通过上述3个变量,即可唯一确定某个jar包。Maven通过对jar包进行PGP签名确保任何一个jar包一经发布就无法修改。修改已发布jar包的唯一方法是发布一个新版本。
因此,某个jar包一旦被Maven下载过,即可永久地安全缓存在本地。
以上是maven本地加载的一些核心包名
,如果要使用的包,那么需要配置依赖-----
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
使用声明一个依赖后,Maven就会自动下载这个依赖包并把它放到classpath中。
那maven是从哪里下载我们需要的依赖包呢?
首先maven维护了一个仓库,基本上所有的依赖包都会上传到这个仓库,这个就不需要我们关心了;
那有一个小细节,我们怎么知道对应的 以及 呢?
我们可以通过maven仓库 来搜索关键字 搜索得到上面三个信息—
Maven Central Repository Search
从maven的官方仓库下载一些依赖包会比较慢,一般是使用ALIYUN的仓库替代官方仓库
使用Maven镜像仓库需要一个配置,在用户主目录下进入.m2目录,创建一个settings.xml配置文件,内容如下:
<settings>
<mirrors>
<mirror>
<id>aliyun</id>
<name>aliyun</name>
<mirrorOf>central</mirrorOf>
<!-- 国内推荐阿里云的Maven镜像 -->
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
</mirrors>
</settings>
上述三个元素指向一个项目的特定版本,让 Maven 知道当在其软件生命周期中,我们正在处理哪个项目;
配置好后接下来就是maven的一些基础知识
包的依赖关系
在java中,maven解决的是有关包的依赖关系,
在maven中定义了几种依赖关系---->>>
complie 这说明编译时需要用到该jar包 例如 commons-logging
test 在测试环境下 需要用到该jar包 例如junit
runtime 编译时不需要,但是运行时需要用到 例如 jdbc驱动
provided 编译时需要用到,但运行时由某个JDK或者某个服务器提供 例如 某个servlet
complie
complie是最基本的也最常用 ,maven会将这种类型的依赖直接放入classpath,如果不声明则scope默认为complie
test
测试时会用到,打包时不会放到项目中,比如junit的jar包
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
runtime
运行时才会依赖的jar包,比如数据库连接
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
<scope>runtime</scope>
</dependency>
provided
编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍(如:servlet-api)
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
system
一些本地包可以这么引入
<dependency>
<!--注册自定义jar包-->
<groupId>com.gavin.test</groupId>
<artifactId>Maven_gavin</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>com.gavin.demo</systemPath><!--url -->
</dependency>
import
import范围只适用于pom文件中的部分。表明指定的POM必须使用部分的依赖。
注意:import只能用在dependencyManagement的scope里。
import用于中,主要用于对版本的管理
指定一个maven项目中的pom.xml为父类pom,
如果子类pom写上版本号,则会按照子类中的版本号走;
但是父类pom可以强制子类pom使用其指定的版本
maven会对开发版的项目中的一些依赖每次都会重新下载依赖,在maven中以SNAPSHOT结尾的版本号会被视为开发版本,这种SNAPSHOT版本只能用于内部私有的Maven repo,公开发布的版本不允许出现SNAPSHOT
在配置好maven环境时候,下载的资源中已经为我们准备好一个项目—myapp,我们可以通过这个来测试一下一些常用命令—
mvn -v ----查看maven版本以及JDK和系统版本
mvn package -----打包项目
java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App ---- 运行项目
运行项目的命令解析—
java -cp
target ----项目存放相对地址 ,也可以写项目绝对地址不过要把证地址准确性
my-app-1.0-SNAPSHOT.jar —jar包名
com.mycompany.app----包名即 pom.xml中配置的groupId
.POM 型号版本(始终为 4.0.0)。
.项目所属的团体或组织。通常表示为倒置域名。
.要给项目图书馆文物起的名字(例如,其 JAR 或 WAR 文件的名称)。
.正在构建的项目版本。
- 应如何包装项目。JAR 文件包装的默认"jar"。使用"war"进行war文件包装。
实践出真知…加油
maven中各个文件夹的含义–见名知意
maven本地仓库的配置
将maven全局配置的文件按复制到本地仓库文件夹下
在setings.xml文件夹下打开注释—
maven远程仓库的配置
“远程”仓库可能是你的公司拥有的建立在文件或HTTP服务器上的内部仓库(不是Apache的那个*仓库,而是你们公司的私服,你们自己在局域网搭建的maven仓库),用来在开发团队间共享私有构件和管理发布的。
由于maven服务器在国外,国内下载一些依赖的时候速度会比较慢,这时候可以设置以下远程仓库为*仓库的镜像仓库
国内一般推荐阿里云的镜像仓库
可以指定多个镜像仓库,
仓库优先级的问题---->>>
项目在查找依赖的时候,先从本地仓库查找,找不大的话,如果配置了镜像仓库则从镜像仓库找,再找不到就从*仓库找;
配置maven项目编译运行环境配置
当我们电脑中有很多个JDK的时候,我们需要指定一个maven的运行和编译环境
小结---->>
一般我们在配置maven环境时只需要配置用户环境,全局环境一般不做修改;
同时我们只需要在用户配置中添加本地仓库,远程仓库以及JDK版本信息就可以了;
在Idea中创建maven工程
现阶段不选择模板而是建一个标准的maven工程
maven标准目录结构—
目录名字不可以随便改,因为maven进行编译或者jar包生成操作的时候,是根据这个目录结构来找的,你若轻易动,那么久找不到了。
除此之外还有一些其他文件夹,由于没有打包项目,还没有展示
下面打包项目-----
打包结束后会生成一个target文件夹,用于存放项目打包后的文件;
这个跟我们在控制台上操做是一样的;
1,控制台进入pom.xml文件所在文件夹,
2,执行打包命令 mvn package
3,打包结束后运行---- java -cp 命令 来测试打包后的文件是否可以运行
maven中pom.xml的配置
基本的配置----->>
上面已经提到了
接下来需要实际操做—配置一些依赖
先做几个例子
配置依赖时爆红了,原因是我们没有更新依赖----
更新后就会下载依赖如果不想每次手动同步,则需要设置一下让其自动同步------>>
Maven警告解决:Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platfor
在pom.xml中添加配置---->>>
<properties>
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
</properties>
添加自定义包的依赖
准备环境----->
一个自定义jar包
就用下面这个吧
依赖的特性与原则
依赖的传递性
新建一个maven 项目,
添加依赖------
在添加依赖的时候,会将依赖的依赖也一同导入到项目中,即依赖的传递性;
导入的一些内容可以直接用;
依赖关系----->>
第一原则----依赖的最短路径原则
“最短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。
例如,假设A、B、C之间的依赖关系是A->B->C->D(2.0) 和A->E->(D1.0),那么D(1.0)会被使用,因为A通过E到D的路径更短。
解析----
假如 A依赖B,B依赖C,C依赖D,D的版本为2.0版本
同时A又依赖E,E依赖D,D的版本为1.0版本,则 D的版本最终被确认为1.0版本;
例如创建Spring项目时引入context依赖会自动引入相关依赖
第二原则----第一原则失效时
当第一原则失效时,即路径长短一致时,该怎么确定版本呢?
可以在依赖的时候做排除动作
不用关注版本号,因为通过groupId 和artifactId 就能定位到jar包
继承与聚合
【1】继承关系:
如果A工程继承B工程,则代表A工程默认依赖B工程依赖的所有资源,且可以应用B工程中定义的所有资源信息。
被继承的工程(B工程)只能是POM工程。
注意:在父项目中放在<dependencyManagement>中的内容时不被子项目继承,不可以直接使用
放在<dependencyManagement>中的内容主要目的是进行版本管理。里面的内容在子项目中依赖时坐标只需要填写
和即可。(注意:如果子项目不希望使用父项目的版本,可以明确配置version)。
父工程是一个POM工程:
【2】聚合关系
当我们开发的工程拥有2个以上模块的时候,每个模块都是一个独立的功能集合。比如某大学系统中拥有搜索平台,学习平台,考试平台等。开发的时候每个平台都可以独立编译,测试,运行。这个时候我们就需要一个聚合工程。
在创建聚合工程的过程中,总的工程必须是一个POM工程(Maven Project)(聚合项目必须是一个pom类型的项目,jar项目war项目是没有办法做聚合工程的),各子模块可以是任意类型模块(Maven Module)。
聚合的前提:继承。
聚合包含了继承的特性。
聚合时多个项目的本质还是一个项目。这些项目被一个大的父项目包含。且这时父项目类型为pom类型。同时在父项目的pom.xml中出现表示包含的所有子模块。
聚合后生成的jar包目录结构----
插件的引入
编译器插件
当我们在一个工程中不想使用本地的jdk进行编辑,那么可以切换一下JDK的版本
资源拷贝插件
打包时只有放在resource的配置文件才会被打包
那如果想要打包非resource文件下的配置文件,那么就需要配置资源拷贝插件
<!-- 引入资源复制插件-->
<resources>
<resource>
<directory>src/main/java/com/gavin/app</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
配置好以后,相应位置下的配置文件都会被打包了:
tomcat插件
tomcat插件的引入需要在一个webapp工程中
新建一个maven工程,模板为webApp
之后在pom.xml中引入tomcat插件
在build下plugins plugin
<build>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 配置Tomcat监听端口 -->
<port>8080</port>
<!-- 配置项目的访问路径(Application Context) -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
怎么证明我们配置好了呢?
由于tomcat插件不会自动运行,我们需要手动开启
开启方式------>>>
之后访问index.jsp
mvn 常用命令
install
本地安装, 包含编译,打包,安装到本地仓库
编译 - javac
打包 - jar, 将java代码打包为jar文件
安装到本地仓库 - 将打包的jar文件,保存到本地仓库目录中。
❀ clean
清除已编译信息。
删除工程中的target目录。
compile
只编译。 javac命令
❀ package
打包。 包含编译,打包两个功能。
install和package的区别:
package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库
推荐阅读
-
安装 Prometheus 和 Grafana,通过简单配置和使用 PromQL 查询语言以及基于 Pushgateway 的 Prometheus 数据收集,实现监控数据的可视化。
-
CentOS 7安装ipvsadm和Nginx,并进行基本配置与测试 下面是重写后的段落: 1. 关闭防火墙 2. 在浏览器中输入服务器IP地址并访问 3. 修改网页内容以区分不同的服务器 4. 配置lvs/nat,使用自定义的脚本 5. 检查ipvsadm设置的规则 6. 关闭防火墙 7. 测试LVS效果。
-
免费体验:Oracle Database Express Edition 11g安装与使用指南,以及SOD框架对Oracle Code First的支持
-
如何在Win10上使用Charles进行下载、安装、证书设置以及与雷电模拟器或浏览器的抓包测试
-
超简单!TortoiseGit小乌龟的安装、配置和使用指南
-
Intellij IDEA 插件开发入门详解 - 如何添加 Application 和 Project Component,并创建 Action? 在本文中,我们将详细介绍如何在 IntelliJ IDEA 中添加 Application 和 Project Component,并且通过这些组件来创建一个简单的 Action。 首先,我们将在 src 目录上使用 Alt+Insert 快捷键打开 New 对话框,然后从中选择 Application Component 并输入名称如 MyComponent。接下来,我们在 MyComponent 类中添加一个 sayHello 方法并编写相关逻辑。 然后,我们需要为我们的插件添加一个 Action,使用户可以通过菜单或其它方式访问它。为此,我们将创建一个新的类 SayHelloAction 继承自 AnAction 类,并在 actionPerformed 方法中获取 Application 和 MyComponent 对象,最后调用 MyComponent 的 sayHello 方法。 最后,我们需要为我们的插件配置相关的文件以确保它可以正常运行。在本文中,我们将详细介绍如何进行这些配置。
-
第三步:使用UltraiSO创建启动u盘并制作winPE镜像,以及硬盘安装系统的步骤
-
Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】
-
【2022新手指南】Java编程进阶之路 - 六、技术架构篇 ### MySQL索引底层解析与优化实战 - 你会讲解MySQL索引的数据结构吗?性能调优技巧知多少? - Redis深度揭秘:你知道多少?从基础到哨兵、主从复制全梳理 - Redis持久化及哨兵模式详解,还有集群搭建和Leader选举黑箱打开 - Zookeeper是个啥?特性和应用场景大公开 - ZooKeeper集群搭建攻略及 Leader选举、读写一致性、共享锁实现细节 - 探究ZooKeeper中的Leader选举机制及其在分布式环境中的作用 - Zab协议深入剖析:原理、功能与在Zookeeper中的核心地位 - RabbitMQ全方位解读:工作模式、消费限流、可靠投递与配置策略 - 设计者视角:RabbitMQ过期时间、死信队列与延时队列实践指南 - RocketMQ特性和应用场景揭示:理解其精髓与差异化优势 - Kafka详细介绍:特性及广泛应用于实时数据处理的场景解析 - ElasticSearch实力揭秘:特性概述与作为搜索引擎的广泛应用 - MongoDB认知升级:非关系型数据库的优势阐述,安装与使用实战教学 - BIO/NIO/AIO网络模型对比:掌握它们的区别与在网络编程中的实际应用 - Netty带你飞:理解其超快速度背后的秘密,包括线程模型分析 - 网络通信黑科技:Netty编解码原理与常用编解码器的应用,Protostuff实战演示 - 解密Netty粘包与拆包现象,怎样有效应对这一常见问题 - 自定义Netty心跳检测机制,轻松调整检测间隔时间的艺术 - Dubbo轻骑兵介绍:核心特性概览,服务降级实战与其实现益处 - Dubbo三大神器解读:本地存根与本地伪装的实战运用与优势呈现 ----------------------- 七、结语与回顾
-
如何轻松使用JMeter进行HTTP接口测试 - 一步步教你设置线程组、 cookie、默认值与Sampler,加上响应断言和监听器,打造基础测试案例。针对复杂情况,将子系统和流程测试分类组织,确保数据一致性。同时,别忘了感谢阅读,给新手提供实战学习资源与全套测试指南,助你轻松踏上自动化测试之路! - 在"测试计划"点击右键,添加"线程组"并设定初始"线程数"和"循环次数" - 配置"HTTP Cookie管理器"与"Http请求默认值",输入目标系统信息,如域名、端口、协议等,让所有相关Sampler共享这些默认设置 - 在线程组内增加"HTTP Request"的Sampler,并填入接口详情,比如路径、请求方法及参数 - 添加"响应断言"检查接口返回结果,通过正则表达式验证预期结果 - 安装监听器,实时查看测试执行状况 - 如需处理流程性接口,请依次添加多个相关Sampler,关联前后请求间的上下文数据 特别提示:为了帮助大家避免学习中的曲折,我们准备了详尽的视频和文档资料库,无论你是软件测试的新手还是老司机,都能从中找到所需的全方位支持。只需点击下方链接加入我们的学习交流社群,就能立刻获取这份珍贵的学习宝藏!再次感谢您的耐心阅读,愿它成为您前行路上的一大助力!