我记不住的那些maven内容

news2024/11/24 7:19:42

背景: 之前使用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 package

java -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应用

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目经理该怎样做好项目质量管理工作?

项目经理做好项目质量管理工作&#xff0c;重点需要关注以下几个方面&#xff1a; 1、质量产生于过程 需要成熟稳定的软件过程 软件项目质量产生于开发过程&#xff0c;要想真正提高软件质量&#xff0c;必须有一个成熟而稳定的软件过程。如因特殊原因造成的过程性能不稳定&…

自动化测试框架pytest教程(一)pytest用例编写和pytest前后置方法

自动化测试框架pytest教程(一)pytest用例编写和pytest前后置方法 目录&#xff1a;导读 一、入门使用 1、环境安装 2、用例编写 3、执行测试 二、前后置方法和fixture机制 1、xunit风格的前后置方法 函数用例的前后置方法 测试类中用例的前后置方法 模块级别的前后置…

Tekton实战案例--S2I

案例环境说明 示例项目&#xff1a; 代码仓库&#xff1a;https://gitee.com/mageedu/spring-boot-helloWorld.git 构建工具maven pipeline各Task git-clone&#xff1a;克隆项目的源代码 build-to-package: 代码测试&#xff0c;构建和打包 generate-build-id&#xff1a;生…

valgrind 移植到arm64 平台上总结

valgrind 介绍valgrind是查找内存泄漏的神器&#xff0c;你可以自动的检测许多内存管理和线程的bug&#xff0c;避免花费太多的时间在bug寻找上&#xff0c;使得你的程序更加稳固。 下载地址&#xff1a;https://valgrind.org/downloads/ 本人下载的是valgrind-3.19.0valgrind编…

【Java基础 下】 026 -- 集合进阶(不可变集合、Stream流、方法引用)

目录 一、不可变集合 1、创建不可变集合的应用场景 2、创建不可变集合的书写格式 ①、不可变的List集合 ②、不可变的Set集合 ③、不可变的Map集合 3、小结 二、Stream流 1、体验Stream流的作用 2、Stream流的思想 3、Stream流的使用步骤 ①、单列集合获取Stream流 ②、双列集合…

面试 | 递归乘法【细节决定成败】

不用[ * ]如何使两数相乘❓一、题目明细二、思路罗列 & 代码解析1、野蛮A * B【不符合题意】2、sizeof【可借鉴】解析3、简易递归【推荐】① 解析&#xff08;递归展开图&#xff09;② 时间复杂度分析4、移位<<运算【有挑战性&#x1f4aa;】① 思路顺理② 算法图解…

消息队列的介绍

1.什么时候会用到消息队列&#xff1f; 公司本身业务小&#xff0c;可以做单体的&#xff0c;但是后面业务体量不断扩大&#xff0c;采用微服务的设计思想&#xff0c;分布式的部署方式&#xff0c;所以拆分了很多的服务&#xff0c;随着体量的增加以及业务场景越来越复杂了&a…

SCG failure information

我们知道5G网络有独立组网和非独立组网&#xff0c;独立组网中不论是核心网还是接入网都是5G&#xff0c;但是部署成本高&#xff1b;非独立组网也就是双连接(MRDC)也是目前比较流行的一种方式&#xff0c;其中的ENDC&#xff0c;即E-UTRA-NRDual Connectivity&#xff0c;是将…

Apifox-比postman更优秀的接口自动化测试平台

一、Apifox介绍 Apifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台&#xff0c;定位 Postman Swagger Mock JMeter。通过一套系统、一份数据&#xff0c;解决多个系统之间的数据同步问题。只要定义好 API 文档&#xff0c;API 调试、API 数据 Mock、A…

如何将Linux的NIC 名称更改为 eth0 而不是 enps33 或 enp0s25,只要几秒钟

