实现jar中的类替(maven插件) maven-dependency-plugin在项目中会依赖到其他第三方的jar包,有时我们需要扩展第三方jar的功能,或者修复依赖中已知还未修复的bug,要改其中的代码,最直接的做法可能会想到,通过修改jar的源码,然后重新编译新的jar,但是, 这样随之会带来代码不易维护的问题(只改动几个类,但是需要维护jar中所有的代码,有时不知道改了哪些代码)。下面,我们通过maven插件,将修改的类代码类,替换jar中的类。
插件说明:
依赖项插件提供了操作工件的功能。它可以将项目从本地或远程存储库复制和/或解压缩到指定位置。官方地址
使用命令:
从存储库中检索项目列表并将其解压缩到定义位置的目标。
dependency:unpack
操作原理
这个命令可以将我们指定的dependency解压到class目录中,然后设置不覆盖本地项目相同class文件(类的全限定名相同),就达到了本地文件替换源jar中class文件的目的。
实践
我们的目将org.apache.flink:flink-kubernetes_2.11:1.14.3中的KubernetesClusterClientFactory类,将createClusterDescriptor方法第一行输出日志。
代码片段
package org.apache.flink.kubernetes;
...
@Internal
public class KubernetesClusterClientFactory
extends AbstractContainerizedClusterClientFactory {
...
@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片段
org.apache.flink flink-kubernetes_${scala.binary.version} ${flink.version} org.apache.maven.plugins maven-dependency-plugin unpack generate-sources unpack org.apache.flink flink-kubernetes_${scala.binary.version} false ${project.build.directory}/classes
通过maven打包命令打包
mvm clean install ,
从class目录中查看KubernetesClusterClientFactory,发现代码已经是我们修改后的类。同时,当前项目编译的jar包,类也已经被替换成我们自定义的类



