Java system.getProperty ("user.dir") дает неверный результат в Ubuntu - PullRequest
0 голосов
/ 12 октября 2009

Я разрабатываю Java-приложение, которое способно запускать кроссплатформенное с условием в версии JRE как минимум 1.6.0.14. Все отлично работает на машине с Windows (JRE1.6.0.14), но нежелательный результат в Ubuntu 8.04 с JRE1.6.0.14.

Я нашел ошибки здесь:

Document doc = docBuilder.parse (new File("webservices.xml"));

На Windows-машине все работает нормально, docBuilder будет ссылаться на файл, в котором находится мое приложение. Пример: если мое приложение находится в C: \ myApp \ start.jar, оно будет ссылаться на webservives.xml в C: \ myApp \ webservices.xml (это означает, что оно всегда будет ссылаться на правильный каталог независимо от того, куда я перемещаю папку своего приложения)

Но в Ubuntu 8.04 это не работает.

Я могу выяснить проблему, используя это в приложении:

String curDir = System.getProperty("user.dir");
System.out.println(curDir);

Независимо от того, где я размещаю папку с моим приложением, curDir всегда возвращает "/ home / user". Document doc = docBuilder.parse (new File("webservices.xml")) не работает, пока я не помещу файл webservices.xml в каталог /home/user/webservices.xml.

Запуск моего приложения с использованием Netbean 6.5.1 в Ubuntu возвращает правильный curDir, но при запуске автономного приложения возвращает неправильный curDir (я использую JDK1.6.0.14 и JRE1.6.0.14 так же, как оконный компьютер)

Почему Document doc = docBuilder.parse (new File("webservices.xml")) не может работать должным образом в Ubuntu JRE1.6.0.14?

Любая идея сделать мое приложение работать автономно в Ubuntu 8.04, как в Windows Machine?

Ответы [ 4 ]

9 голосов
/ 12 октября 2009

Не полагайтесь на текущий каталог для чтения файлов, которые поставляются с приложением. Вместо этого используйте ClassLoader.getResource () (для доступа к файлу относительно пути к классам) или Class.getResouce () для доступа к файлам внутри пакетов.

Редактировать: Вышесказанное подходит только для доступа только для чтения. Файлы, которые будут изменены, должны храниться в домашнем каталоге пользователя (системное свойство user.home), а не в каталоге приложения, поскольку последний вызывает много проблем:

  • Несколько пользователей, одновременно запускающих приложение, могут перезаписать изменения друг друга
  • Пользователи не могут легко создавать резервные копии или переносить свои данные
  • Он несовместим с должным образом защищенной системой пользовательских привилегий, где обычные пользователи не имеют доступа на запись в каталоги приложений, чтобы предотвратить заражение приложений вирусами.

Для небольших объемов данных вы можете использовать API настроек Java .

Edit2 : Для этого конкретного требования это должно работать (необходимо, чтобы файл находился в пути к классам):

Document doc = docBuilder.parse (
    new File(getClass().getClassLoader().getResource("webservices.xml").toURI()););
7 голосов
/ 12 октября 2009

System.getProperty("user.dir") возвращает текущий каталог, в котором пользователь выполняет программу, а не где она находится.

2 голосов
/ 12 октября 2009

user.dir является текущим рабочим каталогом вашей оболочки, поэтому сначала перейдите к нему Определение учебного курса по Java для пользователя user.dir

0 голосов
/ 12 октября 2009

Попробуйте

Document doc = docBuilder.parse(new File("./webservices.xml"));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...