quaylar
quaylar

Reputation: 2635

File and bundleresource:// URLs

I've been breaking my head over this for quite a while now and cant find a solution for this problem:

I have an Eclipse RCP application that uses a custom library packaged as jar. From the plugin, i am calling a method within the jar. Within this method, i am "getting" a resource using this.class.getResource(relPath), whereas relPath is a hardcoded relative path to a file i need. This returns me an URL which i can use to construct a File.

Now, this works perfectly if i am not calling this method from the plugin, but from a simple Java-Program. The difference: Eclipse RCP's classloader returns an URL of protocol bundleresource:// which is not supported by File, whereas when running a simple Java-program, a file://-URL is returned which is completely fine to construct a File.

I am aware of the FileLocator-class of the Eclipse SDK (which resolves bundleresource-URLs to file-URLs), but i cannot use it within the library because i dont want to tie it to the Eclipse RCP platform - it should be possible to use this lib from non-Eclipse-RCP sources as well.

Anyone any idea on how i can load this resource from a relative path in a manner that will work both when the method is called from an Eclipse RCP-Plugin or any other client?

I need to construct a File on the directory of this relative path to search for files within. I am completely stuck on this...

UPDATE: If there is a possibility other than using File#list() to get directory contents this would already help me..

any hints greatly appreciated,

Upvotes: 9

Views: 9732

Answers (2)

Jens
Jens

Reputation: 329

Couldn't you simply invert the dependency. I.e., your module retrieving the resource as URL defines an interface

interface Locator { URL resolve(URL url); }

and you can use a default implementation

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

In case of Eclipse, this default locator is to be replaced by

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

Now, your library has no dependencies to Eclipse, and you can still use the FileLocator. Since you won't get any bundleresource-URLs w/o Eclipse, this should work.

Cheers, Jens

Upvotes: 14

michael nesterenko
michael nesterenko

Reputation: 14439

That is not possible to enumerate files in jar file using methods from Class. You either need to create resourcelist file which will contain all your resources names, or open jar file like zip archive and enumerate files like in zip archive. File class can not handle protocols other than file://. If your rescource is in jar file, you should use Url class and get stream using Url.openSteram method to get file contents.

UPD regarding running simple java application: you probably does not pack it into jar file, so your classes and resources are placed in file system and not in archive. That is why you get file:// protocol. If you pack into jar file, protocol will not be file:// it will be jar:// (not sure about exact protocol name).

Upvotes: 0

Related Questions