Есть ли Java-эквивалент .NET App.Config?
Если нет, существует ли стандартный способ сохранить настройки приложения, чтобы их можно было изменить после распространения приложения?




Самый простой способ - просто иметь файл свойств, например myapp.properties, со всеми вашими настройками. Это не очень продвинутый способ настройки, но его достаточно, или вы можете иметь свою собственную настройку на основе XML или получить их из база данных и т. д.
Для WebApps файл web.xml может использоваться для хранения настроек приложения.
Помимо этого, вы можете использовать класс Характеристики для чтения и записи файлов свойств.
Вы также можете посмотреть класс Предпочтения, который используется для чтения и записи системных и пользовательских настроек. Это абстрактный класс, но вы можете получить соответствующие объекты, используя userNodeForPackage(ClassName.class) и systemNodeForPackage(ClassName.class).
Есть несколько разных типов параметров, которые вы можете поместить в web.xml, но я, вероятно, имел в виду context-param. Не помню, ведь с тех пор прошло 7,5 лет.
Чтобы поместить предложение @ Powerlord (+1) об использовании класса Properties в пример кода:
public class SomeClass {
public static void main(String[] args){
String dbUrl = "";
String dbLogin = "";
String dbPassword = "";
if (args.length<3) {
//If no inputs passed in, look for a configuration file
URL configFile = SomeClass.class.getClass().getResource("/Configuration.cnf");
try {
InputStream configFileStream = configFile.openStream();
Properties p = new Properties();
p.load(configFileStream);
configFileStream.close();
dbUrl = (String)p.get("dbUrl");
dbLogin = (String)p.get("dbUser");
dbPassword = (String)p.get("dbPassword");
} catch (Exception e) { //IO or NullPointer exceptions possible in block above
System.out.println("Useful message");
System.exit(1);
}
} else {
//Read required inputs from "args"
dbUrl = args[0];
dbLogin = args[1];
dbPassword = args[2];
}
//Input checking one three items here
//Real work here.
}
}
Затем в корне контейнера (например, в верхней части файла jar) поместите файл Configuration.cnf со следующим содержимым:
#Comments describing the file
#more comments
dbUser=username
dbPassword=password
dbUrl=jdbc\:mysql\://servername/databasename
Это не идеально (мне было бы интересно услышать улучшения), но достаточно хорошо для моих текущих потребностей.
Серьезно? Значит, вы запускаете потоковый ридер над файлом, чтобы получить настройки? В случае нескольких классов вам понадобится что-то вроде вспомогательного класса, который можно использовать через? Это лучшее решение, которое Java может предложить здесь ??? Это кажется очень наивным.
Это лучшее, что я мог сделать для своих нужд в 2013 году. Я считаю, что более общее решение обычно заключено в сервер приложений. На ум приходит фраза «корпоративные java beans», хотя я лично никогда не работал в этой среде.
Не могли бы вы подробнее рассказать о первом варианте: «web.xml можно использовать для хранения настроек приложения»? Вы предлагаете сохранить настройки приложения как
context-params? Или что-то другое?