Get the Jar Path and Handle Special Characters in Path


In my application, the class that start the application is put at %INSTALLED_APP_HOME%/lib. In my code, I need get the path of %INSTALLED_APP_HOME%.
The code looks like below[CodeWorks]
private String getBaseLocation() throws IOException {
    try {
   URL url = this.getClass().getProtectionDomain().getCodeSource()
          .getLocation();
      File jarPath = new File(url.toURI()); 
      // NOT File jarPath = new File(url.getPath());
      String baseLocation = jarPath.getParentFile().getParent();
   return baseLocation;
      }
    } catch (Exception e) {
      throw new IOException(e);
    }
  }



The only trick here is this line: File jarPath = new File(url.toURI()); 
If we change to File jarPath = new File(url.getPath()); It will not work. This is the path in the url is encoded(not completely), for example space is converted to %20.
if the url is: "C:/jeffery/project/jeffery + project/lib, url.getPath()" would be "C:/jeffery/project/jeffery%20+%20project/lib".
File jarPath = new File(url.getPath()) obviously would points to wrong (not exist ) location.

Then I tried 
baseLocation = URLDecoder.decode(baseLocation, System.getProperty("file.encoding"));
In most case it woors, but it DOES NOT work when the path contains +. Because URLDecoder.decode will convert + in the original path to a space " " improperly. 
The base location would be" C:/jeffery/project/jeffery  project/lib - two space between jeffery and project because + is convert to space " " improperly.

The correct code should be like in section [CodeWorks].

Alternatively, we can use:
String baseLocation = jarPath.getParentFile().getParent();
baseLocation = baseLocation.replace("+", "%2B"); // add this line
baseLocation = URLDecoder.decode(baseLocation, System.getProperty("file.encoding")
Resource
http://stackoverflow.com/questions/320542/how-to-get-the-path-of-a-running-jar-file

Labels

adsense (5) Algorithm (69) Algorithm Series (35) Android (7) ANT (6) bat (8) Big Data (7) Blogger (14) Bugs (6) Cache (5) Chrome (19) Code Example (29) Code Quality (7) Coding Skills (5) Database (7) Debug (16) Design (5) Dev Tips (63) Eclipse (32) Git (5) Google (33) Guava (7) How to (9) Http Client (8) IDE (7) Interview (88) J2EE (13) J2SE (49) Java (186) JavaScript (27) JSON (7) Learning code (9) Lesson Learned (6) Linux (26) Lucene-Solr (112) Mac (10) Maven (8) Network (9) Nutch2 (18) Performance (9) PowerShell (11) Problem Solving (11) Programmer Skills (6) regex (5) Scala (6) Security (9) Soft Skills (38) Spring (22) System Design (11) Testing (7) Text Mining (14) Tips (17) Tools (24) Troubleshooting (29) UIMA (9) Web Development (19) Windows (21) xml (5)