锁定老帖子 主题:OSGI如何读取插件中的资源文件
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-11-16
最后修改:2011-11-16
思路就是通过bundleContext来取得资源。
首先,要在对应的插件中先建立一个Activator需要实现BundleActivator接口, 代码: import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; public class Activator implements BundleActivator { private static BundleContext bundleContext; public static BundleContext getBundleContext() { return bundleContext; } public void start(BundleContext context) throws Exception { Activator.bundleContext = context; } public void stop(BundleContext context) throws Exception { } } 然后再需要查找资源的地方,取得bundleContext,通过bundleContext的getResource方法取得URL类型的resource,代码: public static InputStream getResourceByContext(String path) { try { BundleContext bundleContext = Activator.getBundleContext(); URL resource = bundleContext.getBundle().getResource("/web" + path); InputStream in = resource.openStream(); if (in == null) { String msg = "\nNot found \"" + path + "\";"; log.error(msg); } return in; } catch (IOException e) { e.printStackTrace(); } finally { } return null; } 注意这里的路径,是从直接写工程文件夹下开始写。 另外,楼下说的 Thread.currentThread().getContextClassLoader().getResource() 也是可以取到的 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-11-16
最后修改:2011-11-16
一个小建议。 资源文件最好和发布的.class文件放在一起,用class loader的api获取。class loader可以获取class path下所有的文件,包括jar包内的。 这样打成jar包发布的时候,可以把资源文件一起打进去,也可以正确地获取资源文件。 buaawhl 写道 更好的做法是使用ClassLoader的getResource ( path ) 或者 getSystemResource ( path ) 方法。这两个方法能够获取classpath中的文件,包括jar包里面的文件。比如: javax.servlet.ServletContext.class.getClassLoader().getResource( "javax/servlet/ServletContext.class") 得到的结果是 jar:file:/${webserver}/lib/servlet-api.jar!/javax/servlet/ServletContext.class 假设web.ListController是web应用中的一个类。 web.ListController.class.getClassLoader().getResource("web/ListController.class") 得到的结果是 file:/${webapp}/WEB-INF/classes/web/ListController.class web.ListController.class.getClassLoader().getResource("messages.properties") 得到的结果是 file:/ ${webapp}/WEB-INF/classes/messages.properties 引自 http://www.iteye.com/topic/1116761 资源文件在集成开发环境中管理的方式,一般是放在src目录下。集成开发环境会自动把资源文件复制到 .class 文件目录下。或者使用ant来复制特定后缀的资源文件。 |
|
返回顶楼 | |
发表时间:2011-11-16
buaawhl 写道 一个小建议。 资源文件最好和发布的.class文件放在一起,用class loader的api获取。class loader可以获取class path下所有的文件,包括jar包内的。 这样打成jar包发布的时候,可以把资源文件一起打进去,也可以正确地获取资源文件。 buaawhl 写道 更好的做法是使用ClassLoader的getResource ( path ) 或者 getSystemResource ( path ) 方法。这两个方法能够获取classpath中的文件,包括jar包里面的文件。比如: javax.servlet.ServletContext.class.getClassLoader().getResource( "javax/servlet/ServletContext.class") 得到的结果是 jar:file:/${webserver}/lib/servlet-api.jar!/javax/servlet/ServletContext.class 假设web.ListController是web应用中的一个类。 web.ListController.class.getClassLoader().getResource("web/ListController.class") 得到的结果是 file:/${webapp}/WEB-INF/classes/web/ListController.class web.ListController.class.getClassLoader().getResource("messages.properties") 得到的结果是 file:/ ${webapp}/WEB-INF/classes/messages.properties 引自 http://www.iteye.com/topic/1116761 资源文件在集成开发环境中管理的方式,一般是放在src目录下。集成开发环境会自动把资源文件复制到 .class 文件目录下。或者使用ant来复制特定后缀的资源文件。 这种获取方式在osgi环境中,每一个bundle是单独的一个classLoader,有的在框架中则是由parentClassLoader或者是由顶级的classLoader加载的,当取到的classLoader不对应时,就会取不到资源文件。 |
|
返回顶楼 | |
发表时间:2011-11-16
我给出的代码中,是假设每一个class都有一个class loader的。 只要A.class和1.txt是在同一个class path(同一个目录或者同一个jar)下,就可以用A.class的class loader来获取1.txt的路径。 如果是由parent class loader来做具体工作,应该也能找到该class path下的资源文件吧。 osgi的机制,我不是很清楚。这个规则会在osgi环境下失效吗? |
|
返回顶楼 | |
发表时间:2011-11-16
lhgyy00 写道 buaawhl 写道 一个小建议。 资源文件最好和发布的.class文件放在一起,用class loader的api获取。class loader可以获取class path下所有的文件,包括jar包内的。 这样打成jar包发布的时候,可以把资源文件一起打进去,也可以正确地获取资源文件。 buaawhl 写道 更好的做法是使用ClassLoader的getResource ( path ) 或者 getSystemResource ( path ) 方法。这两个方法能够获取classpath中的文件,包括jar包里面的文件。比如: javax.servlet.ServletContext.class.getClassLoader().getResource( "javax/servlet/ServletContext.class") 得到的结果是 jar:file:/${webserver}/lib/servlet-api.jar!/javax/servlet/ServletContext.class 假设web.ListController是web应用中的一个类。 web.ListController.class.getClassLoader().getResource("web/ListController.class") 得到的结果是 file:/${webapp}/WEB-INF/classes/web/ListController.class web.ListController.class.getClassLoader().getResource("messages.properties") 得到的结果是 file:/ ${webapp}/WEB-INF/classes/messages.properties 引自 http://www.iteye.com/topic/1116761 资源文件在集成开发环境中管理的方式,一般是放在src目录下。集成开发环境会自动把资源文件复制到 .class 文件目录下。或者使用ant来复制特定后缀的资源文件。 这种获取方式在osgi环境中,每一个bundle是单独的一个classLoader,有的在框架中则是由parentClassLoader或者是由顶级的classLoader加载的,当取到的classLoader不对应时,就会取不到资源文件。 起初我就是像你说的那样写的,但是没起作用的,跟osgi的类加载机制有关系,看你取到的是哪个classLoader了,这个具体深究我也不太清楚,也是在摸索阶段 可以参照下面这个看看,osgi的类加载: http://lhgyy00.iteye.com/blog/1218656 |
|
返回顶楼 | |
发表时间:2011-11-16
如果这样,那就很麻烦了。外部资源文件很容易丢失的。或者有一种办法,把资源文件编译成.class文件,就像jsp那样,这样就可以像使用java类对象一样使用资源了。 |
|
返回顶楼 | |
发表时间:2011-11-16
恩,楼上buaawhl的说的也是一个好的思路,呵呵
|
|
返回顶楼 | |
发表时间:2011-11-16
LZ是个妞
|
|
返回顶楼 | |
发表时间:2011-11-16
troyconder 写道 LZ是个妞 瞎说。。。 |
|
返回顶楼 | |
发表时间:2011-11-16
Thread.currentThread().getContextClassLoader().getResource()
|
|
返回顶楼 | |