jar里面引用jar引发的问题

最近在优化项目看到多个 jar(A.jar B.jar C.jar) 包里面都创建了同样的 utils 类,里面代码都大同小异,于是乎就删除了这些utils类,创建了一个utils.jar 给其他jar(A.jar B.jar C.jar) 引用,然后再把 A.jar B.jar C.jar 提供给其他apk 使用,然后编译神奇的发现 A.jar B.jar C.jar 竟然找不到 utils 里面的类。

最后总结出一个结论如下:

A.jar 里面简单这样写

dependencies {
 	api files('lib/utils.jar')
}

那么 A 在生成 jar 包时是不会把utils.jar打包进去的,为啥没有深究,解决方案如下:

方案一:

M 应用依赖 A.jar 时,编译时警告找不到 utils.jar 里面的类,然后 error: Please correct the above warnings first. 报错如下

Warning: com.hsae.autosdk.vehicle.apahmi.ApaHmi: can’t find referenced class com.hsae.libutils.LogUtils
Warning: com.hsae.autosdk.vehicle.apahmi.ApaHmi: can’t find referenced class com.hsae.libutils.LogUtils
Warning: com.hsae.autosdk.vehicle.dualscreen.DualScreen: can’t find referenced class com.hsae.libutils.LogUtils
Warning: com.hsae.autosdk.vehicle.dualscreen.DualScreen: can’t find referenced class com.hsae.libutils.LogUtilsWarning: there were 52 unresolved references to classes or interfaces.
You may need to add missing library jars or update their versions.
If your code works fine without the missing classes, you can suppress
the warnings with ‘-dontwarn’ options.
(http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)
Error: Please correct the above warnings first.

只需要在 M 应用的依赖关系下添加 utils.jar 的依赖即可。
这里有一点很神奇,这里警告的是在 A 里面找不到 utils 类,为啥在 M 应用在添加对 utils 的依赖,A 里面就可以找到utils?

方案二:

添加Jar包相关的索引文件,大概的意思就是通过索引文件 让 A.jar 找到utils.jar ,可以网上搜索下相关的文章,未亲自测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 Java 引用 jar 包时,如果需要在不重启服务的情况下更新 jar 包,可以使用热部署的方式。一种实现热部署的方法是使用 Java 的自定义类加载器,具体步骤如下: 1. 创建自定义类加载器,继承自 java.lang.ClassLoader 类,并重写 findClass() 方法,用于加载 jar 包中的类。 ``` public class HotSwapClassLoader extends ClassLoader { // 构造方法,传入要加载的 jar 包路径 public HotSwapClassLoader(String jarPath) { super(); this.jarPath = jarPath; } // 加载 jar 包中的类 private byte[] getClassBytes(String className) { // 读取 jar 包中的 class 文件 // ... return classBytes; } // 重写 findClass() 方法,用于加载 jar 包中的类 @Override protected Class<?> findClass(String className) { byte[] classBytes = getClassBytes(className); return defineClass(className, classBytes, 0, classBytes.length); } } ``` 2. 创建一个线程池,用于异步加载 jar 包中的类。 ``` ExecutorService executorService = Executors.newSingleThreadExecutor(); ``` 3. 在需要更新 jar 包的时候,创建新的自定义类加载器,使用线程池异步加载新的类,并替换旧的类。 ``` // 创建新的自定义类加载器 HotSwapClassLoader newClassLoader = new HotSwapClassLoader(newJarPath); // 异步加载新的类 executorService.submit(() -> { // 遍历所有已加载的类,替换旧的类 for (String className : loadedClasses.keySet()) { Class<?> oldClass = loadedClasses.get(className); Class<?> newClass = newClassLoader.loadClass(className); if (newClass != null && newClass != oldClass) { loadedClasses.put(className, newClass); } } }); ``` 其中,loadedClasses 是一个 Map,用于存储已加载的类,key 是类名,value 是 Class 对象。在启动服务时,需要先加载一次 jar 包中的类,然后将加载的类存储到 loadedClasses 中。同时,需要在使用 jar 包中的类时,从 loadedClasses 中查找对应的 Class 对象。 这样就可以实现在不重启服务的情况下更新 jar 包中的类。需要注意的是,使用自定义类加载器容易引发一些问题,比如类加载冲突、内存泄漏等,需要开发者进行合理的处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值