文件和bundleresource://网址

时间:2012-01-27 08:50:29

标签: java file url eclipse-rcp

我已经在这方面打了很长时间了,现在无法找到解决这个问题的方法:

我有一个Eclipse RCP应用程序,它使用打包为jar的自定义库。从插件中,我在jar中调用一个方法。 在此方法中,我使用this.class.getResource(relPath)“获取”资源,而relPath是我需要的文件的硬编码相对路径。这会返回URL,我可以使用File来构建URL

现在,如果我不是从插件中调用此方法,而是从简单的Java程序中调用此方法,则此方法非常有效。 区别:Eclipse RCP的类加载器返回bundleresource:// File协议file://File不支持,而在运行简单的Java程序时,会返回FileLocator - URL构建File

完全没问题。

我知道Eclipse SDK的{{1}} - 类(它将bundleresource-URLs解析为文件URL),但我不能在库中使用它,因为我不想将它与Eclipse RCP联系起来平台 - 也应该可以从非Eclipse-RCP源使用此库。

任何人都知道如何从一个相对路径加载这个资源,这种方式在从Eclipse RCP-Plugin或任何其他客户端调用方法时都能正常工作?

我需要在这个相对路径的目录上构建一个{{1}}来搜索其中的文件。我完全坚持这个......

更新:如果除了使用File#list()获取目录内容之外,还可以帮助我..

任何提示都非常感谢,

2 个答案:

答案 0 :(得分:13)

难道你不能简单地反转依赖关系。即,您的模块将URL检索为URL定义了一个接口

interface Locator { URL resolve(URL url); }

您可以使用默认实现

class StandaloneLocator implements Locator {
   public URL resolve(URL url) { return url; }
}

对于Eclipse,此默认定位器将替换为

class EclipseLocator implements Locator {
  public URL resolve(URL url) { return FileLocator.resolve(url); }
}

现在,您的库与Eclipse没有依赖关系,您仍然可以使用FileLocator。由于你不会得到任何没有Eclipse的bundleresource-URLs,这应该可行。

干杯, 延

答案 1 :(得分:0)

使用Class中的方法无法枚举jar文件中的文件。您需要创建包含所有资源名称的resourcelist文件,或者打开zip存档等jar文件并枚举zip存档中的文件。 File类无法处理file://以外的协议。如果你的资源是在jar文件中,你应该使用Url类并使用Url.openSteram方法获取流来获取文件内容。

UPD 关于运行简单的java应用程序:您可能没有将其打包到jar文件中,因此您的类和资源放在文件系统中而不是存档中。这就是你获得file://协议的原因。如果您打包到jar文件中,协议将不是file://它将是jar://(不确定确切的协议名称)。