Как использовать файл свойств с GlassFish

Я создаю веб-службу, которая работает в GlassFish, и мне нужны некоторые настраиваемые свойства. Для этого я использую класс Properties. Код, который я использую:

Properties p=new Properties();
File f=new File(System.getProperty("user.dir"), "settings.properties");
p.load(new FileInputStream(f));  

Но как мне получить settings.properties-файл в моем каталоге конфигурации?

Я не уверен в своем пути к классам, так как им управляют NetBeans и GlassFish. Я предполагаю, что мой .war-файл добавляется в путь к классам при развертывании...

Я добавил свое собственное решение, но если кто-то может придумать лучшее решение, это было бы очень кстати...


person doekman    schedule 10.02.2009    source источник


Ответы (8)


Поместите файлы свойств в каталог ‹glassfish-install-dir›/glassfish/domains/‹domain-name›/lib/classes, и они будут доступны из вашего приложения через класс ResourceBundle. Например, добавьте в этот каталог файл свойств с именем settings.properties, а затем получите доступ к значениям из файла следующим образом:

ResourceBundle.getBundle("Настройки").getString("my-property-key");

person Brent Clay    schedule 07.01.2013

Решение, которое работает, на самом деле довольно простое:

URL url =  this.getClass().getResource("/package/name/file.properties");
p = new Properties();
p.load(new FileInputStream(new File(url.getFile())));

Почему никто не пришел с этим?

person doekman    schedule 19.03.2009
comment
Это ваш каталог конфигурации? - person Thorbjørn Ravn Andersen; 15.08.2011

Альтернативы:

В зависимости от того, как настроен ваш домен, вы можете использовать asadmin create-system-properties из командной строки. Запустите/см. asadmin create-system-properties --help для получения дополнительной информации.

Или вам может понравиться администрирование системных свойств через интерфейс администратора Glassfish. Вот ссылка по умолчанию: http://localhost:4848/configuration/systemProperties.jsf?configName=server-config

person fredarin    schedule 17.03.2009
comment
Это приятно знать, и может пригодиться. Я хотел бы иметь некоторые настройки за пределами моего контейнера. Но номер версии должен быть внутри контейнера, поэтому я хочу использовать файл свойств. Преимущество: номер версии также обновляется скриптом сборки (ant). - person doekman; 18.03.2009

См. здесь, как можно прочитать файл свойств из пути к классам:

URL url =  ClassLoader.getSystemResource("test.properties");
Properties p = new Properties();
p.load(new FileInputStream(new File(url.getFile())));

Затем вам нужно только добавить каталог конфигурации в путь к классам.

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

person kgiannakakis    schedule 10.02.2009
comment
Как добавить каталог конфигурации в путь к классам в GlassFish/NetBeans? нигде не могу найти... - person doekman; 12.02.2009
comment
Просто поместите его в каталог WEB-INF/classes - person kgiannakakis; 12.02.2009
comment
Не могли бы вы попробовать ServletContext.getResource? - person kgiannakakis; 12.02.2009

Я много пробовал, но я решил это с помощью:

        // ServletContext ctx
        InputStream stream = ctx.getResourceAsStream("version.properties");
        p = new Properties();
        p.load(stream);

Мне нужно передать ServletContext с jsp-страницы с вызовом getServletContext()getServletContext(). Не идеально, но это единственный способ заставить его работать...

Было бы неплохо, если бы кто-нибудь придумал другое решение, которое могло бы работать без ServletContext.

person doekman    schedule 13.03.2009

+1 за то, что поместил его в свой путь к классам.

Если вы используете Spring (и я настоятельно рекомендую вам это сделать, если вы этого еще не сделали по многим причинам), когда вы можете загрузить файл свойств следующим образом:

database.username=scott
database.password=tiger

и поместите ссылки в контекст вашего приложения, например:

<property name="username" value="${database.username}"/>

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

person cletus    schedule 10.02.2009
comment
Просто использовать Spring для настройки? Я бы предпочел использовать некоторые стандартные вещи. - person doekman; 12.02.2009
comment
Это не все, для чего вы используете Spring (очевидно). В частности, для веб-приложений, работающих на сервере приложений, я не могу представить сценарий, в котором я бы не использовал Spring. После JDK он должен быть вторым наиболее часто используемым jar-файлом. - person cletus; 12.02.2009
comment
Мы просто создаем веб-сервисы. - person doekman; 12.02.2009
comment
Spring имеет обширные помощники по реализации для создания конечных точек и потребителей веб-сервисов. - person cletus; 12.02.2009
comment
Я просто хочу прочитать файл свойств. Это не должно быть так сложно? - person doekman; 13.03.2009
comment
Spring не принесет сюда ничего нового, кроме нестандартных зависимостей. - person ymajoros; 20.04.2012

Скопируйте файл свойств в папку web/WEB-INF/classes.

Properties p=new Properties();
p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("myproperty.properties"));
person mssb    schedule 10.08.2012

Имейте в виду, что вам нужно закрыть InputStream. В противном случае вы рано или поздно получите SocketException.

#|2013-xx-xxTxx:xx:xx.162+0200|WARNING|sun-appserver2.1|sun.rmi.transport.tcp|_ThreadID=431; _ThreadName=RMI TCP Accept-0;_RequestID=xyz;|RMI TCP Accept-0: accept loop for ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=42384] throws
java.net.SocketException: Too many open files
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390)
    at java.net.ServerSocket.implAccept(ServerSocket.java:453)
    at java.net.ServerSocket.accept(ServerSocket.java:421)
    at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:369)
    at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:341)
    at java.lang.Thread.run(Thread.java:662)
|#]

Загрузка свойств

person thommy    schedule 16.10.2013