2009-02-10 13 views
10

Sto creando un servizio Web, che viene eseguito in GlassFish, e voglio avere alcune proprietà personalizzate. Per questo sto usando la classe Properties. Il codice che sto utilizzando è:Come utilizzare un file di proprietà con GlassFish

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

Ma come faccio ad avere il settings.properties -file nella mia directory di configurazione?

Non sono sicuro del mio classpath, poiché questo è gestito da NetBeans e GlassFish. Presumo il mio .war -file viene aggiunto al classpath, durante la distribuzione ...

ho aggiunto la mia soluzione, ma se qualcuno potesse trovare una soluzione migliore, sarebbe altamente benvenuto ...

risposta

5

La soluzione che funziona è in realtà piuttosto semplice:

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

Perché nessuno venire con questo?

+2

Questa è la tua directory di configurazione? –

1

Vedi here per come si può leggere un file delle proprietà dal classpath:

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

È quindi solo bisogno aggiungere la directory di configurazione al classpath.

Se si riscontrano problemi nell'utilizzo del codice sopra, provare ServletContext.getResource.

+0

Come si aggiunge il config-directory al mio percorso di classe in GlassFish/NetBeans? Non riesco a trovarlo da nessuna parte ... – doekman

+0

Basta inserirlo nella directory WEB-INF/classes – kgiannakakis

+0

Ho provato a farlo, ma non funziona ... – doekman

0

+1 per metterlo nel classpath.

Se stai usando Primavera (e mi raccomando fate se non siete già per molte ragioni), quando è possibile caricare un file delle proprietà in questo modo:

database.username=scott 
database.password=tiger 

e mettere i riferimenti a il contesto di applicazione come:

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

(supponendo che hai configurato il configuratore proprietà) e causerà un errore se il file non può essere caricato o la proprietà non esiste. L'applicazione non verrà avviata. Questa è davvero una buona cosa. Ti permette di trovare i problemi veramente molto velocemente e molto meglio che fallire silenziosamente, che a volte può avere effetti catastrofici.

+1

Basta usare la molla per la configurazione? Preferirei usare alcune cose standard. – doekman

+0

Questo non è tutto ciò che usi Spring (ovviamente). In particolare per le applicazioni Web in esecuzione nel server delle applicazioni, non riesco a immaginare uno scenario in cui non utilizzerei Spring. Dopo il JDK deve essere il secondo (i) vaso (i) più diffuso. – cletus

+1

Stiamo solo creando servizi web. – doekman

1

Ho provato un sacco, ma ho risolto questo con:

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

devo passare ServletContext da una jsp-page con una chiamata a getServletContext()getServletContext(). Non ideale, ma è l'unico modo per farlo funzionare ...

Sarebbe bello se qualcuno potesse trovare un'altra soluzione, che potrebbe funzionare senza il ServletContext.

3

Alternative:

A seconda di come il dominio è configurato, si potrebbe essere in grado di utilizzare asadmin create-system-properties dalla riga di comando. Esegui/vedi asadmin create-system-properties --help per maggiori informazioni.

Oppure si potrebbe voler amministrare le proprietà del sistema tramite l'interfaccia di amministrazione di Glassfish.Ecco il link di default: http://localhost:4848/configuration/systemProperties.jsf?configName=server-config

+0

Questo è bello sapere, e potrebbe tornare utile. Mi piacerebbe avere alcune impostazioni al di fuori del mio contenitore. Ma il numero di versione deve essere all'interno del contenitore, quindi voglio usare un file di proprietà. Vantaggio: il numero di versione è aggiornabile anche dallo script di compilazione (form). – doekman

0

Copiare il file di proprietà per il percorso web/WEB-INF/classes

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

inserire i file di proprietà in GlassFish-install-dir >/GlassFish/domini/< domain-name > </lib/classes directory e saranno accessibili dall'interno delle applicazioni tramite la classe ResourceBundle. Ad esempio, aggiungere un file di proprietà denominata settings.properties a questa directory e quindi valori di accesso dal file come questo:.

ResourceBundle.getBundle ("Impostazioni") getString ("my-proprietà-chiave");

0

Si noti che è necessario chiudere InputStream. Altrimenti prima o poi otterrai una 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) 
|#] 

Loading Properties

Problemi correlati