论坛首页 Java企业应用论坛

OSGI如何读取插件中的资源文件

浏览 9907 次
精华帖 (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()
也是可以取到的



   发表时间: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来复制特定后缀的资源文件。

0 请登录后投票
   发表时间: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不对应时,就会取不到资源文件。
0 请登录后投票
   发表时间: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环境下失效吗?

0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2011-11-16  

如果这样,那就很麻烦了。外部资源文件很容易丢失的。或者有一种办法,把资源文件编译成.class文件,就像jsp那样,这样就可以像使用java类对象一样使用资源了。
1 请登录后投票
   发表时间:2011-11-16  
恩,楼上buaawhl的说的也是一个好的思路,呵呵
0 请登录后投票
   发表时间:2011-11-16  
LZ是个妞
0 请登录后投票
   发表时间:2011-11-16  
troyconder 写道
LZ是个妞

瞎说。。。
0 请登录后投票
   发表时间:2011-11-16  
Thread.currentThread().getContextClassLoader().getResource()
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics