maven优雅的替换依赖中的类

背景

在项目中会依赖到其他第三方的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包,类也已经被替换成我们自定义的类在这里插入图片描述

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值