V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Aresxue
V2EX  ›  Java

如何有效区分一个类是业务自己编写的类还是依赖引入的类?

  •  
  •   Aresxue · 2023-03-08 17:11:35 +08:00 · 1531 次点击
    这是一个创建于 655 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目结构如下:

    xxx(project)

    -- xxx-api(module)

    -- xxx-core(module)

    -- xxx-starter(module)

    项目是一个 maven 的父子项目有 api 、core 、starter 三个模块,有一个诉求是区分一个类是这三个模块里面的还是其它三方库里面的。本身 maven 在打包后所有 jar 都是平铺的并没有区分业务 jar 和依赖 jar ,所以差异要在 maven 打包之前或进行时完成,简单实现的思路就是打包时在业务 jar 中写入一个 index 文件来做区分,但这样一来每个类要先获取自身所在的 jar 然后再做判断感觉非常的不优雅,自认为比较理想的实现是在类上打标记,在编译时将所有业务类都打标,但是一直没有想到比较好的实现方式,有做过类似诉求的小伙伴可以指教一下。

    第 1 条附言  ·  2023-03-09 10:47:55 +08:00
    --------------------
    描述的可能还不是很详尽,先描述下目的:
    公司在迭代中台,技术中台提供了一个技术方案用来做平台(业务中台)和业务的分离,这个技术方案通过自定义 container 和 classloader 实现,以完成平台逻辑和业务逻辑分离以及业务与业务之间的隔离( A 业务有问题不会影响 B 业务,新增和删除业务通过热加载和类卸载在线完成),以上为背景,在实现过程中需要上报扩展服务(可以简单理解为通过一个注解标识)的信息,本意是只想要上报自身服务的信息,但由于会引入其它应用的 api ,在这些 api 的 jar 里面也会有它们自已的扩展服务,这样就会上报不属于自己当前容器的扩展服务的信息,所以想要区分是自己定义的扩展服务还是间接依赖引入的扩展服务。

    有些兄弟提出用包名是不合适的,因为从整个项目来说包名都是不确定的,比如 A 项目的包名是 com.xxx.A ,B 项目是 com.xxx.B ,我想要的只有 com.xxx.A ,这些包名是不确定的,通过包名是不太准确也有点 low 的。
    5 条回复    2023-03-14 23:17:31 +08:00
    RedBeanIce
        1
    RedBeanIce  
       2023-03-08 19:22:54 +08:00
    区分业务 jar 和依赖 jar ,所以差异要在 maven 打包之前或进行时完成

    请问一下,区分完了之后,会做什么呢。。打标。打标的作用是什么呢。
    cheng6563
        2
    cheng6563  
       2023-03-08 19:39:36 +08:00
    你没包名吗
    WillingXyz
        3
    WillingXyz  
       2023-03-08 19:40:02 +08:00
    用注解处理器,在编译时在每个类上自动加上注解
    lyxeno
        4
    lyxeno  
       2023-03-08 20:57:32 +08:00
    用包名区分?
    getClass().getPackage().getName()

    但是你这区分出来有啥用吗
    choice4
        5
    choice4  
       2023-03-14 23:17:31 +08:00
    已经提到的一点问题就是目前打包的 jar 是平铺的,如果不怕费事:
    1. 可以使用 maven-dependency-plugin 把这几个依赖项 unpack 到 classes 下一个目录进行打包,同时自定义类加载器适配 jar 内这个目录下的那些类。
    2.也可以直接做 shade 配合 relocation,只是会影响运行时类名,在提供二方三方使用时需要注意,反射也需要注意。

    我使用过方案一完成过一些功能,和你需求不一样但应该能达到一样的效果。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2581 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:58 · PVG 18:58 · LAX 02:58 · JFK 05:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.