Maven 中的 classifier 属性用过没?

小伙伴们是否在学习时遇到问题不知道找谁解决?是否在找工作时想要有人帮忙看简历、做模拟面试?是否希望能够有人指点一下学习思路?松哥做了一个2024 Java进阶训练营,希望能够通过直播课+服务的方式,帮大家解决这些问题,感兴趣的小伙伴戳->2024 Java进阶训练营

最近训练营有小伙伴问到松哥一个关于 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,从而轻松地将其集成到其他项目中。


相关推荐

  • 最新955不加班的公司名单
  • ​库克谈苹果生成式 AI ;OpenAI有望在年中发布GPT-5;微软开源远程缓存存储系统 Garnet | 极客头条
  • C++ 之父反驳白宫警告:自诞生第一天起,C++ 的目标就一直是提高安全性
  • 瘫痪8年的29岁小哥成为马斯克脑机接口试验第一人,手术2个月后,现身开启直播意念玩象棋!
  • 腾讯发布自研游戏AI引擎:3D城市布局效率提升百倍,UGC工具已上线《元梦之星》
  • 黄仁勋组局,Transformer七子首次重聚对谈 | 中文实录
  • 脑后插管玩《文明6》!马斯克Neuralink首个人类志愿者,直播意念下象棋
  • 突发!Stable Diffusion核心团队被曝集体离职
  • 传奇大爷拿下“数学界诺贝尔奖”;陶哲轩祝贺:他本应更知名
  • 今日代码 PK | 避免循环查库
  • 教你一招,保护你的项目代码!
  • JDK22 发布!
  • 端到端加速企业GenAI创新,英伟达NIM微服务成为软件企业看中的亮点!
  • 巨头争锋:AGI来到临界点?
  • 突发!Stability AI核心团队已分崩离析,抢功、侵权、撤资争议不断,AI界有自己的“春山学”
  • 使用 BigDL-LLM 加速 Intel * 数据中心 GPU 上的 LLM 推理
  • 裁员潮持续,劝所有程序员早点做个人规划!| 极客时间
  • Sora很难跟进?微调就不是一个岗位?大力出奇迹将继续适用?大模型将对软件生态带来哪些变化?
  • 没有App,也没有 App Store,未来的手机会干掉全部应用开发人员吗?
  • 杭州/深圳内推 | VIVO影像算法研究部招聘AIGC+计算摄影方向算法工程师/实习生