Maven 中的 classifier 属性用过没?

最近训练营有小伙伴问到松哥一个关于 Maven 依赖的问题,涉及到 classifier 属性,随机问了几个小伙伴,都说工作中没用到过,因此简单整篇文章和小伙伴们分享下。

Maven 大家日常开发应该都有使用,Maven 中有一个比较好玩的 classifier 属性不知道小伙伴们有没有用过?

简单聊一聊这个话题。

一 Classifier 属性的作用

Classifier 属性在 Maven 中的主要作用是用于区分同一 artifact 的不同版本或变种。在 Maven 的坐标系统中,一个 artifact 通常由 groupId、artifactId 和 version 三个基本元素确定。

然而,在某些情况下,我们可能需要为同一个 artifact 创建多个不同的版本或变种,比如源代码包、文档包或特定平台的二进制包等。这时,Classifier属性就派上了用场。

通过为 artifact 添加 Classifier 属性,我们可以为同一个 artifact 创建多个不同的附件(attachment)。这些附件可以是源代码、测试代码、文档、特定平台的二进制文件等。每个附件都有一个唯一的 Classifier 值,用于区分它们。这样,我们就可以在 Maven 仓库中存储和管理这些不同的 artifact 变种,并在构建过程中根据需要引用它们。

例如下面这张图:

如果我想引用第一个 shiro-web-2.0.0-jakarta.jar 该怎么写呢?下面这种写法显然不对,这种写法引入的是 shiro-web-2.0.0.jar

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>2.0.0</version>
</dependency>

二 在依赖中引用Classifier

当我们需要在其他 Maven 项目中引用具有 Classifier 的 artifact 时,我们需要在依赖声明中指定 classifier 属性。例如:

<dependencies>  
    <dependency>  
        <groupId>com.example</groupId>  
        <artifactId>my-artifact</artifactId>  
        <version>1.0.0</version>  
        <classifier>sources</classifier>  
        <type>jar</type>  
        <scope>compile</scope>  
    </dependency>  
</dependencies>

在上面的示例中,我们引用了一个 Classifier 值为 sources 的 artifact 变种。Maven 将根据 groupId、artifactId、version 和 classifier 的值在仓库中查找相应的 artifact,并将其添加到项目的依赖中。

如果是上面的 Shiro 依赖呢?写法如下:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>2.0.0</version>
    <classifier>jakarta</classifier>
</dependency>

三 自定义 Classifier 属性

上面是我们引用别人的项目,配置 Classifier,如果要在自己的 Maven 项目中定义 Classifier,那么我们需要在 pom.xml 文件中进行相应的配置。具体来说,我们需要在 build 标签下添加 maven-jar-plugin 插件,并为其配置 classifier 属性。例如,如果我们想要创建一个包含源代码的 artifact 变种,可以这样做:

<build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-jar-plugin</artifactId>  
            <version>3.2.0</version>  
            <executions>  
                <execution>  
                    <goals>  
                        <goal>jar</goal>  
                    </goals>  
                </execution>  
                <execution>  
                    <id>attach-sources</id>  
                    <goals>  
                        <goal>jar</goal>  
                    </goals>  
                    <configuration>  
                        <classifier>sources</classifier>  
                    </configuration>  
                </execution>  
            </executions>  
        </plugin>  
    </plugins>  
</build>

在上面的示例中,我们为 maven-jar-plugin 插件添加了一个名为 attach-sources 的执行,并为其配置了 classifier 属性为 sources。这表示我们将创建一个包含源代码的 artifact 变种,其 Classifier 值为 sources。

四 总结

Maven 的 Classifier 属性为我们在构建和管理 Java 项目时提供了极大的灵活性。通过为 artifact 添加 Classifier 属性,我们可以创建多个不同的版本或变种,以满足不同的项目需求或构建环境。同时,我们还可以在依赖声明中引用具有 Classifier 的 artifact,从而轻松地将其集成到其他项目中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入理解 Go 语言中的字符串不可变性与底层实现

文章目录 前言1 字符串类型的数据结构组成2 为什么要这么设计数据结构&#xff1f;3 为什么说字符串类型不可修改&#xff1f;4 如何实现字符串的修改&#xff1f;5 为什么字符串修改的字面量用单引号&#xff1f;6 如何判断字符串的修改新建了一个字符串&#xff1f;7 字符串的…

DevExpress开发WPF应用实现对话框总结

说明&#xff1a; 完整代码Github​&#xff08;https://github.com/VinciYan/DXMessageBoxDemos.git&#xff09;DevExpree v23.2.4&#xff08;链接&#xff1a;https://pan.baidu.com/s/1eGWwCKAr8lJ_PBWZ_R6SkQ?pwd9jwc 提取码&#xff1a;9jwc&#xff09;使用Visual St…

Rust之函数式语言特性:迭代器和闭包(一):概述

开发环境 Windows 11Rust 1.78.0 VS Code 1.89.1 项目工程 这次创建了新的工程minigrep. 函数式语言特性:迭代器和闭包 Rust的设计从许多现有语言和技术中获得了灵感&#xff0c;其中一个重要影响是函数式编程。函数式编程通常包括通过在参数中传递函数、从其他函数返回函数、…

CameraProvider启动流程

从Android 8.0之后&#xff0c;Android 引入Treble机制&#xff0c;主要是为了解决目前Android 版本之间升级麻烦的问题&#xff0c;将OEM适配的部分vendor与google 对android 大框架升级的部分system部分做了分离&#xff0c;一旦适配了一个版本的vendor信息之后&#xff0c;之…

