百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 软件资讯 > 正文

如何优雅替换第三方依赖中的类?

ninehua 2024-12-13 15:33 16 浏览

在项目中需要依赖其他第三方的jar包,但有时我们需要扩展第三方jar的功能,或者修复依赖中已知还未修复的bug,但碰到过很多种情况,第三方类库中并没有提供对应的扩展点导致无法优雅的使用继承等方法对代码进行改造。

如果第三方类库并没有提供扩展点,我们通常会使用如下两种办法来进行二次开发:

  • 将第三方jar的源工程下载下来,放入maven中,重新进行修改,并发布在私有仓库中
  • 直接将需要修改的代码复制到当前工程,进行修改

如果这个第三方类库是全公司都需要使用的,使用第一种无疑是最好的,不过也带来了一定的维护成本。

如果只是单个项目需要引入,直接将代码拷贝到工程中,直接修改,但编译后的文件会在当前classpath路径下生成对应的class文件,能否将这些修改的class打入到最终的第三方jar类库。

2、通过插件体会Jar包中的类

下面,我们介绍通过maven插件,将修改的类代码类,直接替换jar中的类。

2.1 maven-dependency-plugin

maven-dependency-plugin简单说明情况如下:

  • 插件说明:依赖项插件提供了操作工件的功能。它可以将项目从本地或远程存储库复制和/或解压缩到指定位置。官方地址
  • 使用命令:从存储库中检索项目列表并将其解压缩到定义位置的目标。具体命令如下:
dependency:unpack 
  • 操作原理

这个命令可以将我们指定的dependency解压到class目录中,然后设置不覆盖本地项目相同class文件(类的全限定名相同),就达到了本地文件替换源jar中class文件的目的。

2.2 实操

计划将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"));
    }

为了在打包的时候修改的代码能打入到第三方jar包,需要修改pom文件,对应的代码如下:

 <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包,类也已经被替换成我们自定义的类,目标达成。


来源:公众号——中间件兴趣圈

相关推荐

几款三星手机必装的软件

三星的OneUI是一款“学习成本”较高的手机系统,除了部分功能“藏”得比较深之外,还有一个问题是三星为OneUI其实还推出过不少的“官方外挂”,要让OneUI更好用,得把这些额外的APP都装上,...

简单两步,提升 iPhone / iPad 听歌音乐感受

正如当年SteveJobs介绍第一代iPhone时所说,iPhone除了是电话还是一部iPod。相信不少人听歌的主要工具就是iPhone/iPad/iPodTouch,以下就...

Sam Helper三星手机用户必装神器

SamHelper这款软件集合了三星手机主题工具当前主题?主题路径?主题安装系统设置屏幕模式?状态栏?文件?频段?暗码Lock&LabsGoodLock?GalaxyLa...

全尺寸顶级证件照大师级PS抠图插件,一键完美换底,另赠50款插件

今天给大家带来一款小编亲测实名打call的PS顶级证件照抠图插件!!本来倚着好玩的心态安装了一个,试了一下发现好用真的不是一点点!!每次抠图都抠的头秃,自从有了这个一键换证件照背景之后,工作效率蹭蹭往...

30万设计师都赞的PS特效滤镜插件合集!附最强抠图插件,速领

本期小编给大家分享9款非常好的PS特效滤镜插件,其中最强的抠图软件TopazRemask5也在其中哦。Topaz是国内外知名的ps滤镜软件厂商,出品了大量优秀的Photoshop滤镜。Topa...

Coolorus 2.6色轮面板 PS专业色轮配色中文汉化插件

Coolorus2.6色轮面板PS专业色轮配色中文汉化插件最新色轮配色神器Coolorus2.6汉化版配色也可以如此简单支持PSCS6-PS2024支持WIN系统+MAC系统Coolor...

PS基础提升技能(PhotoshopCS6)只学一点

1、调整图片尺寸,主体不变形,套索工具大致圈出主体,右键建立储存选区,名称,然后编辑(有时候需要解锁,栅格化),内容识别比例,保护选择储存的名称,然后可以自由变换啦。2、衣服换色,首先复制图层,抠图蒙...

老手也要注意!PHOTOSHOP中最容易犯的10个错误

编者按:高手之路的防入坑指南!今天我们总结了10个同学们最容易中枪的错误,以及避开的方法,赶紧学起来!一、使用错误的图像模式操作菜单变成灰色?颜色看起来不对劲?当你遇到这些问题的时候,应该停下来,不要...

三种恢复方法,恢复丢失的Photoshop文件

您是否需要可靠且安全的解决方案来恢复您的Photoshop文件?当您的重要Photoshop文件丢失时,您可以尝试本文推荐的三种方法。关于Photoshop文件丢失...

Adobe Camera RAW即将中止支持PS CS6

Adobe宣布9.1.1版CameraRaw将是PhotoshopCS6的最终可用版本,这意味着ACR未来将中止对PSCS6的更新支持。如果CS6用户仍想继续获得Adobe提供的最新解码软件,则...

ps cs6里怎么换背景色

pscs6里怎么换背景色?1、首先在电脑上打开PS软件,然后在PS中打开需要处理的图片。2、接下来按快捷键“Ctrl+j”将原图层复制,防止后面的操作会对原图层损坏。3、接下来在上方工具栏中选择“选...

老手也要注意!Photoshop中最容易犯的10个错误

高手之路的防入坑指南!今天我们总结了10个同学们最容易中枪的错误,以及避开的方法,赶紧学起来!一、使用错误的图像模式操作菜单变成灰色?颜色看起来不对劲?当你遇到这些问题的时候,应该停下来,不要再编辑。...

关于PS软件版本选择的小故事:现在不学高版本,以后换版本难吗

我已经有两篇推文里都提到过为什么不用CS6以上版本的原因,一篇是特意说版本选择的(点击下方蓝色标题可进入):...

Geographic Imager mac(PS地理成像仪插件)

GeographicImagerMac版是一款Avenza公司出品的PS地理成像仪插件,GeographicImager地图插件使AdobePhotoshop空间图像可以快速高效地工作。它增加...

学平面设计,自学好还是应该报班

学平面设计,自学好还是应该报班?很多想要学习平面设计的学生都有一些疑问,学平面设计是自学好还是报平面设计培训班学好,很多人质疑平面设计培训班是否真的有用,但自学又苦于没有经验和他人的指导,今天兔课网小...