Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 文件和bundleresource://URL_Java_File_Url_Eclipse Rcp - Fatal编程技术网

Java 文件和bundleresource://URL

Java 文件和bundleresource://URL,java,file,url,eclipse-rcp,Java,File,Url,Eclipse Rcp,我已经为这个问题绞尽脑汁很长一段时间了,找不到解决这个问题的办法: 我有一个EclipseRCP应用程序,它使用打包为jar的自定义库。从插件中,我调用了jar中的一个方法。 在这个方法中,我使用this.class.getResource(relPath)来“获取”资源,而relPath是我需要的文件的硬编码相对路径。这将返回一个URL,我可以用它来构建一个文件 现在,如果我不是从插件调用这个方法,而是从一个简单的Java程序调用这个方法,那么这个方法非常有效。 区别在于:Eclipse RC

我已经为这个问题绞尽脑汁很长一段时间了,找不到解决这个问题的办法:

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

现在,如果我不是从插件调用这个方法,而是从一个简单的Java程序调用这个方法,那么这个方法非常有效。 区别在于:Eclipse RCP的类加载器返回协议
bundleresource://
URL
,这是
文件
不支持的,而在运行简单Java程序时,会返回
文件://
-URL,这对于构建
文件
来说是完全正确的

我知道Eclipse SDK的
FileLocator
-类(它将bundleresource URL解析为文件URL),但我不能在库中使用它,因为我不想将它绑定到Eclipse RCP平台-应该也可以从非Eclipse RCP源使用此库

有人知道我如何从相对路径加载此资源,并且在从EclipseRCP插件或任何其他客户端调用该方法时都能工作吗

我需要在这个相对路径的目录上构造一个
文件
,以便在其中搜索文件。我完全被困在这个

更新:如果除使用之外还有其他可能获取目录内容,这将对我有所帮助


非常感谢任何提示,

使用
类中的方法枚举jar文件中的文件是不可能的。您需要创建
resourcelist
文件,该文件将包含所有资源名称,或者打开jar文件(如zip存档)并枚举文件(如zip存档)<代码>文件
类不能处理除
文件://
以外的协议。如果您的重新源在jar文件中,您应该使用
Url
类并使用
Url.openSteram
方法获取流来获取文件内容


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

您不能简单地反转依赖关系吗。也就是说,您的模块通过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的情况下获得任何BundleResourceURL,所以这应该是可行的

干杯,
Jens

你能列出相关代码吗?@TonnyMadsen-Hm,我可以,但基本上很简单:我使用这个.getClass().getResource(relPath)在我的类路径中加载路径。在EclipseRCP下完成时,这将返回一个bundleresource://URL,否则返回一个file://URL。尝试使用bundleresource://URL创建文件对象失败,因为文件不支持此协议。由于我需要读取“relPath”的目录内容,我被迫使用一个文件…如何将URL转换为文件?@tonymadsen new File(URL.toURI())在这种情况下,它仅适用于File://URL。。。有可插入的API可以将URL转换为流,而不是文件。这里还提到:感谢您的回答,但是文件/资源不是在jar中,而是在应用程序的类路径中的dir中。关于Url.openStream():不幸的是,使用此方法无法读取目录内容(我需要加载一个目录作为资源并检查现有文件)。在您回答之前,我已经绕过了问题本身,但这确实是一个好主意!欣赏它,并可能在下次对其进行重构:)