关于java读取jar包中的配置文件问题

时间:2023-02-16 19:34:59
并不是简单的读取某个jar包中的文件


问题是这样的:
我的项目中有一个通用实体类包,该包包含一个持久化单元,一个持久化单元读取类,读取关键方法为:
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("META-INF/persistence.xml");

java 项目中引用了这个实体类包,项目中也有一个持久化单元,读取的都是META-INF下面的persistence.xml
所以这个项目中包含了2个持久化单元,问题也就由此而来

我通过持久化单元读取类来读取持久化单元,本来需要读取的是项目jar包的持久化单元文件,但实际上读取的是通用实体类包内的持久化单元,所以读取的是错误的
如果把通用实体类包内的持久化单元删除,那么读取的就是项目jar包内的持久化单元

怎么样才能不删除通用包实体类包内的持久化单元,而真正读取的又是我想要的内容呢,请高手们指点下

5 个解决方案

#1


不明白,不是有包名分开的吗?

#2


引用 1 楼 gulang76 的回复:
不明白,不是有包名分开的吗?

再不行你就重写你的持久化单元,覆盖掉原来的。

#3


问题很抽象 。。。。

#4


http://topic.csdn.net/u/20100601/14/BDFFF972-00C3-4E6C-B536-D96E4679D05F.html

http://topic.csdn.net/u/20091114/14/3B3615D5-B851-4563-B9DB-74DE6AF09B49.html

都是读、写、改jar包里文件的例子。

至于你的问题,我没明白。一般描述不清的设计,我都认为是错误或不好的设计。

#5


从你的代码中可以看出,你是通过SystemClassLoader,如果你用的是Sun的jdk的话,SystemClassLoader即AppClassLoader,其parent class loader为ExtClassLoader。在查找资源的时候,采用的是与加载class相同的双亲委托模式,即他会先由最顶层的BootstrapClassLoader来查找是否存在该resource,其次为ExtClassLoader,最后为AppClassLoader。如果你的通用包实体类是由AppClassLoader加载,那你可以放置你的自己的实体包到ext目录下由ExtClassLoader进行加载,这样可以保证每次加载到的总是你自己的包。但是这个导致的问题是你的包与项目结构上的脱离。所以你的实体包也必须由AppClassLoader来加载。AppClassLoader内部有一个列表来保存他需要查找的路径,他会从该路径上依次查找你要的resource。由于你的通用包总是在你自己的包之前,所以每次先找到的总是你的通用包。这个列表的顺序是你没法自定义的,所以推荐的办法是你避免资源的重名,改个名吧。

#1


不明白,不是有包名分开的吗?

#2


引用 1 楼 gulang76 的回复:
不明白,不是有包名分开的吗?

再不行你就重写你的持久化单元,覆盖掉原来的。

#3


问题很抽象 。。。。

#4


http://topic.csdn.net/u/20100601/14/BDFFF972-00C3-4E6C-B536-D96E4679D05F.html

http://topic.csdn.net/u/20091114/14/3B3615D5-B851-4563-B9DB-74DE6AF09B49.html

都是读、写、改jar包里文件的例子。

至于你的问题,我没明白。一般描述不清的设计,我都认为是错误或不好的设计。

#5


从你的代码中可以看出,你是通过SystemClassLoader,如果你用的是Sun的jdk的话,SystemClassLoader即AppClassLoader,其parent class loader为ExtClassLoader。在查找资源的时候,采用的是与加载class相同的双亲委托模式,即他会先由最顶层的BootstrapClassLoader来查找是否存在该resource,其次为ExtClassLoader,最后为AppClassLoader。如果你的通用包实体类是由AppClassLoader加载,那你可以放置你的自己的实体包到ext目录下由ExtClassLoader进行加载,这样可以保证每次加载到的总是你自己的包。但是这个导致的问题是你的包与项目结构上的脱离。所以你的实体包也必须由AppClassLoader来加载。AppClassLoader内部有一个列表来保存他需要查找的路径,他会从该路径上依次查找你要的resource。由于你的通用包总是在你自己的包之前,所以每次先找到的总是你的通用包。这个列表的顺序是你没法自定义的,所以推荐的办法是你避免资源的重名,改个名吧。