Как использовать файл свойств с 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)
|#]

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