2009-02-10 12 views
10

Tworzę serwis internetowy, który działa w GlassFish i chcę mieć pewne niestandardowe właściwości. Do tego używam klasy Properties. Kod używam jest:Jak używać pliku właściwości w GlassFish

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

Ale jak mogę uzyskać settings.properties -file w moim katalogu config?

Nie jestem pewien co do mojej ścieżki klasy, ponieważ zarządzają nią NetBeans i GlassFish. Zakładam mój .war -file jest dodawany do ścieżki klasy, podczas wdrażania ...

Dodałem własne rozwiązanie, ale jeśli ktoś mógł wymyślić lepszego rozwiązania, byłoby bardzo mile widziane ...

Odpowiedz

5

Rozwiązanie to działa jest faktycznie dość prosta:

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

Dlaczego nie ktoś się z tym?

+2

Czy to twój katalog konfiguracyjny? –

1

Zobacz here dla jak można odczytać pliku właściwości od ścieżce klas:

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

następnie wystarczy dodać katalog config do ścieżki klasy.

Jeśli masz problemy z korzystaniem z powyższego kodu, spróbuj ServletContext.getResource.

+0

Jak mogę dodać config-katalog do mojego ścieżki klasy w GlassFish/NetBeans? Nie mogę go nigdzie znaleźć ... – doekman

+0

Po prostu umieść go w katalogu WEB-INF/classes – kgiannakakis

+0

Próbowałem, ale nie działa ... – doekman

0

+1 za umieszczenie go w swojej ścieżce klas.

Jeśli używasz sprężyna (i bardzo polecam to zrobić, jeśli nie jesteś już z wielu powodów), kiedy można załadować pliku właściwości tak:

database.username=scott 
database.password=tiger 

i umieścić odniesienia w Twój kontekst aplikacji jak:

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

(zakładając, że masz skonfigurowany konfiguratora nieruchomości) i spowoduje to błąd, jeśli plik nie może zostać załadowany lub nieruchomość nie istnieje. Aplikacja nie uruchomi się. To naprawdę dobra rzecz. Pozwala to na znalezienie problemów naprawdę szybko i znacznie lepiej niż niepowodzenie w milczeniu, co może czasami mieć katastrofalne skutki.

+1

Po prostu użyj sprężyny do konfiguracji? Wolę używać standardowych rzeczy. – doekman

+0

To nie wszystko, czego używasz Spring (oczywiście). Szczególnie w przypadku aplikacji internetowych działających na serwerze aplikacji, nie mogę wyobrazić sobie scenariusza, w którym nie użyłbym Springa. Po JDK musi to być drugi najczęściej wdrażany słoik (słoje). – cletus

+1

Po prostu tworzymy serwisy internetowe. – doekman

1

Próbowałem wiele, ale rozwiązuje ten z:

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

muszę zdać ServletContext od A JSP strony z wezwaniem do getServletContext()getServletContext(). Nie jest idealny, ale jest to jedyny sposób, w jaki mogę go uruchomić ...

Byłoby miło, gdyby ktoś mógł wymyślić inne rozwiązanie, które mogłoby zadziałać bez ServletContext.

3

Alternatywy:

zależności od tego jak jest skonfigurowana domena, może być w stanie wykorzystać asadmin create-system-properties z wiersza poleceń. Uruchom/zobacz asadmin create-system-properties --help, aby uzyskać więcej informacji.

A może podoba Ci się administrowanie właściwościami systemu za pomocą interfejsu administratora Glassfish.Oto domyślne Link: http://localhost:4848/configuration/systemProperties.jsf?configName=server-config

+0

To miło wiedzieć i może się przydać. Chciałbym mieć jakieś ustawienia poza moim kontenerem. Ale numer wersji musi znajdować się wewnątrz kontenera, więc chcę użyć pliku właściwości. Zaleta: numer wersji jest również aktualizowany przez skrypt budujący (ant). – doekman

0

Skopiuj plik własności do ścieżki web/WEB-INF/classes

Properties p=new Properties(); 
p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("myproperty.properties")); 
11

umieścić swoje pliki własności w GlassFish-install-dir >/GlassFish/Domains/< domain-name > </lib/classes katalog i będą dostępne z poziomu aplikacji za pośrednictwem klasy ResourceBundle. Na przykład, dodać plik właściwość o nazwie settings.properties do tego katalogu, a następnie wartości dostęp z pliku, takie jak ten:.

ResourceBundle.getBundle ("Ustawienia") getString ("my-własność-key");

0

Pamiętaj, że musisz zamknąć InputStream. W przeciwnym razie otrzymasz SocketException prędzej czy później.

#|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) 
|#] 

Loading Properties