编译期的代码注入方法技术

技术编号:28497357 阅读:19 留言:0更新日期:2021-05-19 22:33
本申请实施例提出了编译期的代码注入方法,包括在目标项目中确定替换代码所在包的依赖关系,基于依赖关系对替换代码进行编译,得到class打包文件;将replaced

【技术实现步骤摘要】
编译期的代码注入方法


[0001]本申请属于代码开发领域,尤其涉及编译期的代码注入方法。

技术介绍

[0002]在软件研发中,一些场景下我们需要替换项目依赖包中的代码以实现特殊的行为,比如某个依赖包下的某一段代码有Bug(缺陷)需要修正,再比如希望在发送HTTP请求前统一修改请求信息(如加上请求头、修改HOST等)但相应的HTTP处理依赖包并没有提供相应的修改API接口。
[0003]目前常见的实现方案有:
[0004]1、修改依赖包代码,重新打包出新的分支,项目依赖改成到此分支上。
[0005]2、把依赖包及其对应的祖父级依赖的代码都复制到项目中并删除相应的依赖包,然后在项目中直接修改。
[0006]但是专利技术人发现,方案1需要打出新的依赖分支,导致需要同步维护主干版本与分支版本,对于只对依赖做简单修改(比如依赖包有1000个文件,需求上只要修改1个文件)的情况下这一方案成本太高;方案2需要分析依赖关系,复制所有的依赖代码到项目,这极不利于项目的维护;方案3仅在项目为可执行程序时有效,当项目为类库会被其它项目依赖时(比如要修改的依赖为dep_x.jar,当前项目为lab_x.jar,被另一个项目serv_x.jar依赖,形成serv_x.jar依赖于lab_x.jar,lab_x.jar又依赖于dep_x.jar,而dep_x.jar的代码被lab_x.jar重写了)由于JVM加载的机制会导致加载依赖包顺序的不确定性,当原依赖包(dep_x.jar)先于类库项目(lab_x.jar)加载时,后者修改的代码会失效。

技术实现思路

[0007]本申请实施例提出了编译期的代码注入方法,由于只需要添加一个Maven/Gradle plugin,不修改原项目的业务代码,不用修改运行时参数,不引入额外的运行时依赖。
[0008]具体的,本申请提出的编译期的代码注入方法,所述方法包括:
[0009]在目标项目中确定替换代码所在包的依赖关系,基于依赖关系对替换代码进行编译,得到class打包文件;
[0010]将replaced

proj插件添加至Maven管理工具中,在Maven管理工具中对class打包文件进行解析得到替换代码,对依赖库进行遍历,判断是否存在可替换代码集合;
[0011]如果存在,则将替换代码写入目标项目的预设路径。
[0012]可选的,所述在目标项目中确定替换代码所在包的依赖关系,基于依赖关系对替换代码进行编译,得到class打包文件,包括:
[0013]在目标项目中确定并添加替换代码所在包的依赖关系;
[0014]使用标准的包结构组织编写替换代码逻辑;
[0015]在Maven管理工具中基于得到的替换代码逻辑进行编译,生成class文件;
[0016]在Maven管理工具中对得到的class文件进行打包得到class打包文件。
[0017]可选的,所述在目标项目中确定并添加替换代码所在包的依赖关系,包括:
[0018]统一修改HTTP请求的host文件,在host文件中的profile字段中增加替换代码所在包的依赖关系。
[0019]可选的,所述在Maven管理工具中基于得到的替换代码逻辑进行编译生成class文件,包括:
[0020]复制编写的代码到src/test/java及src/test/resources下;
[0021]执行Maven管理工具的compile完成编译;
[0022]复制编译后的class及资源文件到src/main/resources/<替换类库的groupId>#<替换类库的artifact>#<替换类库的version>下。
[0023]可选的,所述将replaced

proj插件添加至Maven管理工具中,在Maven管理工具中对class打包文件进行解析得到替换代码,对依赖库进行遍历,判断是否存在可替换代码集合,包括:
[0024]添加replaced

proj插件:将replaced

proj作为标准的Maven插件添加到target

proj的Maven Build下;
[0025]执行Maven的compile命令,触发inject

plugin中的注入操作;
[0026]打包并发布,执行Maven的打包及发布命令,完成target

proj的处理。
[0027]可选的,所述执行Maven的compile命令,触发inject

plugin中的注入操作,包括:
[0028]解压replaced

proj获取可替换的代码:获取replaced

proj中的src/main/resources/下编译后的可替换的代码集合,记作c1;
[0029]分析目标项目的依赖类库:获取当前项目的所有依赖类库,记作c2;
[0030]依赖类库与可替换的代码取交集,确定要替换的代码:遍历依赖类库集合c2,对比是否存在于结果集合c1中。
[0031]可选的,所述如果存在,则将替换代码写入目标项目的预设路径,包括:
[0032]如果存在则表示当前为要替换的代码;
[0033]将确定要替换的代码写入target/classes中。
[0034]有益效果:
[0035]1.侵入性低,只需要添加一个Maven/Gradle plugin,不修改原项目的业务代码,不用修改运行时参数,不引入额外的运行时依赖。
[0036]2.通用性强,所有基于Maven/Gradle的JVM项目都适用。
[0037]3.开发简单,基于自动化的流程,只需关注要修改的代码本身。
附图说明
[0038]为了更清楚地说明本申请的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0039]图1为本申请提出的编译期的代码注入方法的流程示意图;
[0040]图2为本申请提出的编译期的代码注入方法应用的模块架构图。
具体实施方式
[0041]为使本申请的结构和优点更加清楚,下面将结合附图对本申请的结构作进一步地描述。
[0042]具体的,本申请提出的编译期的代码注入方法,如图1所示,所述方法包括:
[0043]11、在目标项目中确定替换代码所在包的依赖关系,基于依赖关系对替换代码进行编译,得到class打包文件;
[0044]12、将replaced

pro本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.编译期的代码注入方法,其特征在于,所述方法包括:在目标项目中确定替换代码所在包的依赖关系,基于依赖关系对替换代码进行编译,得到class打包文件;将replaced

proj插件添加至Maven管理工具中,在Maven管理工具中对class打包文件进行解析得到替换代码,对依赖库进行遍历,判断是否存在可替换代码集合;如果存在,则将替换代码写入目标项目的预设路径。2.根据权利要求1所述的编译期的代码注入方法,其特征在于,所述在目标项目中确定替换代码所在包的依赖关系,基于依赖关系对替换代码进行编译,得到class打包文件,包括:在目标项目中确定并添加替换代码所在包的依赖关系;使用标准的包结构组织编写替换代码逻辑;在Maven管理工具中基于得到的替换代码逻辑进行编译,生成class文件;在Maven管理工具中对得到的class文件进行打包得到class打包文件。3.根据权利要求2所述的编译期的代码注入方法,其特征在于,所述在目标项目中确定并添加替换代码所在包的依赖关系,包括:统一修改HTTP请求的host文件,在host文件中的profile字段中增加替换代码所在包的依赖关系。4.根据权利要求2所述的编译期的代码注入方法,其特征在于,所述在Maven管理工具中基于得到的替换代码逻辑进行编译生成class文件,包括:复制编写的代码到src/test/java及src/test/resources下;执行Maven管理工具的compile完成编译;复制编译后的class及资源文件到src/main/resources/<替换类库的groupId>#<替换类库的artifact>#<替换类库的versi...

【专利技术属性】
技术研发人员:于亚丰覃兆俊陈立何国平宋修虎陈怀狮王永平徐志安严伟赵丽丽周强钱华陈依婷
申请(专利权)人:浙江华云信息科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1