两个jar里面有同包名同名的类,如何区分调用?

今天boss提了这样一个问题:在导入的两个jar包中有两个同包同类名的类,在调用时如何区分调用的是哪个?

以前学习时我们总是被告诫尽量避免同名类出现,没怎么了解这方面的问题。boss说只要将classpath中要调用的jar路径放在前面导入即可,不太理解。在网上查询后得知,这与JVM的加载有关:

      包名类名都相同,那jvm没法区分了,一般ide是会提示发生冲突而报错的,如果不报错的,那就只有第一个包被引入(在classpath路径下排在前面的包),第二个包会在classloader加载类时判断重复而忽略。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当你尝试在一个项目中使用两个或更多的相同包名名的JAR(Java ARchive,即jar文件)时,如果它们包含同一或方法,可能会发生冲突。这种冲突通常发生在你试图替换或扩展某个库的功能时。原始jar文件中的会覆盖或优先于重写jar文件中的,这可能导致意想不到的行为,尤其是在加载机制中。 以下是一些可能遇到的问题: 1. 加载顺序问题:如果原始jar路径(Classpath)中位于重写jar之前,那么原始将被加载,即使重写jar中提供了不同实现。 2. 方法覆盖:如果两个jar有同名的方法,且签名(参数列表和返回型)相同调用时可能会执行的是原始版本,除非明确指定了特定版本。 3. 依赖问题:如果重写jar依赖于原始jar的其他部分,而这些部分未被正确替换,可能会导致运行时错误。 为了解决这冲突,你可以考虑以下几种策略: 1. **修改加载顺序**:通过调整路径或使用`javaagent`来改变加载顺序,确保重写jar先于原始jar加载。 2. **使用模块系统(Java 9+)**:利用模块化,可以将相关的和依赖分开,避免直接冲突。 3. **命名空间**:为重写的部分添加不同的包名或前缀,使其与原始版本区分开。 4. **替换依赖**:在构建时替换掉原始jar,确保只使用你想要的重写版本。 5. **使用代理或适配器**:如果可能,创建适配器将原始API包装在自己的实现中,避免直接修改核心库。 如果你有具体的冲突实例,我可以提供更详细的解决方案或分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值