Как использовать файл свойств с 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
файл добавляется в путь к классам при развертывании...
Я добавил свое собственное решение, но если бы кто-нибудь мог придумать лучшее решение, было бы очень желанным...
Ответы
Ответ 1
Решение, которое работает, на самом деле довольно просто:
URL url = this.getClass().getResource("/package/name/file.properties");
p = new Properties();
p.load(new FileInputStream(new File(url.getFile())));
Почему никто не пришел с этим?
Ответ 2
Поместите свои файлы свойств в каталог < glassfish-install-dir > /glassfish/domains/< domain-name > /lib/classes, и они будут доступны из ваших приложений через класс ResourceBundle. Например, добавьте файл свойств с именем settings.properties в этот каталог и затем получите доступ к значениям из файла следующим образом:
ResourceBundle.getBundle( "Настройки" ) GetString ( "моя-собственность-ключ" );.
Ответ 3
Альтернативы:
В зависимости от того, как настроен ваш домен, вы можете использовать asadmin create-system-properties
из командной строки. Запустите/см. asadmin create-system-properties --help
для получения дополнительной информации.
Или вам может понравиться администрирование свойств системы через интерфейс администрирования Glassfish. Здесь ссылка по умолчанию: http://localhost:4848/configuration/systemProperties.jsf?configName=server-config
Ответ 4
См. здесь о том, как вы можете прочитать файл свойств из вашего пути к классам:
URL url = ClassLoader.getSystemResource("test.properties");
Properties p = new Properties();
p.load(new FileInputStream(new File(url.getFile())));
Вам нужно добавить каталог конфигурации в путь к классам.
Если у вас есть проблемы с использованием приведенного выше кода, попробуйте ServletContext.getResource.
Ответ 5
Я пробовал много, но я решил это с помощью
// ServletContext ctx
InputStream stream = ctx.getResourceAsStream("version.properties");
p = new Properties();
p.load(stream);
Мне нужно передать ServletContext с jsp-страницы с вызовом getServletContext()getServletContext()
. Не идеально, но это единственный способ заставить его работать...
Было бы неплохо, если бы кто-нибудь мог придумать другое решение, которое могло бы работать без ServletContext
.
Ответ 6
+1 для размещения его в пути к классу.
Если вы используете Spring (и я настоятельно рекомендую вам это сделать, если вы еще не по многим причинам), когда вы можете загрузить файл свойств следующим образом:
database.username=scott
database.password=tiger
и поместите ссылки в свой контекст приложения, например:
<property name="username" value="${database.username}"/>
(при условии, что вы настроили конфигуратор свойств), и это вызовет ошибку, если файл не может быть загружен или свойство не существует. Приложение не запустится. На самом деле это хорошо. Это позволяет вам находить проблемы действительно очень быстро и намного лучше, чем терпеть неудачу, что может иногда иметь катастрофические последствия.
Ответ 7
Скопируйте свой файл свойств в путь к веб-сайту/WEB-INF/classes
Properties p=new Properties();
p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("myproperty.properties"));
Ответ 8
Помните, что вам нужно закрыть 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)
|#]
Загрузка свойств