2009-06-01 3 views
0

У меня есть приложение на Mac OS X 10.4 на рабочем столе. Мое приложение ищет папку с именем «ресурсы», в которой хранятся файлы, которые будут отображаться (хранится в том же месте, что и исполняемый JAR). Я знаю, что есть папка с именем «Ресурсы» в комплекте приложений, извините, если это запутывает, но я никогда не программировал на Mac и не знал, что это будет одно имя.Java System.getProperty («user.dir») в Mac OS X

В Windows, когда я звоню System.getProperty("user.dir") Я получаю местоположение, в котором находится исполняемый JAR-файл. Именно то, что я хотел.

Почему тогда, когда я запускаю пакет приложений, getProperty возвращает «/»? Это все. Я ожидал, что он вернет что-то вроде «/Users/user_name/Desktop"...which, где находится мой пакет приложений.

+0

Является ли фляга внутри пакета приложений (то есть папка * .app)? Вы выполняете банку, нажав на значок приложения? OS X загружает банки с помощью программы Jar Launcher. Это может привести к запутыванию родительского рабочего каталога. –

ответ

1

Это потому, что «user.dir» указывает текущий каталог пользователя, действующий при запуске JVM; в Windows это часто место JAR, если вы не указали иначе. В OSX вполне может отсутствовать представление о текущем каталоге, но, скорее всего, он имеет разные значения по умолчанию.

Хотя я никогда специально проверил этот код под OSX, вы можете попробовать это, чтобы найти каталог, из которого был загружен любой класс:

static public File getClassLocation(Class cls, boolean trmjar) { 
    ClassLoader       clsldr;              // class loader 
    URL         urlobj;              // url object 
    String        exturl;              // external form of URL 
    String        lwrurl;              // lowercase external form of URL 
    File        rtnfil;              // return file 

    if((clsldr=cls.getClassLoader())==null) { clsldr=ClassLoader.getSystemClassLoader(); } 

    if((urlobj=clsldr.getResource(cls.getName().replace('.','/')+".class"))==null) { 
     return null; 
     } 

    exturl=urlobj.toExternalForm(); 
    lwrurl=exturl.toLowerCase(); 
    while(lwrurl.startsWith("jar:") || lwrurl.startsWith("file:/")) { 
     if(lwrurl.startsWith("jar:")) { 
      if(lwrurl.indexOf("!/")!=-1) { exturl=exturl.substring(4,(exturl.indexOf("!/"))); }  // strip encapsulating "jar:" and "!/..." from JAR url 
      else       { exturl=exturl.substring(4      ); }  // strip encapsulating "jar:" 
      } 
     if(lwrurl.startsWith("file:/")) { 
      exturl=exturl.substring(6);                // strip encapsulating "file:/" 
      if(!exturl.startsWith("/")) { exturl=("/"+exturl); } 
      while(exturl.length()>1 && exturl.charAt(1)=='/') { exturl=exturl.substring(1); } 
      } 
     lwrurl=exturl.toLowerCase(); 
     } 
    exturl=java.net.URLDecoder.decode(exturl,"UTF-8"); 
    rtnfil=new File(exturl); 
    if(lwrurl.endsWith(".class") || (trmjar && lwrurl.endsWith(".jar"))) { rtnfil=rtnfil.getParentFile(); } 
    if(rtnfil.exists()) { rtnfil=rtnfil.getAbsoluteFile(); } 
    return rtnfil; 
    } 

он надежно работал на меня в течение многих лет под Windows, для всех версий Java с Java 1.

+0

Спасибо за ответ. Как я могу видеть в OSX, где работает JVM? Я не являюсь пользователем Mac. – 2009-06-01 20:57:59

+0

Спасибо за код, я дам ему попробовать и посмотреть, работает ли он. – 2009-06-01 21:01:34

+0

И, конечно, есть две отдельные вещи: местоположение исполняемого файла JVM (что должно быть неинтересно), а также расположение основного JAR, в котором он запущен, - это то, что мой код адресован. –

1

Вместо этого я использовал системное свойство «user.home» вместо «user.dir». Таким образом, мне не нужно беспокоиться о том, где находится JVM. У меня есть пакет приложений, который ссылается на мой файл jar напрямую, используя скрипт bash как исполняемый, вызываемый файлом info.plist. я всегда могу разместить файлы, которые будут отображаться приложением в доме пользователей, потому что это место всегда будет возвращать путь.

+0

Я попытался использовать user.home на mac и linux, но он либо ничего не возвращает, либо я получаю? – sttaq

Смежные вопросы