告别低效提问:掌握BARD技巧,让AI成为你的智能助手!

今天只聊一个主题&#xff1a;提示词 Prompt。 说到提示词&#xff0c;大家可能都看过GPT的高级示例&#xff0c;那些几百字的提示词&#xff0c;写起来确实不容易。 那么&#xff0c;如何写出同样效果的提示词呢&#xff1f; 有没有什么公式或者系统学习的方法&#xff1f;…

在CentOS7下构建TeamSpeak服务器并增加网易云点歌插件

文章目录 部署TeamSpeak创建一个新用户下载并解压服务端下载解压 启动服务端同意许可协议启动与配置开放端口设置开机自启 客户端连接 部署TS3AudioBot并添加网易云插件安装ffmpeg下载TS3AudioBot本体与插件并解压配置TS3AudioBot启动设置开机自启 部署网易云API安装git安装Nod…

5.23R语言-参数假设检验

理论 方差分析&#xff08;ANOVA, Analysis of Variance&#xff09;是统计学中用来比较多个样本均值之间差异的一种方法。它通过将总变异分解为不同来源的变异来检测因子对响应变量的影响。方差分析广泛应用于实验设计、质量控制、医学研究等领域。 方差分析的基本模型 方差…

ReDos攻击浅析

DOS为拒绝服务攻击&#xff0c;re则是由于正则表达式使用不当&#xff0c;陷入正则引擎的回溯陷阱导致服务崩溃&#xff0c;大量消耗后台性能 正则 ​ 探讨redos攻击之前&#xff0c;首先了解下正则的一些知识 执行过程 大体的执行过程分为: 编译 -> 执行编译过程中&…

Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解还在写0.0… 文章目录 系列…

MySQL 命令总结篇-思维导图

一些常用命令以思维导图形式总结在这里了&#xff0c;掌握这些进行MySQL基本操作绝对没问题&#xff0c;加油&#xff01;友友们可以根据这些思维导图进行知识总结。 目录 一、快速上手 二、SQL 语句分类&#xff08;DDL、DML、DQL、DCL&#xff09; 三、数据类型 四、约束…

数字水印 | 图像噪声攻击(高斯/椒盐/泊松/斑点)

目录 Noise Attack1 高斯噪声&#xff08;Gaussian Noise&#xff09;2 椒盐噪声&#xff08;Salt and Pepper Noise&#xff09;3 泊松噪声&#xff08;Poisson Noise&#xff09;4 斑点噪声&#xff08;Speckle Noise&#xff09;5 完整代码 参考博客&#xff1a;Python…

零基础学会asp.net做网站/公众号/小程序之三:实战初体验(简单程序教学)

关注我&#xff0c;持续分享逻辑思维&管理思维&面试题&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导&#xff1b; 博主在互联网大厂深耕近二十年&#xff0c;从一线码农做起&#xff0c;到人工智能公司副总裁。希望把过往经验总结出来&#xff0…

对称二叉树(oj题)

一、题目链接https://leetcode-cn.com/problems/symmetric-tree/ 二、题目思路 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称的思路: 1.将该树的左子树和右子树&#xff0c;当做两棵树&#xff0c;调用 判断两棵树是否对称相等的函数 2.判断两颗树是否对称相…

【网络安全】Web安全学习-前言及先导

一、网络安全概述 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因遭到破坏、更改、泄露&#xff0c;系统能连续可靠的正常运行&#xff0c;网络服务不中断。简单来说。就是要保障我们的网络环境安全稳定&#xff0c;不被人破…

深入理解linux文件系统与日志分析

深入理解linux文件系统与日志分析 linux文件系统: 文件是存储在硬盘上的&#xff0c;硬盘上的最小存储单位是扇区&#xff0c;每个扇区的大小是512字节。 inode&#xff1a;元信息&#xff08;文件的属性 权限&#xff0c;创建者&#xff0c;创建日期等等&#xff09; block…

【Python】解决Python报错:AttributeError: ‘generator‘ object has no attribute ‘xxx‘

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

【核心动画-关键帧动画-CAKeyframeAnimation Objective-C语言】

一、接下来,我们来说这个关键帧动画, 1.我们把之前的基本动画,这一坨代码,备份到test1方法里边, 然后,开始说我们的关键帧动画,步骤都是一样的,都是三大步: // 关键帧动画 // 1.做什么动画 // 2.怎么做动画 // 3.对谁做动画 1)做什么动画 第一,我们现在要创建…

计算机图形学入门04:视图变换

1.MVP变换 将虚拟场景中的模型投影到屏幕上&#xff0c;也就是二维平面上&#xff0c;需要分三个变换。 1.首先需要知道模型的位置&#xff0c;也就是前面提到的基本变换&#xff0c;像缩放、平移&#xff0c;旋转&#xff0c;也称为模型(Model)变换。 2.然后需要知道从…

STM32定时器与PWM对LED灯的控制

文章目录 一、定时器——Timer&#xff08;一&#xff09;概念&#xff08;二&#xff09;分类&#xff08;三&#xff09;功能&#xff08;四&#xff09;结构1.模块一——时基单元2.模块二——输出比较模块 二、实验内容&#xff08;一&#xff09;标准库点亮LED灯1.实验说明…

99.网络游戏逆向分析与漏洞攻防-ui界面的设计-角色信息显示的界面与功能

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…