如何在独立开发的JAR包中使用来自原项目的Bean方法
抽取独立JAR时兼容原项目Bean依赖的可落地方案
针对你要把指定Java类从原项目抽取成独立可复用JAR,且保留对原项目Bean组件调用逻辑的场景,共有三类经过生产验证的可行实现路径,完全适配你给出的方法调用逻辑:
方案1:编译期关联、运行期外置依赖(改动最小,优先推荐)
这是适配现有代码零业务改动的实现方式:
- 打JAR时,仅打包你需要复用的目标业务类,不要把原项目的MyBean、Direct等依赖类硬打包进JAR文件
- 编译阶段,将原项目中包含这些Bean组件的模块/公共包配置为编译期依赖(Maven/Gradle中把对应依赖的scope设为
provided),保证目标类可以正常编译通过 - 运行阶段,由所有引入这个新JAR的业务项目,自行在自身的依赖路径中引入对应的MyBean、Direct类实现即可
- 对你给出的示例代码完全兼容:代码中
new MyBean(icp + msm.getProduct().getProduct().getId())、dr.takeTranactionStr(bean)、dr.getTransaction().add(bean)这类调用,只要运行期classpath存在对应类的正确实现,即可正常执行,不需要修改原有业务逻辑
注意:打JAR时务必关闭“打包传递依赖”的配置,避免把原项目的Bean类混进JAR引发类加载冲突。
方案2:接口解耦(适配跨项目通用复用场景)
如果你的目标是让这个JAR不绑死原项目的类结构,能被不同实现的业务项目复用,就用这个方案:
- 把新JAR中用到的所有原项目Bean的方法,抽象为JAR内部自定义的独立接口,比如将Direct类的
takeTranactionStr、getTransaction能力,MyBean的构造逻辑,抽为ITransactionDirect、ITransactionBean这类接口 - 修改原有目标类的代码,把所有直接import原项目具体类的逻辑,全部替换为面向JAR内部接口的调用,彻底移除对原项目类的硬依赖
- 由每个实际使用该JAR的业务方,自行编写对应接口的实现类,把自身项目的MyBean、Direct组件逻辑做适配映射,在运行期传入JAR的业务逻辑即可
- 优势:JAR完全不依赖原项目的类定义,不会出现类名冲突,复用范围不受原项目结构限制
方案3:Shade重命名嵌套打包(仅特殊场景使用)
如果业务上必须让JAR自带原项目的Bean实现,不允许外部项目额外引入依赖,才考虑这个方案:
- 使用Shade打包插件,打JAR时把原项目需要用到的MyBean、Direct等依赖类,统一重定向到新JAR的专属包路径下(比如将原包
com.original.project.MyBean重写为com.your.newjar.shaded.com.original.project.MyBean),从根源上避免和外部项目的同名类冲突 - 风险提示:这个方案很容易漏打依赖类的传递依赖,运行时出现
ClassNotFoundException,除非没有解耦空间,否则不推荐使用。
额外提示:你给出的示例代码本身存在几处编译级笔误,比如方法参数的
Id和局部变量调用的小写id不匹配、代码块中使用的fcm、msm未在方法作用域声明,这些问题无论采用哪种方案抽JAR,都需要先修正才能正常编译。
内容的提问来源于stack exchange,提问作者WScoder
相关产品推荐
相关产品推荐

