Как прикрепить файл к банке, который можно редактировать внутри этой банки? - PullRequest
0 голосов
/ 12 января 2019

Я делаю программу, которая работает с базой данных MySQL, сейчас я храню URL, логин, пароль e.t.c как public static String. Теперь мне нужно сделать возможным работу на другом компьютере, чтобы адрес базы данных был разным, поэтому мне нужен способ отредактировать его внутри программы и сохранить. Я хотел бы использовать только внешний текстовый файл, но я не знаю, как указать его местоположение.

Я решил сделать это с помощью файла свойств, я положил его в папку src/res. Это работает правильно, пока я пробую это в Intellij Idea, но когда я строю банку (артефакт), я получаю java.io.FileNotFoundException

Я пробовал два способа: Этот был только что скопирован private String getFile(String fileName) {</p> <pre><code> StringBuilder result = new StringBuilder(""); //Get file from resources folder ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource(fileName).getFile()); System.out.println(file.length()); try (Scanner scanner = new Scanner(file)) { while (scanner.hasNextLine()) { String line = scanner.nextLine(); result.append(line).append("\n"); } scanner.close(); } catch (IOException e) { e.printStackTrace(); } return result.toString(); } System.out.println(obj.getFile("res/cfg.txt"));

И второй, используя Properties класс:

try(FileReader reader =  new FileReader("src/res/cfg.txt")) {
Properties properties = new Properties();
properties.load(reader);
System.out.println(properties.get("password"));
}catch (Exception e) {
e.printStackTrace();
System.out.println(e);
}

В обоих случаях я получаю java.io.FileNotFoundException. Как правильно прикрепить файл конфигурации таким образом?

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Поскольку файл находится внутри .JAR, к нему нельзя получить доступ через new File(), но вы все равно можете прочитать его через ClassLoader:

Properties properties = new Properties();
try (InputStream stream = getClass().getResourceAsStream("/res/cfg.txt")) {
    properties.load(stream);
}

Обратите внимание, что JAR доступен только для чтения. Так что этот подход не сработает.

Если вы хотите иметь редактируемую конфигурацию, вы должны поместить ваш cfg.txt вне JAR и прочитать его из файловой системы. Например, как это:

Properties properties = new Properties();
File appPath = new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParentFile();
try (InputStream stream = new FileInputStream(new File(appPath, "cfg.txt"))) {
    properties.load(stream);
}
0 голосов
/ 12 января 2019

Есть несколько мест, где вы можете разместить свои параметры конфигурации, и надежная стратегия развертывания будет использовать некоторые (или все) из следующих методов:

  • Хранение файлов конфигурации в хорошо известном месте относительно домашней папки пользователя, как я упоминал в комментариях. Это работает на Windows (C:\Users\efrisch), Linux (/home/efrisch) и Mac (/Users/efrisch)

    File f = new File(System.getProperty("user.home"), "my-settings.txt");
    
  • Чтение переменных среды для управления им

    File f = new File(System.getenv("DEPLOY_DIR"), "my-settings.txt");
    
  • Использование децентрализованной службы, такой как Apache ZooKeeper , для хранения настроек базы данных

  • Использование Автономный JNDI (или JNDI, встроенный в вашу цель развертывания)

  • Использовать пул соединений

0 голосов
/ 12 января 2019

Попробуйте сохранить учетные данные вашей базы данных в переменных среды и затем вызвать их как:

public static String myValue = System.getenv("ENVIRONMENT_VARIABLE_NAME"); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...