【Maven】(二)使用 Maven 创建并运行项目、聊聊 POM 中的坐标与版本号的规则

news2024/11/23 21:26:04

文章目录

  • 1.前言
  • 2.hello-world
    • 2.1.Archetype 创建
    • 2.2.使用 IDE 创建
    • 2.3.Maven的目录结构
  • 3.pom的基本组成
    • 3.1.Maven坐标的概念与规则
    • 3.2.版本号规则
    • 2.3.打包成可运行的JAR
  • 4.结语

1.前言

本系列文章记录了从0开始到实战系统了解 Maven 的过程,Maven 系列历史文章:

(一)5分钟做完 Maven 的安装与配置

在上一篇文章中,我们已经快速的安装并配置好了 Maven 的环境,现在就可以开始将 Maven用起来了,在开始创建 Maven 项目之前,先介绍一个本篇文中涉及到的内容,包括:

  • Maven 的快速开始
  • Maven 项目的目录结构
  • POM 文件的基本组成(简要版,更详细的介绍会随着本专题的推进慢慢展开)
  • 坐标、版本号、以及SNAPSHOT的含义
  • Maven 自带插件的使用

接下来,我们就开始吧!

2.hello-world

首先,我需要创建一个 Maven 的项目,创建项目的方式多种多样,例如:手动创建 Maven 的目录结构与 pom 文件、使用 Archetype 生成Maven 的项目、或者直接使用 IDE 进行创建。

2.1.Archetype 创建

Archetype 是 Maven 用来初始化项目骨架的插件(Maven 有很多自带的插件,很多时候我们都意识不到自己在使用),由于我们使用的是 Maven3,可以直接运行下面的指令:

mvn archetype:generate

第一次运行这个指令的时候,会从中央仓库中下载插件,所以会看到控制台一长串的输出,直到:
在这里插入图片描述
这里的左边那一串数字有点类似于需要使用的 Maven项目目标,右边默认的 1982 指的是maven-archetype-quickstart,我们可以在控制台中找到它:
在这里插入图片描述
如果不需要使用其他模板的话,直接回车即可,接下来回提示输入 groupIdartifactIdversion 等,这个其实就是生成的 POM 中需要的坐标数据,此处将 groupId 填写为 com.ls.mavendemoartifactId 填写为 hello-world(在下面POM的基本组成中会解释为什么),再一顿回车之后,项目就创建成功了。
在这里插入图片描述在这里插入图片描述

2.2.使用 IDE 创建

在实际的开发中,我们可能更多的会使用IDE来生成 Maven 项目,图形化的界面会更加友好,例如使用 Idea 来创建:

File -> new -> project
在这里插入图片描述
然后,就可以输入 groupIdartifactIdversion 几个参数了:
在这里插入图片描述
点击Next -> Finish 项目就创建完成了。

2.3.Maven的目录结构

在这里插入图片描述
忽略掉 .idea 文件夹,上图中的剩余部分就是 Maven 的目录结构了,这种目录结构是 Maven 的规范所规定的,在 src 下面会包含 maintest两个文件夹,两者代表了不同的分工环境:

  • main:写功能代码
  • test:写测试代码

在这里面的 java 指的是放置代码的文件夹,同样的在 java 的同级目录下,往往还会有一个 resources 文件夹用于放置项目中使用到的配置文件、模板文件等静态文件,例如:xml、properties等。
在这里插入图片描述

3.pom的基本组成

打开 pom.xml ,可以看到里面有大概有70多行配置:

<?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>

  <groupId>com.ls.mavendemo</groupId>
  <artifactId>hello-world</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>hello-world</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

我们先把这个文件改纯净一点,删除一部分内容

  • build -> pluginManagement: 里面的内容是Maven会使用到的默认插件,这里不需要进行配置先删除掉。
  • url: 是建立网站需要的信息,我们现在不需要建站。
  • properties:是配置的变量,这个常用于统一管理依赖包的版本,后续的文章中会将,这里暂时用不到。

下面是清理过后的 pom.xml 文件:

<?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>

  <groupId>com.ls.mavendemo</groupId>
  <artifactId>hello-world</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>hello-world</name>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

</project>

先看一下各个标签的含义:

  • <project> :POM 的根元素,定义了一些POM相关的规范。
  • <modelVersion>: POM版本号,我们用的是 Maven3 这里只能是4.0.0
  • <groupId> <artifactId> <version>:项目的坐标,用于确定一个唯一的项目,下面会详细提到
  • <name>:当前项目的名称
  • <dependencies>:当前项目引入的依赖
  • <dependency>:单个需要引入的具体的依赖包
  • <scope>:依赖的范围,常见的有 compiletest,不同的范围起到包隔离的作用,这个在后面依赖相关的文章中详细讲

3.1.Maven坐标的概念与规则

在一个三维的空间坐标系中,我们可以通过 x,y,z 三个方向的坐标确定做坐标系上的唯一一个点。
Maven的坐标概念与之类似,在建立Maven仓库的时候我们也可以通过 <groupId> <artifactId> <version> 的值来确定唯一一个构件,下面依次来看看这三者的填写规则。

  • <groupId>:指的是当前构建隶属的实际项目,一般是 公司的网址倒序 + 项目名
  • <artifactId>:一般是指的当前项目中的其中一个模块
  • <version>:当前项目的版本号

以 SpringBoot 为例:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter</artifactId>
	<version>2.7.8</version>
</dependency>

org.springframework.boot 就是 Spring 所在公司的 SpringBoot 项目,spring-boot-starter这个项目的其中一个模块,版本号为2.7.8
同理如果我们要引入Web模块,自然就应该是:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.7.8</version>
</dependency>

为什么 groupId 不能直接是一个组织呢,要细化到一个项目呢?
一般来说一个公司、组织上不会只有一个项目,如果 groupId 直接占用了组织,那项目名就只有放到 artifactId 中了,但是一个项目也有可能会有过个模块,模块名就没有地方放了。
所以我们在实际开发中创建一个 Maven 项目的时候,可以尽可能的遵守这样的约定。

3.2.版本号规则

看到这里,相信大家已经注意到了,上面引入的 SpringBoot 的版本号是 3位数,而自己创建的 hello-world 项目版本号只有 2位,并且后面还有一个 SNAPSHOT

Maven 的版本号规则实际上也是业界的通过规则,它的定义方式如下:

{主版本号}.{次版本号}.{增量版本号}-{里程碑版本}
  • 主版本号:一般是指的当前的项目有了重大的架构变动,版本之间几乎完全不兼容,例如:最近出的 SpringBoot3 就已经放弃了Java8,如果不升级 JDK的话,还是只能使用SpringBoot2
  • 次版本号:一般是指的项目的迭代版本,这种版本会修复大量的bug,带来一些小的新特性等,但是没有什么架构上的重大变化。
  • 增量版本号:一般是用于修复一些紧急bug,改动量很小时,可以使用增量版本号。
  • 里程碑版本:就是项目的当前版本处于一个什么样的阶段了,常见的里程碑版本有 SNAPSHOTalphabetareleaseGA 等。
    在里程碑的版本中,标注SNAPSHOT的为开发版,此时会存在大量的代码变动,alphabeta分别对应的是内测版与公测版这三个版本都是属于不稳定版本,使用的时候非常容易踩坑,所以一般只用的demo体验,在正式环境中不能使用。
    releaseGA都属于是稳定的正式版本,可以在正式环境中使用。

下面是SpringBoot的一些版本号,可以体验一下:
在这里插入图片描述


这里需要再提一嘴,SNAPSHOT 在 Maven仓库中有特别的含义,处于这个里程碑版本的项目可以多次install到仓库中,每一次都会覆盖前一次生成的包,但是非 SNAPSHOT 的版本是不能覆盖的,每次install都需要修改版本号。

如果不理解这段话,可以继续关注后续的文章,会讲到如何将项目打包到本地仓库以及推送到私服中。

2.3.打包成可运行的JAR

我们在开发完代码之后,需要将代码打包到测试环境中测试,Maven 提供了项目构建相关的插件,我们只需要直接使用即可。单项目的打包非常简单,我们可以进入到项目所在的根目录中(pom所在目录),执行下面的指令。

mvn clean package
  • clean:清空上一次生成的target目录,避免最新修改的代码没有被打包到新版本中造成一些意外的情况。
  • package:将当前代码打成一个可以执行的jar包。

