两个jar包中,有相同资源,如何加载。

两个jar包中,有相同资源,如何加载。

现在有AAA.jar和BBB.jar, 每个jar中有一个test.properties的文件,下面代码实现如何进行加载这两个同名文件。


效果,可以实现jar的可随意加载和拆卸

如:实现一个功能框架,对数据库每一种数据的一种处理方式,现在又一个新的类型的数据,我只需要新写个jar,里面放上这么一个文件。

框架每次启动时,都会读指定名称的资源配置文件,通过这个资源文件找到这个jar包的入库类。一般这个类需要实现一个指定接口,便于框架调用。

这样增加一个全新的实现,框架不修改任何代码和配置,新jar包安装标准默认方式,就可以参与运行。

public static void main(String[] args) {

        try {
            Enumeration<URL> ps = Thread.currentThread().getContextClassLoader().getResources("test.properties");

            while (ps.hasMoreElements()) {
                InputStream in = null;
                try {
                    in = ps.nextElement().openStream();
                    Properties p = new Properties();
                    p.load(in);
                    System.out.println(p.getProperty("config.dir"));
                }
                finally {
                    if (in != null) {
                        try {
                            in.close();
                        }
                        catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }

        }
        catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

    }


其实实现这个功能,还有一个方式,就是框架类加载一个指定名称的类,这个类在客户化jar包中实现。这样可以动态更换实现类,

这种方式的缺点是,每次执行有一种处理方式被加载到内存中。


第一种方式,性能是个问题点。

第二种方式,处理多类型数据上存在缺陷。


其实目的就是动态扩展

实际项目中可以通过Spring(applicationContext.getBeansOfType(class))取的指定实现某个类的一批bean来加载扩展类,实现动态扩展


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Spring Boot,如果两个不同jar包包含相同的包名和类名,那么在加载两个jar包时可能会出现冲突。 当我们启动Spring Boot应用时,会依次加载classpath下的所有jar包。在加载过程,如果发现两个jar包存在相同的包名和类名,Spring Boot将无法区分它们,从而导致加载冲突。 为了解决这个问题,可以使用以下方式之一: 1. 排除冲突类:在pom.xml(maven项目)或build.gradle(gradle项目),对引入的冲突jar包进行排除的操作。可以将其一个jar包排除掉,从而避免加载冲突。 2. 修改包名:如果可以更改jar包的代码,可以尝试修改其一个jar包的包名或类名,使其与另一个jar包的包名或类名不再冲突。然后重新打包并引入修改后的jar包。 3. 使用ClassLoader隔离:可以自定义一个ClassLoader来加载一个冲突的jar包。通过使用不同的ClassLoader,可以实现对每个jar包的独立加载,从而避免冲突。 需要注意的是,在解决这个问题时,我们应该谨慎确保冲突的jar包不会影响应用程序的运行,同时应该尽量避免引入具有相同包名和类名的jar包。如果无法避免这种情况,我们可以使用上述方法的一种来解决冲突问题。 ### 回答2: 当一个应用程序存在两个包含相同的包名和类名的jar包时,Spring Boot会根据默认的类加载机制来加载类。默认情况下,Spring Boot使用的是Java的标准类加载器来加载类,而标准类加载器遵循委派模型。 根据委派模型,当需要加载一个类时,标准类加载器会首先检查自身是否已经加载了这个类。如果已经加载,则直接返回该类的实例;如果没有加载,则会将这个类的加载请求委派给父类加载器进行处理。 在这种情况下,当存在两个包含相同包名和类名的jar包时,标准类加载器会根据类加载路径的顺序逐个加载这些jar包,直到找到所需的类。如果两个jar包的类都符合要求,那么标准类加载器会选择路径上先出现的那个jar包的类作为被加载的类。 如果开发者想要显式地选择使用其一个jar包的类,可以通过修改类加载路径的顺序来实现。可以在Spring Boot的配置文件(application.properties或application.yml)将依赖的jar包添加到`spring.autoconfigure.exclude`属性,使得在加载类时跳过不需要的jar包。 总结起来,当存在两个包含相同包名和类名的jar包时,Spring Boot会根据标准类加载器的委派机制来加载类。可以通过配置类加载路径的顺序来明确选择所需的jar包的类。 ### 回答3: 在Spring Boot存在两个包含完全相同包名和类名的jar包,这会导致加载问题。当程序运行时,ClassLoader会按照特定的顺序搜索类文件加载到内存。由于这两个jar包的类名和包名完全相同,ClassLoader会优先加载位于Classpath的第一个jar包的类。 如果这两个jar包的类内容相同,不会出现任何问题,因为ClassLoader只会加载一个类。但是,如果这两个类内容不同,将会导致加载错误,程序可能无法正常运行。 为了解决这个问题,我们可以采取以下几种方法: 1. 删除重复的jar包:如果这两个jar包是由于误操作或其他原因导致了重复的,我们可以通过删除其一个来解决问题。 2. 修改类的包名:如果两个类内容不同但包名相同,我们可以通过修改其一个类的包名来避免冲突。 3. 使用不同的ClassLoader加载:我们可以通过自定义ClassLoader加载一个jar包,从而避免冲突。可以通过在Spring Boot的启动类指定ClassLoader实现这一点。 总之,解决Spring Boot两个包含完全相同包名和类名的jar包加载问题的方法是删除重复的jar包、修改包名或使用不同的ClassLoader加载。通过这些方式,我们可以避免加载错误并确保程序的正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值