当前位置: 首页 > news >正文

我记不住的那些maven内容

背景: 之前使用maven都是基于IDE并且对maven本身也很少究其过程和原理,当出现问题也不知道如何解决,后续想使用命令行来进行操作,并通过文档记录一下学习的内容加深理解以防止忘记。

一、简要介绍

maven是通过插件来增强功能,而它本身有其生命周期,而生命周期与插件的目标进行了绑定,当我们执行某个生命周期时候内部就是在执行某个插件的目标。

例如下面,你可以使用生命周期来执行,也可以使用插件:目标来执行。

$ mvn compile                             // 通过使用 生命周期 进行操作

 它会调用 maven-resources-plugin:2.6:resources和maven-compiler-plugin:3.1:compile这两个插件来完成编译

$ mvn archetype:generate          // 通过插件:目标来执行

 插件目录为: Maven – Available Plugins

二、经常使用的插件

第一个是

The Archetype Plugin : 用于从一个archetype模板中生成一个项目骨架,一般都会选择 quickstart archetype做为模板进行生成,如下图所示:

交互式生成一个项目骨架:

// 表示我们要执行 archetype插件的 generate目标(goal)
$ mvn archetype:generate

 同时也可以输入更多的参数:

$ mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=1.0-SNAPSHOT

最后进行打包运行:

$ mvn package
$ java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App

这样就可以输出 Hello World了。

第二个是

Maven Dependency Plugin 用于分析项目的依赖关系

mvn dependency:list   列出项目最终的依赖列表

mvn dependency:tree  列出项目的依赖树

第三个是

Maven Help Plugin获取项目上的各种工作环境等信息

mvn help:system  列出系统属性和环境变量

mvn help:effective-pom  显示有效的pom文件

mvn help:effective-settings​​​​​​ 显示有效的settings文件

第四个是

Maven Assembly Plugin 将项目的所有文件,包括依赖,模块,网页文件等。

mvn assembly:single

三、将普通maven项目设置为可执行Jar

有好几种方式可以让一个普通的maven工程转变为可执行Jar,我一般使用其中的两种方法。

1. 基于maven-dependency-plugin + maven-jar-plugin

dependency插件用于将项目的各种依赖包复制到指定路径下

jar插件用于将项目进行打包,需要设置主类和classpath前缀

优点:在于你的依赖和你的程序是分离的,不是一个jar包,你的依赖在target/libs下,你的程序jar包在target目录下 

缺点: jar的运行严格依赖于libs的,删除libs你的程序将无法执行

将下面build配置 粘贴到你的pom.xml文件中

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy-dependencies</id><phase>prepare-package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/libs</outputDirectory></configuration></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>libs/</classpathPrefix><mainClass>com.mycompany.app.App</mainClass></manifest></archive></configuration></plugin></plugins>
</build>

再执行打包,运行jar即可,如下所示:

$ mvn clean package$ java -jar target/my-app-1.0-SNAPSHOT.jar
Hello World

2. 基于maven-assembly-plugin

assembly插件用于将项目的各种依赖包、模块、网络文档等文件进行打包,也用于构建一个可执行jar。 它会生成两个jar,一个是单独的jar,另一个是包括了依赖的jar

优点:所有依赖都被打包到一个文件中

缺点:没有重新定位class的支持

将下面的build配置复制粘贴到你的pom.xml中

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><executions><execution><phase>package</phase><goals><goal>single</goal></goals><configuration><archive><manifest><mainClass>com.mycompany.app.App</mainClass></manifest></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration></execution></executions></plugin></plugins>
</build>

再执行打包,运行jar即可,如下所示:

$ mvn clean packagejava -jar target/my-app-1.0-SNAPSHOT-jar-with-dependencies.jar
Hello World!

四、使用maven创建springboot应用

请大家注意在cmd中无法直接使用archetype模板创建springboot应用但是 springboot有一种SpringBoot CLI是可以的但是我没有使用过,所以这种SpringBoot CLI这种不进行展开

那如何快速的创建基于maven的一个springboot的应用呢?

第一:先使用cmd来创建一个普通的maven项目

           可以使用 $ mvn archetype:generate 进入交互式命令行,输入各项配置

第二:在新建的项目中,添加springboot的依赖

            例如我们添加 spring-boot-starter-parent父项目和 spring-boot-starter-web依赖,不用添加任意插件,如下图所示:

<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.mycompany.app</groupId><artifactId>my-app</artifactId><packaging>jar</packaging><version>1.0-SNAPSHOT</version><name>my-app</name><url>http://maven.apache.org</url><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.5.RELEASE</version></parent><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins></plugins></build>
</project>