执行完成之后,在src 目录下会出现一个同级的target目录,里面就会出现一个满足当前项目坐标的jar包:
在这里插入图片描述
我们通过 java -jar 运行这个 jar 包,会发现无法运行:

hello-world-1.0-SNAPSHOT.jar中没有主清单属性

如何才能运行呢?
在这里插入图片描述
我们需要执行的是这个App类里面的main方法,而正常的打包方式,没有指定执行它,所以我们需要通过shade插件来指定一下,在pom.xml中加入插件:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>
                                    com.ls.mavendemo.App
                                </mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

mainClass 中指定需要运行的类的全类名
在这里插入图片描述
再次重试打包运行,运行成功。
在这里插入图片描述


4.结语

本篇讲述了如何使用 Maven 自带的插件以及IDE 创建、打包、运行项目,同时介绍了 pom.xml 文件的基本组成,以 SpringBoot为例,介绍了坐标和版本号的使用规则。

到目前为止,已经可以使用Maven来进行一些简单的开发工作了,但距在公司中与同事一起协作开发较大的项目还有一定的差距,可以继续关注本专题的后续文章。

下一篇将会讲述 Maven 仓库的使用以及 Maven 私服的安装和使用。


如果觉得本文有帮助的话,可以帮忙点点赞哦!

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

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

相关文章

注意啦!如何通过广告吸引客户直接下单?

2023年跨境电商越来越突出&#xff0c;据业内相关人士称&#xff0c;在未来几年与跨境电商相关的政策仍会继续倾斜甚至加大力度&#xff0c;因此各行各业都响应政策&#xff0c;在新政策落实之前致力于平台的转型升级&#xff0c;做新时代创新型的高质量发展&#xff0c;其实细…

怎么找回电脑上删除的图片?

怎么找回电脑删除的图片?图片作为一种非常简单方便的文件&#xff0c;经常被用来辅助我们的日常工作和学习。但在我们整理电脑时&#xff0c;如果我们不小心手一抖就删除了一些重要的图片&#xff0c;遇到这种事我们要如何才能恢复呢? 众所周知&#xff0c;简单的删除并不会完…

iOS 绿幕技术

绿幕&#xff08;green screen&#xff09;技术&#xff0c;又称 chroma key effect&#xff0c;实际上是将图片上指定颜色设置为透明的图形处理技术&#xff0c;这些透明区域也可以被任意背景图片替换。 这种技术在 视频合成中被广泛使用。iOS 中&#xff0c;通过 CoreImage …

LeetCode 622.设计循环队列

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

flask框架(下)

文章目录flask框架(下)werkzeug简介请求上下文flask 处理方案回到 wsgi_app 方法中push 源码总结补充flask框架(下) werkzeug简介 Werkzeug是一个WSGI工具包&#xff0c;他可以作为一个Web框架的底层库。这里稍微说一下&#xff0c; werkzeug 不是一个web服务器&#xff0c;也…

Java Stream、File、IO 超详细整理,适合新手入门

目录 Java Stream Java File Java IO Java Stream Java Stream 是 Java 8 中引入的一种新的抽象数据类型&#xff0c;它允许开发人员使用函数式编程的方式来处理集合数据。 使用 Java Stream 可以方便地进行过滤、映射、排序和聚合等操作。下面是一个简单的示例&#xff1a;…

10分钟快速入门Pandas库

pandas 是基于NumPy 的一种工具&#xff0c;该工具是为解决数据分析任务而创建的&#xff0c;这篇文章主要介绍了10分钟快速入门Pandas库,重点介绍pandas常见使用方法&#xff0c;结合实例代码介绍的非常详细&#xff0c;需要的朋友可以参考下目录Pandas的介绍pandas 是基于Num…

其实一点不难学会这三步一定让你学会制作一个『3D建模』大屏

上次已经教过大家怎样制作一个简单的2D数据可视化大屏~那有一些朋友们就会说那些炫酷的3D可视化大屏是怎样制作的呢&#xff1f;这不就来了&#xff0c;今天就教大家怎样用山海鲸可视化软件制作一个带3D建模的可视化大屏&#xff0c;并且最重要的是无需会特别复杂的3D建模知识。…

数据结构与算法之爬楼梯动态规划

一.题目(爬楼梯)假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f;注意&#xff1a;给定 n 是一个正整数。示例 1&#xff1a;输入&#xff1a; 2输出&#xff1a; 2解释&#xff1a; 有两种方法可以爬…

