简体   繁体   中英

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:

在此处输入图像描述

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.. ?

  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";

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM