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

Maven插件检测全路径名冲突如何开发Maven插件

背景

  • 为何我们要检测全路径名冲突的类?
    在某一次需求中,升级了一个名为 strategy.wrs.outter.contract 的 jar 包,此包间接引入了 dmq-client ,其中包含了全限定名为 com.daojia.spat.mq.client.MQClient 的类,这与我们原有的 jar 包 jzdmq-client 里的同名类 com.daojia.spat.mq.client.MQClient 产生了冲突。
  • 为何没能提前发现这一冲突呢?
    在开发方面,其 jar 包本身不存在冲突,分属两个不同坐标。其次,可能是由于单元测试和服务器类加载器不同,导致加载了不同包下的类,因而单元测试正常。
    在 QA 方面,由于此功能与本次需求毫无关联,他们也未关注 mq 发送的问题,所以在测试环境中没有留意到这个异常。

使用

依赖

<plugin><groupId>com.daojia.gunpowder</groupId><artifactId>gunpowder-depend</artifactId><version>8.0.37-SNAPSHOT</version>
</plugin>

参数

  • ignoreClasses——需要忽略的类,支持模糊匹配
<ignoreClasses><ignoreClass>org/apache/log4j/FileAppender.class</ignoreClass><ignoreClass>org/jboss/netty/channel/ExceptionEvent.class</ignoreClass><ignoreClass>com/sun/mail/*</ignoreClass>
</ignoreClasses>
  • ignoreClassDependency——需要忽略的jar,支持不指定版本的模糊匹配
<ignoreClassDependency><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.1</version></dependency><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId></dependency>
</ignoreClassDependency>
  • matchingClasses——需要匹配的类,支持模糊匹配
<matchingClasses><matchingClasses>com/daojia/*</matchingClasses><matchingClasses>org/jboss/netty/channel/socket/nio/NioClientSocketChannel.class</matchingClasses>
</matchingClasses>
  • 为啥没有需要匹配的jar?
    不知道这个需要匹配的jar如何定义,只匹配集合里的jar?

完整版

<plugin><groupId>com.daojia.gunpowder</groupId><artifactId>gunpowder-depend</artifactId><version>8.0.37-SNAPSHOT</version><configuration><matchingClasses><matchingClasses>com/daojia/*</matchingClasses><matchingClasses>org/jboss/netty/channel/socket/nio/NioClientSocketChannel.class</matchingClasses></matchingClasses><ignoreClasses><ignoreClass>org/apache/log4j/FileAppender.class</ignoreClass><ignoreClass>org/jboss/netty/channel/ExceptionEvent.class</ignoreClass><ignoreClass>com/sun/mail/*</ignoreClass></ignoreClasses><ignoreClassDependency><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.1</version></dependency><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId></dependency></ignoreClassDependency></configuration>
</plugin>

代码

命令:

/Users/xinning/Public/maven/apache-maven-3.9.6/bin/mvnDebug  com.daojia.gunpowder:gunpowder-depend:8.0.37-SNAPSHOT:repeatClassCheck

监听:
[图片]

如何开发Maven插件

引入依赖

<dependencies><dependency><groupId>org.apache.maven.plugin-tools</groupId><artifactId>maven-plugin-annotations</artifactId><version>3.5.2</version><scope>provided</scope></dependency><dependency><groupId>org.apache.maven</groupId><artifactId>maven-core</artifactId><version>3.6.3</version></dependency><dependency><groupId>org.apache.maven.enforcer</groupId><artifactId>enforcer-api</artifactId><version>3.5.0</version> <!-- 使用正确的版本号 --></dependency>
</dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-plugin-plugin</artifactId><version>3.5.2</version></plugin></plugins>
</build>

继承父类AbstractMojo

添加类上添加@Mojo指定插件名

重写execute方法

@Parameter指定参数名

打包成插件

<packaging>maven-plugin</packaging>

问题复盘

  1. 在idea maven插件中执行mvnDebug clean compile org.apache.maven.plugins:maven-enforcer-plugin:3.5.0:enforce现实errorCode=2无法执行
    原因
    idea没找到mvnDebug命令
    解决方式
    指定mvnDebug路径:/Users/xinning/Public/maven/apache-maven-3.9.6/bin/mvnDebug clean compile org.apache.maven.plugins:maven-enforcer-plugin:3.5.0:enforce

  2. /Users/xinning/Public/maven/apache-maven-3.9.6/bin/mvnDebug clean compile org.apache.maven.plugins:maven-enforcer-plugin:3.5.0:enforce报错

Failed to execute goal on project dj-crm-web: Could not resolve dependencies for project com.bj58.daojia:dj-crm-web:war:1.0-SNAPSHOT: The following artifacts could not be resolved: com.daojia.biz.service:service-call-client:jar:1.1.2-SNAPSHOT (absent), com.daojia.jz.arch:4j-jz:jar:1.0.1 (absent), com.daojia.jzmcrm:com.daojia.jzmcrm.contract:jar:0.6.3 (absent), com.daojia.hdpt.insurance:com.daojia.hdpt.insurance.contract:jar:1.0.26-SNAPSHOT 

原因
因为是在idea的终端执行的,所以使用的是maven自带的setting文件
解决方式
将maven自带的setting文件换成目标的setting文件

  1. managedDependencies、Repositories、Dependencies分别设置的是什么,对应pom或者setting文件什么位置
  • managedDependencies(管理依赖):
    pom.xml 中,<dependencyManagement> 部分用于管理依赖的版本号,确保项目中使用的依赖具有一致的版本。这可以减少版本冲突,并使得依赖声明更加简洁。
    例如
<dependencyManagement><dependencies><dependency><groupId>com.example</groupId><artifactId>example-lib</artifactId><version>1.0.0</version></dependency></dependencies>
</dependencyManagement>
  • Repositories(仓库):
    在 pom.xml 中, 部分定义了项目构建时 Maven 应该使用的远程仓库列表。这些仓库包含了项目的依赖构件。
    在 settings.xml 中, 部分也可以定义仓库,但通常用于配置用户或组织级别的仓库,这些配置对所有项目都是全局的。
    例如,在 pom.xml 中的配置:
<repositories><repository><id>central</id><url>http://repo.maven.apache.org/maven2</url></repository>
</repositories>

与在 settings.xml 中的配置相似,但通常包含额外的身份验证信息。

  • Dependencies(依赖):
    在 pom.xml 中, 部分列出了项目构建和运行所依赖的其他构件。每个 元素包含了依赖的 groupId、artifactId 和 version 等信息。
    例如:
<dependencies><dependency><groupId>com.example</groupId><artifactId>example-lib</artifactId><version>1.0.0</version></dependency>
</dependencies>
  • 总结
    managedDependencies:使用哪些版本管理规则来解析依赖的版本号。
    repositories:从哪些远程仓库中查找和下载依赖。
    dependencies:项目直接依赖哪些构件。
http://www.dtcms.com/a/286354.html

相关文章:

  • AUTOSAR进阶图解==>AUTOSAR_SWS_E2ETransformer
  • 【加解密与C】Rot系列(二)Rot13
  • LVS(Linux virual server)
  • 【Git专栏】git如何切换到某个commit(超详细)
  • Java基础篇
  • Triton Inference Server 使用详解与常见问题汇总
  • 数据库模型异常问题深度解析:冗余与操作异常
  • 《在亚马逊平台运营:从专利困境到功能利用全指南》
  • 【数据结构】堆(下)+ 二叉树
  • 深度学习笔记002-引言--日常生活总的机器学习、训练模型的过程、关键组件、各种机器学习问题
  • 如何在服务器上获取Linux目录大小
  • 使用python读取json数据,简单的处理成元组数组
  • 验证大语言模型不会算数但可以编写算数的程序
  • 【数据结构初阶】--双向链表(一)
  • 机器学习17-Mamba
  • C语言—如何生成随机数+原理详细分析
  • Linux服务器端口被占用?
  • 无刷电机控制 - 基于STM32F405+CubeMX+HAL库+SimpleFOC04,完成霍尔传感器的驱动代码
  • @Scheduled的作用分析
  • 赛道观察:AI智能自习室哪家强?深挖深度逻辑与价值锚点
  • 链表算法之【链表的中间节点】
  • 【CMake】CMake 项目打包与 find_package 使用流程:从 A 到 B 的完整范例
  • 基于MATLAB的朴素贝叶斯NB的数据分类预测方法应用
  • 一种新颖的可解释人工智能框架,用于整合统计、视觉和基于规则的方法进行医学图像分类|文献速递-医学影像算法文献分享
  • Flutter ScaffoldMessenger 详细介绍
  • P1205 [USACO1.2] 方块转换 Transformations
  • 《通信原理》学习笔记——第四章
  • 【论文阅读】BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework
  • Redis——BigKey
  • Radix-4 Booth乘法器计算步骤