背景
在项目中会依赖到其他第三方的jar包,有时我们需要扩展第三方jar的功能,或者修复依赖中已知还未修复的bug,要改其中的代码,最直接的做法可能会想到,通过修改jar的源码,然后重新编译新的jar,但是, 这样随之会带来代码不易维护的问题(只改动几个类,但是需要维护jar中所有的代码,有时不知道改了哪些代码)。下面,我们通过maven插件,将修改的类代码类,替换jar中的类。
实现jar中的类替(maven插件)
maven-dependency-plugin
-
插件说明:
依赖项插件提供了操作工件的功能。它可以将项目从本地或远程存储库复制和/或解压缩到指定位置。官方地址
-
使用命令:
从存储库中检索项目列表并将其解压缩到定义位置的目标。
dependency:unpack
-
操作原理
这个命令可以将我们指定的dependency解压到class目录中,然后设置不覆盖本地项目相同class文件(类的全限定名相同),就达到了本地文件替换源jar中class文件的目的。
-
实践
我们的目将
org.apache.flink:flink-kubernetes_2.11:1.14.3
中的KubernetesClusterClientFactory
类,将createClusterDescriptor
方法第一行输出日志。代码片段
package org.apache.flink.kubernetes; ... /** A {@link ClusterClientFactory} for a Kubernetes cluster. */ @Internal public class KubernetesClusterClientFactory extends AbstractContainerizedClusterClientFactory<String> { ... @Override public KubernetesClusterDescriptor createClusterDescriptor(Configuration configuration) { //新添加代码 System.out.println("configuration : "+ configuration) //======= checkNotNull(configuration); if (!configuration.contains(KubernetesConfigOptions.CLUSTER_ID)) { final String clusterId = generateClusterId(); configuration.setString(KubernetesConfigOptions.CLUSTER_ID, clusterId); } return new KubernetesClusterDescriptor( configuration, FlinkKubeClientFactory.getInstance().fromConfiguration(configuration, "client")); } ...
maven pom.xml片段
<properties> <flink.version>1.14.3</flink.version> <scala.binary.version>2.11</scala.binary.version> </properties> <dependencies> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-kubernetes_${scala.binary.version}</artifactId> <version>${flink.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>unpack</id> <phase>generate-sources</phase> <goals> <goal>unpack</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>org.apache.flink</groupId> <artifactId>flink-kubernetes_${scala.binary.version}</artifactId> <overWrite>false</overWrite> <outputDirectory>${project.build.directory}/classes</outputDirectory> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin> </plugins> </build>
通过maven打包命令打包
mvm clean install
从class目录中查看
KubernetesClusterClientFactory
,发现代码已经是我们修改后的类。同时,当前项目编译的jar包,类也已经被替换成我们自定义的类