`
yuguanyin
  • 浏览: 75525 次
  • 来自: ...
社区版块
存档分类
最新评论

解决了RCP打包时Spring配置的问题

阅读更多
转载 在Eclipse RCP中使用Spring或者Hibernate收藏
http://blog.csdn.net/ttodle/archive/2006/04/27/679422.aspx


新一篇: JAVA实现用系统关联的程序打开文件 | 旧一篇: 在 Ubuntu 5.10 上安裝 Sun Java SDK 1.5
在RCP中使用Spring,最关键的一点在于spring配置文件的读取,因为RCP使用自己的ClassLoader,所以用通常的方法是无法装载Spring的配置文件。解决的思路是:在读取Spring配置文件时将RCP的ClassLoader暂时换一下。

在这里我根据Spring配置文件在项目中的存放位置,给出两种办法。

一、配置文件存放在源代码根目录下。

假设我有一个叫admin_console的项目,我把Spring的配置文件myspring.xml放在源代码根据目录src下,如下图所示
admin_console
      --src
           --cn      //包名
               --com
                  --chengang
                      ---......     //源代码类
          --myspring.xml      //Spring配置文件,位于src目录下和cn目录平级
      --bin
      --lib
      --icons
      --properties


那么我们在RCP程序中可以这样来装载myspring.xml
        ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
        try {
            Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
            ctx = new ClassPathXmlApplicationContext("/myspring.xml");
        } finally {
            Thread.currentThread().setContextClassLoader(oldLoader);
        }



二、配置文件存放在项目根目录的某个子目录下

项目根目录和源代码根目录是不同的两个概念。如上图的项目结构中,src是源代码根目录,admin_console是项目根目录,那么properties就是项目根目录下的一个子目录。

如果将myspring.xml放入到properties目录中,以上的读取代码就没用了,读取方法如下:

        ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
        try {
            Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
   ctx = new FileSystemXmlApplicationContext(ProjectUtil.toFullPath("properties/myspring.xml"));
        } finally {
            Thread.currentThread().setContextClassLoader(oldLoader);
        }

其中ProjectUtil.toFullPath是我自己写的一个方法,主要是得到myspring.xml的绝对路径,其代码如下:

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.ui.plugin.AbstractUIPlugin;

import com.wxxr.management.admin.console.AdminConsolePlugin;

/**
* 用于插件项目和非插件项目,提供两者通用的方法接口
* @author chengang 2006-3-30
*/
public class ProjectUtil {

    private static AbstractUIPlugin plugin = AdminConsolePlugin.getDefault();

    private ProjectUtil() {}

    /**
     * 判断当前的运行状态是否为插件方式
     * @return true=插件方式运行
     */
    private static boolean isPlugin() {
        return plugin != null;
    }

    public static URL getURL(String path) {
        if (isPlugin())//如果是插件
            return FileLocator.find(plugin.getBundle(), new Path(path), null);
        else
            try {
                return new URL("file:" + path);
            } catch (MalformedURLException e) {
                throw new RuntimeException(path + " is error", e);
            }
    }

    public static InputStream getInputStream(String path) {
        URL url = getURL(path);
        try {
            return url.openStream();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static String toFullPath(String path) {
        if (isPlugin()) {
            try {
                return FileLocator.toFileURL(ProjectUtil.getURL(path)).getPath();
            } catch (IOException e) {
                throw new RuntimeException(path + " toFullPath is fault", e);
            }
        } else {
            return path;
        }
    }

}


三、总结

上面两种方式那一种更好呢?应该是第二种。一般来说,源代码的编译文件会打成一个jar包(其实不打成一个JAR包也可以的,我在很多以前就尝试过将class文件松散的部署,如果哪个类要修改,修改后就只部署覆盖这个 class,看起来也挺方便。不过这种方式不是最佳实践,不推荐正式发布时使用,一不心可能引起依赖它的其他类出现问题。)。如果用第一种方式在项目打包后,myspring.xml会打包到jar文件中,这样不利于今后对myspring进行动态修改。如果用第二种就没有这种缺点。

很多时候,在Eclipse开发环境中,运行RCP程序没有问题。但导出项目后,在独立的环境中却报配置文件(不光是Spring)找不到的错误,解决的方法都基本与此相同。
分享到:
评论

相关推荐

    在Eclipse RCP中应用Spring OSGI 管理bean(一)

    4. **创建Spring Extension Factory**:在Eclipse RCP中,你需要创建一个SpringExtensionFactory,这是一个特殊的工厂类,负责从OSGi服务中获取Spring配置并实例化Bean。 5. **注册OSGi服务**:将...

    rcp相关资料

    1. **企业应用解决方案**: 提供一套完整的解决方案,覆盖从表现层到业务逻辑层等多个方面,包括报表、权限管理、日志记录、国际化支持等。 2. **B/S与C/S优势互补**: 可根据实际需求选择最佳的应用模式,灵活应对...

    单点登录源码

    Spring+SpringMVC+Mybatis框架集成公共模块,包括公共配置、MybatisGenerator扩展插件、通用BaseService、工具类等。 > zheng-admin 基于bootstrap实现的响应式Material Design风格的通用后台管理系统,`zheng`...

    osgi进阶

    例如,Eclipse RCP(Rich Client Platform)、Spring Dynamic Modules和Apache Felix等都是基于OSGi的框架,它们为构建可扩展的桌面应用和服务器端应用提供了强大的支持。 在进阶学习OSGi时,你需要掌握以下内容: ...

    eclipse j2e 32位系统

    Eclipse是一款广泛使用的开源集成开发环境(IDE),尤其在Java开发者中非常流行。"Eclipse J2EE 32位系统"是指适用于32位操作系统版本的...通过实际操作,不仅可以巩固理论知识,还能锻炼解决问题和团队协作的能力。

    eclipse从入门到精通源码eclipse从入门到精通源码

    深入Eclipse源码有助于理解其工作原理,这对于开发高级插件或解决特定问题非常有帮助。学习如何导入和浏览Eclipse源码,使用调试器查看内部执行流程,理解主要组件如Workbench,Platform,以及JDT(Java Development...

    OSGI学习手册及实践

    - 在国内,尽管一些开发者可能更熟悉传统的SSH(Struts + Spring + Hibernate)框架,但在国际上,OSGI因其强大的插件开发框架和易于学习的特点而受到欢迎。随着技术的发展,预计OSGI在未来几年内也将在国内市场得到...

    eclipse-inst-mac64.tar

    这个压缩文件包含了Eclipse的安装程序,使得用户能够在苹果计算机上轻松安装和配置Eclipse。 1. **Eclipse IDE**: Eclipse 是一款强大的多语言开发平台,它提供了一整套用于编写、调试和部署应用程序的工具。它的...

Global site tag (gtag.js) - Google Analytics