playQueue 和 segmentQueue解析

文章目录 前提分析时序图常见问题结论前提 一个playlist有4段每段大概2秒每段走http下载大概500ms每段大小500KB左右分析时序图 如果网络情况很理想的话,基本上一直保持在playQueue为4,segmentQueue为1。如果网络特别差的情况下,基本上playQueue为1,segmentQueue为4。当网络…

中科检测赴中科院广州电子CASAIM开展座谈会,围绕3D打印、三维扫描和精密测量展开深入交流

2月9日&#xff0c;中科检测技术服务(广州)股份有限公司&#xff08;简称&#xff1a;中科检测&#xff09;一行到访中科院广州电子技术有限公司&#xff0c;参观广东省增材制造工程实验室和三维扫描及精密测量重点实验室&#xff0c;就3D打印、三维扫描和精密测量相关技术内容…

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A(7)

目录 模块A 基础设施设置与安全加固 一、项目和任务描述&#xff1a; 二、服务器环境说明 三、具体任务&#xff08;每个任务得分以电子答题卡为准&#xff09; A-1任务一&#xff1a;登录安全加固 1.密码策略&#xff08;Windows&#xff0c;Linux&#xff09; a.设置最…

2023年排名前茅的十大饭店装修设计!

相信大家都是知道的&#xff0c;饭店装修设计其实是一门很深的学问&#xff0c;只有掌握这门学问才能够打造出来精美的空间&#xff0c;因此饭店装修必须要有专业餐饮设计公司的设计师进行设计。但是在国内饭店装修设计公司那么多&#xff0c;饭店老板要如何选择呢&#xff1f;…

C语言--指针进阶1

目录回顾字符指针指针数组数组指针&数组名和数组名的区别数组指针的使用指针作为形参练习数组参数、指针参数一维数组传参二维数组传参一级指针传参二级指针传参回顾 指针的内容&#xff0c;我们在初级阶段已经有所涉及了&#xff0c;我们先来复习一下 指针就是个变量&am…

关于举办2023年中国可持续塑料峰会的通知

根据麦肯锡报道&#xff0c;如果塑料需求按照目前的趋势发展&#xff0c;到2030年&#xff0c;全球塑料废物量将从2016年的每年2.6亿吨增加到每年4.6亿吨&#xff0c;使已经严重的环境问题上升到一个全新的水平。目前世界塑料年产量超过3亿吨&#xff0c;为社会生产生活带来巨大…

数据结构与算法之最短路路径与最短路径和动态规划

If every unfolding we experience takes us further along in life, then, we are truly experiencing what life is offering.如果我们在人生中体验的每一次转变都让我们在生活中走得更远&#xff0c;那么&#xff0c;我们就真正的体验到了生活想让我们体验的东西。Do not tr…

【Java|golang】 1238. 循环码排列---格雷编码

给你两个整数 n 和 start。你的任务是返回任意 (0,1,2,…,2^n-1) 的排列 p&#xff0c;并且满足&#xff1a; p[0] start p[i] 和 p[i1] 的二进制表示形式只有一位不同 p[0] 和 p[2^n -1] 的二进制表示形式也只有一位不同 示例 1&#xff1a; 输入&#xff1a;n 2, start …

Linux基础命令-netstat显示网络状态

文章目录 netstat 命令介绍 语法格式 基本参数 显示各列内容分析 1&#xff09;netstat -a显示各列内容分析 2&#xff09;netstat -r显示各列内容分析 3&#xff09;netstat -i 显示各列内容分析 参考实例 1&#xff09;显示系统网络状态的所有连接 2&#xff09;…

Kubernetes之探针probe

deployment只保证pod的状态为running。如果pod状态是running&#xff0c;但是里面丢失了文件&#xff0c;导致用户不能访问数据&#xff0c;则deployment是不管用的&#xff0c;此时就需要probe来检测pod是否正常工作。 probe是定义在容器里的&#xff0c;可以理解为容器里加的…

python基于vue品牌首饰售卖平台

可定制框架:ssm/Springboot/vue/python/PHP/小程序/安卓均可开发目录 开发语言&#xff1a;Python python框架&#xff1a;django/flask 软件版本&#xff1a;python 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCharmscode 项目介…