概述 我们使用Linux系统&#xff0c;网卡名称通常都是eth0&#xff0c;但是有一些新的linux发行版&#xff0c;网卡名字 enps33 或 enp0s25。 pengubuntu:~$ ifconfig ens33 Link encap:Ethernet HWaddr 00:0c:29:fd:4d:3a inet addr:192.168.0.113 Bcast:192.168.0.…

[NOIP2002 普及组] 过河卒

题目描述&#xff1a; 棋盘上 A 点有一个过河卒&#xff0c;需要走到目标 B 点。卒行走的规则&#xff1a;可以向下、或者向右。同时在棋盘上 C 点有一个对方的马&#xff0c;该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表…

上海亚商投顾:沪指窄幅震荡 ChatGPT概念股全线下挫

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数早盘小幅冲高&#xff0c;随后又震荡走低&#xff0c;午后一度集体翻绿&#xff0c;临近尾盘有所回升。Chat…

kettle使用--1.mysql多表关联导入mongoDB

文章目录1. 初步体验&#xff1a;csv 转为excelKettle概念配置mysql链接mysql 一对多关联查询结果保存到mongodb中1. 初步体验&#xff1a;csv 转为excel Windows环境下安装pdi-ce-8.0.0.0-28.zip &#xff0c;解压后执行lib下的Spoon.bat 将csv输入拖入 双击拖进去的csv&…

无聊小知识02.Junit4Junit5对比

Junit是Java编程语言的单元测试框架&#xff0c;用来编写单元测试代码。随着Junit5的盛行&#xff0c;与Junit4有何差异。JDK支持Junit4需要Java5版本Junit5需要Java8版本Maven依赖Junit4不区分模块&#xff0c;只有一个jar&#xff1a;<dependency><groupId>junit…

【Linux】工具(1)——yum

好久不见&#xff0c;让大家久等啦~最近开学被一系列琐事所耽误了&#xff0c;接下来会进入稳定更新状态~话不多说&#xff0c;在我们了解Linux基本内容之后&#xff0c;我们的目的是要在Linux环境下进行软硬件开发&#xff0c;在这个过程中我们会用到一系列工具&#xff0c;例…

知识蒸馏论文阅读:LD算法笔记

标题&#xff1a;Localization Distillation for Dense Object Detection 会议&#xff1a;CVPR2022 论文地址&#xff1a;https://ieeexplore.ieee.org/document/9878414/ 官方代码&#xff1a;https://github.com/HikariTJU/LD 作者单位&#xff1a;南开大学、天津大学、哈尔…

uniapp本地存储

uniapp本地存储 vue的本地存储方式, 小程序在浏览器测试时也可以实现, 但是在真机运行时不能实现 一. 存储 1.uni.setStorage(OBJECT) 将数据存储在本地缓存中指定的key中, 会覆盖掉原来该key对应的内容, 这是一个异步接口 OBJECT参数示例 uni.setStorage({key:"token&qu…

王子与骑士-第14届蓝桥杯STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第101讲。 蓝桥杯选拔赛现已更名为STEMA&#xff0c;即STEM 能力测试&#xff0c;是蓝桥杯大赛组委会与美国普林斯顿多…

使用Navicat进行SSH加密方式连接MySQL数据库

前言近年来网络安全形式日趋严峻&#xff0c;为保障企业信息安全和业务连续性&#xff0c;越来越多的要求业务系统上线前需要满足等保要求。其中数据库作为存储数据的载体&#xff0c;安全更是重中之重。部分等保要求&#xff0c;mysql数据库不能通过直连方式连接&#xff0c;需…

炔基点击交联试剂1704097-05-1,Alkyne-A-DSBSO crosslinker,发生相应点击反应

1、理论分析&#xff1a;中文名&#xff1a;炔基-A-DSBSO crosslinker&#xff0c;英文名&#xff1a;Alkyne-A-DSBSO crosslinkerCAS号&#xff1a;1704097-05-1化学式&#xff1a;C25H32N2O12S2分子量&#xff1a;616.652、产品详情&#xff1a;外观&#xff1a;白色固体&…