Как: Динамически определенные свойства в Java - PullRequest
1 голос
/ 25 июня 2010

Как я могу определить некоторые свойства динамически в Java. Пока я использую файл свойств, но мне нужно изменить эти свойства перед установкой, поэтому эти свойства должны быть установлены в файле вне файла jar (или install).

Эти свойства определяют мое соединение с IBatis.

Ответы [ 4 ]

2 голосов
/ 25 июня 2010

Продолжайте использовать .properties и загрузите файл как ресурс.

Если он находится в пути к классам, он будет найден.

То, что я использую, потому что для меня гораздо проще - это комплект ресурсов.

edit

Если файл находится в вашем classpath, вы можете загрузить его либо как ресурс с помощью: Some.class.loadResource(...), либо я использую ResourceBundle, который делает то же самое.

ДляНапример, если у меня есть:

import java.util.ResourceBundle;

public class ResourceBundleTest {
    public static void main( String [] args ) {
        ResourceBundle bundle = ResourceBundle.getBundle("connection");
        for( String key: bundle.keySet() ){
            System.out.printf("bundle[%s]=%s%n",key, bundle.getString(key));
        }
    }
}

Я могу загрузить этот файл, если находится в пути к классам.Свойство находится снаружи, в "some / nested / dir"

$ls -l some/nested/dir/
total 8
-rw-r--r--  1 oscarreyes  staff  35 Jun 25 12:06 connection.properties
$cat some/nested/dir/connection.properties 
name=Oscar
lastName=Reyes
age=0x1F

Если я запусту его без добавления этого каталога в мой classpath, оно не будет работать:

$java ResourceBundleTest 
Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name connection, locale es_ES
    at java.ut...ceBundle.java:1427)
    at java.ut...urceBundle.java:1250)
    at java.ut...ceBundle.java:705)
    at Resourc...st.java:6)

Но если я добавлюкаталог к ​​моему classpath, тогда файл будет легко найден.

$java -cp some/nested/dir/:.  ResourceBundleTest 
bundle[lastName]=Reyes
bundle[age]=0x1F
bundle[name]=Oscar
$

Аналогичным образом, вы можете получить файл .jar и поместить свой файл .properties куда угодно, вам просто нужновключите его в свой путь к классам.

Эквивалентными свойствами использования будут:

import java.util.Properties;

public class LoadProperties {
    public static void main( String [] args ) throws java.io.IOException {
        Properties properties = new Properties();
        properties.load( LoadProperties.class.getResourceAsStream("connection.properties"));
        properties.list( System.out );
    }
}

Но по какой-то причине я предпочитаю комплект ресурсов.

1 голос
/ 25 июня 2010

Просто поместите файл в один из путей, указанных в пути к классам времени выполнения, или добавьте путь к файлу (пути по умолчанию) (по умолчанию). Таким образом, код Java может продолжить доступ к нему как к ресурсу classpath.

Когда вы выполняете файлы JAR с помощью команды java -jar или двойным щелчком файла, аргументы -cp или -classpath и даже переменная окружения %CLASSPATH% будут игнорироваться. Вы можете определить путь к классу JAR-файла по умолчанию как запись Class-Path в файле META-INF/MANIFEST.MF.

1011 * Е.Г. *

Class-Path: .

Точка . означает, что путь, в котором в данный момент находится файл JAR, включен в путь к классам во время выполнения. Поэтому, если вы поместите файл свойств в ту же папку, что и файл JAR, он будет работать.

Вы также можете указать абсолютный путь к файловой системе диска:

Class-Path: /var/foo

Таким образом, папка /var/foo берется в classpath времени выполнения. Так что, если вы поместите файл свойств в эту папку, он будет работать.

0 голосов
/ 25 июня 2010

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

0 голосов
/ 25 июня 2010

Файл свойств в порядке, вам просто нужно включить его в classpath, и он может жить за пределами jar.

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

...