Загрузите свойства Java в статическом блоке инициализатора

Одной из причин создания статически связанной сборки является проверка того, что у вас есть полное закрытие для исполняемого файла, то есть все ссылки на символы разрешены правильно.

Как часть большой системы, которая создавалась и тестировалась с использованием непрерывной интеграции, ночные регрессионные тесты выполнялись с использованием статически связанной версии исполняемых файлов. Иногда мы видим, что символ не разрешается, и статическая ссылка не работает, даже если динамически связанная исполняемая программа успешно соединяется.

Это обычно происходило, когда символы, которые были глубоко укоренены в общих библиотеках, имели название ошибки и поэтому не имели статической связи. Динамический компоновщик не полностью разрешает все символы, независимо от использования оценки по глубине или ширине, поэтому вы можете получить динамически связанный исполняемый файл, который не имеет полного закрытия.

20
задан Tamir Vered 25 October 2015 в 18:04
поделиться

5 ответов

Сначала получите InputStream , из которого должны быть загружены свойства. Это может происходить из нескольких мест, включая некоторые из наиболее вероятных:

  • A FileInputStream , созданный с именем файла, которое жестко запрограммировано или указано через системное свойство . ] Имя может быть относительным (относительно текущего рабочего каталога процесса Java) или абсолютным.
  • Файл ресурсов (файл в пути к классам), полученный посредством вызова getResourceAsStream на Класс (относительно файла класса) или ClassLoader (относительно корня пути к классу). Обратите внимание, что эти методы возвращают значение null, если ресурс отсутствует, вместо того, чтобы вызывать исключение.
  • URL URL , который, как и имя файла, может быть жестко закодирован или указан через системное свойство.

Затем создайте новый объект Properties и передайте InputStream его методу load () . Не забудьте закрыть поток, независимо от каких-либо исключений.

В инициализаторе класса должны обрабатываться отмеченные исключения, такие как IOException . Может возникнуть непроверенное исключение, которое предотвратит инициализацию класса. Это, в свою очередь, обычно препятствует запуску вашего приложения. Во многих приложениях может быть желательно использовать вместо них свойства по умолчанию или вернуться к другому источнику конфигурации, например, предлагая использовать в интерактивном контексте.

В целом это может выглядеть примерно так:

private static final String NAME = "my.properties";

private static final Properties config;

static {
  Properties fallback = new Properties();
  fallback.put("key", "default");
  config = new Properties(fallback);

  URL res = MyClass.getResource(NAME);
  if (res == null) throw new UncheckedIOException(new FileNotFoundException(NAME));
  URI uri;
  try { uri = res.toURI(); }
  catch (URISyntaxException ex) { throw new IllegalArgumentException(ex); }

  try (InputStream is = Files.newInputStream(Paths.get(uri))) { config.load(is); } 
  catch (IOException ex) { throw new UncheckedIOException("Failed to load resource", ex); }
}
27
ответ дан 29 November 2019 в 23:52
поделиться
  1. Ознакомьтесь с java.util.Properties .

  2. Вы можете использовать статический инициализатор. Итак, в верхней части класса вы можете сделать:


 static {
    Properties props = new Properties();
    InputStream steam = ...; // open the file
    props.load(stream);

    // process properties content
    String username = props.getProperty("username");
  }
6
ответ дан 29 November 2019 в 23:52
поделиться

Используйте либо:

CurrentClassName.class.getResourceAsStream 
new FileInputStream(File)

, чтобы получить входной поток, в зависимости от того, находится ли класс в пути к классам или нет. Затем используйте

Properties.load

для загрузки свойств.

3
ответ дан 29 November 2019 в 23:52
поделиться

Что ж, со статическими свойствами имеет смысл инициализировать их как синглтоны, которые будут загружены один раз в классе. Вот пример:

class Example
{
    public final static String PROPSFILE = "test.properties";

    private static Properties props;

    protected static Properties getProperties()
    {
        if(props == null)
        {
            props = new Properties();
            props.load(new FileInputStream(new File(PROPSFILE));
        }
        return props;
    }

    public static User getUser()
    {
        String username = getProperties().getProperty("username");
        return new User(username);
    }
}

Если вы используете относительные пути, убедитесь, что ваш путь к классам правильно настроен.

1
ответ дан 29 November 2019 в 23:52
поделиться

Это было давно, но если я правильно помню, вы просто делаете что-то вроде этого:

Properties prop = new Properties();
prop.load(new FileInputStream(filename));

//For each property you need.
blah = prop.getProperty(propertyname);
2
ответ дан 29 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: