2010-06-25 1 views
1

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

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

+1

Просьба уточнить проблему. Файлы свойств не обязательно должны находиться внутри банки. Почему бы вам просто не сохранить его в файловой системе? – erickson

ответ

2

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

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

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

редактировать

Если файл находится в пути к классам вы можете загрузили его либо в качестве ресурса с: 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)); 
     } 
    } 
} 

я могу загрузить файл, если в пути к классам. Отель находится на улице, в «некотором/вложенном/реже»

$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 

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

$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); 
    } 
} 

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

+0

Привет, спасибо за помощь, но я считаю, что вы не понимаете мой вопрос. Я делаю, как вы сказали. Проблема в том, что значения свойств будут меняться, и эти значения не могут быть установлены внутри файла jar. Их нужно легко изменить. Теперь ясно? – Victor

+0

Скорее всего, вы не поняли, что я сказал: P Если он находится в пути к классам (который может быть вне вашего класса), он будет загружен. Позвольте мне обновить ответ с помощью примера – OscarRyz

+0

@ Victor: Я считаю, что вы не понимаете феномен «classpath» :) Все, что вам в основном нужно сделать, это поместить файл в один из путей, охватываемых путём пути выполнения, или для добавления пути файла к пути пути выполнения. Таким образом, Java-код может продолжить доступ к нему как к ресурсу classpath. – BalusC

0

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

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

+0

Я не думаю, что iBatis поддерживает «Настройки». – BalusC

0

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

1

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

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

E.g.

Class-Path: . 

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

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

Class-Path: /var/foo 

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