Asif
Asif

Reputation: 5038

How can I get a URL from relative path under a jar?

What I have done so far is :

/** Default location of help files folder */
private static final String DEFAULT_PATH = "../../../../resources/files/help/";
/** A 404 error file */
private static final String ERROR_404 = "../../../../resources/files/help/404.html";

/**
 * @param fileName
 * @return The URL of file, if found at default location, otherwise a 404 error page URL.
 */
public static URL getURL(String fileName) throws MalformedURLException{
    URL url = (new File(ERROR_404)).toURI().toURL();
    System.out.println(url);
    url = (new File(DEFAULT_PATH + fileName)).toURI().toURL();
    System.out.println(url);
    return url;
}

Output:

file:/H:/My%20Project/Project%20Name%20Module/../../../../resources/files/help/404.html file:/H:/My%20Project/Project%20Name%20Module/../../../../resources/files/help/plazaCode.html

Folder Hierarchy in the JAR created through NetBeans:

enter image description here

I am on Windows 7, JDK 7.

UPDATE:

Actually I want this URL for a JTextPane to show a HTML page by method:

textPane.setPage(URL url);

Can I have any better solution than this? and with the same Folder Heirarchy.. ?

Upvotes: 0

Views: 1378

Answers (3)

Andrew Thompson
Andrew Thompson

Reputation: 168825

  1. 404.html since this is an application resource, it will probably end up embedded in a Jar.
  2. Resources in archives cannot be accessed using a File object.
  3. URL getURL(String fileName) To help avoid confusion, change that to URL getURL(String resourceName).
  4. Use Class.getResource(String) much as discussed on your previous questions.
  5. 'Relative' URLs become dangerous by that stage, since they depend on the package of the class that calls them, I generally make them 'absolute' by prefixing the entire path with a single / which effectively means 'look for this resource, from the root of the run-time class-path'.

So that String might read (adjusting the rest of the code as already advised):

private static final String ERROR_404 = "/resources/files/help/404.html";

Upvotes: 1

Joop Eggen
Joop Eggen

Reputation: 109547

You can use URL url = getClass().getResource("..."). Probably "/files/help/404.html".

Upvotes: 1

Angelo Fuchs
Angelo Fuchs

Reputation: 9941

When you create a File in this way you will get a relative file (and therefore a relative URL). To get a absolute URL from that path you need to get an absolute File first. Try this:

new File(ERROR_404).getCanonicalFile().toURI().toURL()

(EDIT: After you JTextPane information above) I haven't ever tried this, so I have no clue on why that's not working. But its a different question, you should ask a new Question.

Upvotes: 0

Related Questions