我已经在这方面打了很长时间了,现在无法找到解决这个问题的方法:
我有一个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()获取目录内容之外,还可以帮助我..
任何提示都非常感谢,
答案 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://
(不确定确切的协议名称)。