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

解决了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 软件打包发布方法

    在实际操作中,可能会遇到一些特定问题,如依赖冲突、资源优化等,这需要根据实际情况进行调整和解决。同时,持续关注Eclipse RCP的更新和社区支持,可以帮助你更好地利用这个平台的优势,提升开发效率和用户体验。

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

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

    RCP产品打包成exe文件

    打包时,需要考虑如何实现这一功能,比如通过p2(Eclipse的更新管理器)或者自定义的更新服务。 7. **测试和兼容性**: 在打包完成后,进行全面的测试以确保exe文件在不同版本的Windows系统和硬件配置上都能正常工作...

    rcp与spring集成的一个简单例子

    3. **加载Spring上下文**:在RCP应用启动时,需要加载Spring配置文件,创建ApplicationContext。这通常在RCP应用的启动类或者初始化方法中完成。 4. **注入Spring Bean**:在RCP组件(如ViewPart或EditorPart)中,...

    RCP 嵌入Google map(rcp执行JavaScrit方法,解决打包后路径问题)

    本文将深入探讨如何在RCP应用中实现这一功能,以及如何解决打包后JavaScript方法调用及资源路径的问题。 首先,集成Google Maps通常涉及到以下几个步骤: 1. 获取API密钥:在Google Cloud Console中创建一个新的...

    Eclipse RCP与Spring OSGi技术详解与最佳实践

    以及Eclipse RCP扩展的使用和扩展点的开发,掌握这些技术知识的读者将能构建一个结构完整的Eclipse RCP软件,并解决软件开发过程中遇到的故障;实战篇(第13-15章)详细讲解了Eclipse RCP与Spring OSGi框架、...

    Eclipse RCP+Spring建胖客户端Web程序

    ### Eclipse RCP+Spring构建富客户端Web程序 #### 摘要 随着技术的发展和用户需求的变化,构建高效、响应迅速且用户体验良好的客户端应用变得尤为重要。传统的Web 2.0和丰富的互联网应用(RIA)虽然流行,但在某些...

    RCP程序设计教程打包

    在学习过程中,不断实践和调试是提升能力的关键,同时,利用Eclipse社区丰富的资源和活跃的论坛,能帮你解决遇到的问题,加速学习进程。记得,RCP的威力在于其灵活性和扩展性,所以,掌握好基础,不断探索和创新,你...

    spring rcp 经典教程

    - **开发者邮件列表**:springframework-rcp-dev@lists.sourceforge.net,用于开发者之间的交流和问题解答。 - **问题跟踪系统**:http://opensource2.atlassian.com/projects/spring,用于提交和追踪项目的bug和新...

    RCP项目导出exe 步骤

    RCP导出EXE 老大难问题。 RCp 程序导出步骤,保证能够导出~

    Spring RCP RichClient 开发参考手册

    通过本手册的深入学习,开发者不仅能够掌握Spring RCP的关键技术点,还能够灵活运用这些知识解决实际项目中的问题,提升应用的用户体验和性能表现。无论是初学者还是有经验的开发者,都能从中获得宝贵的指导和灵感。

    RCP,RCP开发

    5. **打包与部署**:将RCP应用打包成可执行文件,供用户安装和使用。 总的来说,RCP和OSGI的结合提供了一种高效、灵活且易于维护的桌面应用开发方式,开发者可以充分利用它们的优势来构建复杂、功能丰富的应用程序...

    TC13-Teamcenter开发模式之RCP-Eclipse 配置手册

    4. **配置Debug Configurations**:在调试配置中设定必要的参数,使调试过程能准确地定位和解决问题。 5. **新建插件工程**:创建一个新的Eclipse插件项目,作为Teamcenter功能的开发起点。 6. **运行新建的工程**:...

    spring rcp

    标题 "spring rcp" 暗示我们要讨论的是Spring Rich Client(Spring RCP)平台,这是一个基于Spring框架的桌面应用程序开发平台。Spring RCP提供了一种利用Spring的强大功能来构建可扩展、模块化的桌面应用的方法。 ...

    RCP插件集成配置视频方案

    5. **打包与部署**:使用PDE工具将所有插件打包成可执行的RCP应用程序,以便在不同环境中运行。 在提供的资源中,“RCP插件配置说明.txt”文件很可能是详细的文字教程,涵盖了上述步骤的关键细节。而“RCP插件配置...

    RCP 常见的扩展点指南

    "RCP 常见的扩展点指南" RCP(Rich Client Platform)是 Eclipse 基金会推出的一个基于 Java 的开源平台,旨在提供一个通用的客户端应用程序开发平台。RCP 的扩展点是其核心组成部分之一,本节将详细介绍 RCP 的...

    RCP程序中集成其他插件的配置方法

    5. **运行时配置**: 更新RCP程序的启动配置,确保新的插件被包含在运行时环境中。这可以通过修改`.product`文件或使用Eclipse的运行配置来实现。 6. **测试与调试**: 编译并运行RCP程序,测试新插件是否能正常工作...

    Eclipse+RCP+Spring+OSGi

    比较好的OSGi学习教程,分享给大家,简单易学...。。。

Global site tag (gtag.js) - Google Analytics