第三: 修改代码main方法,有原来的maven的main方法修改为springboot的main方法,都是Hello world程序。

package com.mycompany.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/*** Hello world!**/
@RestController
@SpringBootApplication
public class App {@RequestMapping("/")String home() {return "Hello World!";}public static void main(String[] args) {SpringApplication.run(App.class, args);}}

@RestController 标识被SpringMVC用于处理web请求,它是 @Controller and @ResponseBody组合的注解,这样将返回数据而不是视图对象

@RequestMapping  标识请求 "/"将会被映射到 home方法

@SpringBootApplication 包括@Configuration、@EnableAutoConfiguration@ComponentScan这三个注解,分别是配置、自动配置、组件自动扫描

第四:在命令行中执行 ,然后在浏览器访问127.0.0.1:8080查看是否有输出。

           $ mvn spring-boot:run

这时候无需要任何插件,不需要在pom.xml中添加插件,一个springboot的程序就跑起来了。

第五: 添加spring-boot-maven-plugin插件

 Spring Boot Maven Plugin这个插件提供了在maven中对spring-boot的支持,允许原地打包可执行Jar或War包。

spring-boot:run 可以运行springboot应用

spring-boot:repackage 重新打包jar/war为可执行文件

spring-boot:start 和spring-boot:stop用于管理应用的生命周期,例如集成测试

spring-boot:build-info 产生构建的信息

可执行Jar(也称作 胖Jar),它包含编译好的类及其相关的依赖包

为了生成一个springboot可执行Jar,需要在pom.xml新增 spring-boot-maven-plugin插件

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

在target目录下生成了jar包,例如:

my-app-1.0-SNAPSHOT.jar

$ jar -tvf target/my-app-1.0-SNAPSHOT.jar   //  可以查看jar包中包含了什么内容

$ java -jar target/my-app-1.0-SNAPSHOT.jar   // 可以启动spingboot应用

相关文章:

我记不住的那些maven内容

背景&#xff1a; 之前使用maven都是基于IDE并且对maven本身也很少究其过程和原理&#xff0c;当出现问题也不知道如何解决&#xff0c;后续想使用命令行来进行操作&#xff0c;并通过文档记录一下学习的内容加深理解以防止忘记。 一、简要介绍 maven是通过插件来增强功能&am…...

【Java】Spring更简单的读取和存储

文章目录Spring更简单的读取和存储对象1. 存储Bean对象1.1 前置工作&#xff1a;配置扫描路径1.2 添加注解存储Bean对象1.2.1 Controller(控制器存储)1.2.2 Service(服务存储)1.2.3 Repository(仓库存储)1.2.4 Component(组件存储)1.2.5 Configuration1.3 为什么要这么多类注解…...

Kafka 命令行操作

主题命令行操作 1&#xff09;查看操作主题命令参数 [ubuntuhadoop kafka]$ bin/kafka-topics.sh 参数描述--bootstrap-server连接的KafkaBroker主机名称和端口号。--topic操作的topic名称。--create创建主题。--delete删除主题。--alter修改主题。--list查看所有主题。--desc…...

KUKA机器人_基础编程中的变量和协定

KUKA机器人_基础编程中的变量和协定 KUKA机器人KRL中的数据保存:  每个变量都在计算机的存储器中有一个专门指定的地址  一个变量用非KUKA关键词的名称来表示  每个变量都属于一个专门的数据类型  在应用前必须声明变量的数据类型  在KRL中有局部变量和全局变量之分…...

代码名命规范浅析

日常开发编码中&#xff0c;代码的名命是个大学问&#xff0c;能快速的看懂开源代码的结构和意图&#xff0c;也是一项必备的能力。在java项目的代码结构中&#xff0c;采用长名命的方式来规范类的名命&#xff0c;能够自己表达其主要意图&#xff0c;配合高级IDE&#xff0c;可…...

数据结构第15周 :( 求第k大的数 + 查找3个数组的最小共同元素 + 查找一个循环顺序数组的最小元素 + Crazy Search)

目录求第k大的数查找3个数组的最小共同元素查找一个循环顺序数组的最小元素Crazy Search求第k大的数 【问题描述】 求n个数中第k大的数 【输入形式】 第一行n k&#xff0c;第二行为n个数&#xff0c;都以空格分开 【输出形式】 第k大的数 【样例输入】 10 3 18 21 11 26 12 2…...

【数据结构】Map 和 Set

目录二叉搜索树二叉搜索树---查找二叉搜索树---插入二叉搜索树---删除Map和SetMap的使用Set的使用哈希表哈希冲突冲突避免冲突解决冲突解决---闭散列冲突解决---开散列题目练习只出现一次的数复制带随机指针的链表宝石与石头旧键盘二叉搜索树 二叉搜索树也叫二叉排序树&#x…...

IPVlan 详解

文章目录简介Ipvlan2同节点 Ns 互通Ns 内与宿主机 通信第三种方法Ns 到节点外部结论Ipvlan31. 同节点 Ns 互通Ns 内与宿主机 通信Ns 内到外部网络总结源码分析ipvlan 收包流程收包流程主要探讨使用 ipvlan 为 cni 通过虚拟网卡的实现。简介 ipvlan 和 macvlan 类似&#xff0c…...

直播间的2个小感悟

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 在线人数固定 最近直播间出现了很多新面孔&#xff0c;有的是偶然刷到的&#xff0c;有的是关注互联网找到的。而直播间的人数一直没什么变化&#xff0c;卢松松在抖音直播较少&#xff0c;主播间…...

STM32开发(15)----芯片内部温度传感器

芯片内部温度传感器前言一、什么是内部温度传感器&#xff1f;二、实验过程1.STM32CubeMX配置2.代码实现3.实验结果总结前言 本章介绍STM32芯片温度传感器的使用方法和获取方法。 一、什么是内部温度传感器&#xff1f; STM32 有一个内部的温度传感器&#xff0c;可以用来测…...

Apache Hadoop生态部署-zookeeper分布式安装

目录 查看服务架构图-服务分布、版本信息 一&#xff1a;安装前准备 1&#xff1a;zookeeper安装包选择--官网下载 2&#xff1a;zookeeper3.5.7安装包--百度网盘 二&#xff1a;安装与常用配置 2.1&#xff1a;下载解压zk安装包 2.2&#xff1a;配置环境变量 2.3&#x…...

MySQL(九)

mysql的锁机制 1、MySQL锁的基本介绍 ​ **锁是计算机协调多个进程或线程并发访问某一资源的机制。**在数据库中&#xff0c;除传统的 计算资源&#xff08;如CPU、RAM、I/O等&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一…...

Matlab 计算一条直线与一条线段的交点

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里假设一条直线的方向为 ( a , b , c ) (a,b,c) (a,b,...

Read book Netty in action(Chapter VI)--ByteBuf

序言 之前学习了传输&#xff0c;通过前面的学习我们都知道&#xff0c;网络数据的基本单位是字节。JDK中提供了ByteBuffer作为字节的容器&#xff0c;但是过于繁琐复杂&#xff0c;Netty中提供了ByteBuf作为替代品。学习一下。 API Netty的数据处理API通过两个组件暴露 ---…...

VsCode开发工具的入门及基本使用

VsCode开发工具的入门及基本使用一、VsCode介绍1.VsCode简介2.VsCode特点二、安装VsCode1.下载VsCode2.安装VsCode3.打开VsCode三、设置VsCode中文1.搜索中文语言插件2.安装中文语言插件四、初识VsCode1.VsCode左侧栏模块2.系统设置功能五、VsCode初始配置1.禁用自动更新2.开启…...

python标准库——OS模块接口详解

OS系统操作模块 os模块提供各种Python 程序与操作系统进行交互的接口 os模块是整理文件和目录最常用的模块 函数作用补充os.sep()取代操作系统特定的路径分隔符os.name()指示你正在使用的工作平台。比如对于Windows&#xff0c;它是nt&#xff0c;而对于Linux/Unix用户&…...

LeetCode 622.设计循环队列

设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里&a…...

OraDump导出套件

OraDump导出套件 只需单击几下即可将数据从Oracle转储文件导出到流行的数据库和格式。 OraDump Export Kit是一个将数据从Oracle转储文件导出到流行数据库和格式的软件包。该产品具有高性能&#xff0c;因为它直接读取转储文件。命令行支持允许编写脚本、自动化和安排转换过程。…...

CVE-2022-22947 SpringCloud GateWay SPEL RCE 漏洞分析

漏洞概要 Spring Cloud Gateway 是Spring Cloud 生态中的API网关&#xff0c;包含限流、过滤等API治理功能。 Spring官方在2022年3月1日发布新版本修复了Spring Cloud Gateway中的一处代码注入漏洞。当actuator端点开启或暴露时&#xff0c;可以通过http请求修改路由&#xff…...

Firebase常用功能和官方Demo简介

一、Firebase简介Firebase刚开始是一家实时后端数据库创业公司&#xff0c;它能帮助开发者很快的写出Web端和移动端的应用。自2014年10月Google收购Firebase以来&#xff0c;用户可以在更方便地使用Firebase的同时&#xff0c;结合Google的云服务。现在的Firebase算是谷歌旗下的…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...