используя свойства в файле свойств - PullRequest
6 голосов
/ 15 января 2012

Я прошу прощения за заголовок .. Я не смог найти лучшего способа объяснить ситуацию.

Я использую для загрузки файла свойств, используя класс Property, как описано в URL http://www.exampledepot.com/egs/java.util/Props.html

мой вопрос: могу ли я использовать свойства в этом файле свойств?

пример:

test.properties

 url.main="http://mysite.com"
    url.games={url.main}/games
    url.images={url.main}/images
    .
    .
    .

это возможно с некоторыми другимисинтаксис?

спасибо

Ответы [ 5 ]

5 голосов
/ 15 января 2012

Конфигурация Apache Commons предусматривает это: http://commons.apache.org/configuration/

Простой пример кода для загрузки файла конфигурации:

Configuration config = new PropertiesConfiguration("config.properties");

У вас могут быть свойства «с переменной интерполяцией», как описано здесь http://commons.apache.org/configuration/userguide/howto_basicfeatures.html#Variable_Interpolation

application.name = Killer App
application.version = 1.6.2

application.title = ${application.name} ${application.version}

И это также позволяет вам включать другие файлы конфигурации, пока вы на нем:

include = colors.properties
include = sizes.properties

Помимо целого ряда других функций.

3 голосов
/ 15 января 2012

Никогда раньше такого не видел. Конечно, вы можете создать свой собственный препроцессор. Пока упомянутое свойство встречается до каких-либо ссылок на него, вы должны иметь возможность реализовать его, используя некоторые регулярные выражения / замену строк. Но: я не рекомендовал бы этот метод.

Лучше разрешить дублирование, определив различные свойства:

  1. изменить: url.games={url.main}/games на url.games_extension=/games
  2. prepend: url.main to url.games_extension, чтобы получить полный URL-адрес игры в коде приложения.
2 голосов
/ 09 февраля 2013

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

1 голос
/ 15 января 2012

Я сделал что-то подобное, и это не так сложно, вы просто создаете подкласс класса Properties и реализуете свой собственный метод getProperty , проверяете шаблон и заменяете его при необходимости.

//this makes the pattern ${sometext}
static public final String JAVA_CONFIG_VARIABLE = "\\$\\{(.*)\\}";

@Override
public String getProperty(String key)
{
    String val = super.getProperty(key);
    if( val != null && val.indexOf("${") != -1 )
    {
        //we have at least one replacable parm, let's replace it
        val = replaceParms(val);
    }
    return val;
 }

 public final String replaceParms(String in)
 {
     if(in == null) return null;
     //this could be precompiled as Pattern is supposed to be thread safe
     Pattern pattern = Pattern.compile(JAVA_CONFIG_VARIABLE);
     Matcher matcher = pattern.matcher(in);
     StringBuffer buf = new StringBuffer();
     while (matcher.find())
     {
         String replaceStr = matcher.group(1);
         String prop = getProperty(replaceStr);   
         //if it isn't in our properties file, check if it is a system property
         if (prop == null )
             prop = System.getProperty(replaceStr);
         if( prop == null )
         {
            System.out.printf("Failed to find property '%s' for '%s'\n", replaceStr, in);
         }
         else
         {
           matcher.appendReplacement(buf, prop);
         } 
     }
     matcher.appendTail(buf);
     String result = buf.toString();
     return result;
 }
1 голос
/ 15 января 2012

Нет прямого способа заменить значение свойства в файле / объекте свойства, но вы можете заменить значение свойства, прочитав метод getProperty().Для создания составных сообщений - взгляните на MessageFormat class.

String baseValue=prop.getProperty("url.main");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...