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>
问题复盘
-
在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
-
/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文件
- 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:项目直接依赖哪些构件。