Java 文件和bundleresource://URL
我已经为这个问题绞尽脑汁很长一段时间了,找不到解决这个问题的办法: 我有一个EclipseRCP应用程序,它使用打包为jar的自定义库。从插件中,我调用了jar中的一个方法。 在这个方法中,我使用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
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():不幸的是,使用此方法无法读取目录内容(我需要加载一个目录作为资源并检查现有文件)。在您回答之前,我已经绕过了问题本身,但这确实是一个好主意!欣赏它,并可能在下次对其进行重构:)