2009-02-10 18 views
10

Ich erstelle einen Webdienst, der in GlassFish ausgeführt wird, und ich möchte einige benutzerdefinierte Eigenschaften haben. Dafür benutze ich die Klasse Properties. Der Code Ich verwende ist:So verwenden Sie eine Eigenschaftendatei mit GlassFish

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

Aber wie bekomme ich die settings.properties -Dateien in meiner config?

Ich bin nicht sicher über meinen Klassenpfad, da dies von NetBeans und GlassFish verwaltet wird. Ich gehe davon aus meinem .war -file wird den Classpath hinzugefügt, bei der Bereitstellung von ...

Ich habe meine eigene Lösung gegeben, aber wenn jemand mit einer besseren Lösung kommen könnte, wäre es sehr zu begrüßen ...

Antwort

5

Die Lösung, die funktioniert, ist eigentlich ganz einfach:

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

Warum jemand mit diesem nicht gekommen?

+2

Ist das Ihr Konfigurationsverzeichnis? –

1

Siehe here, wie Sie ein Properties-Datei von Ihrem classpath zu lesen:

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

Sie dann müssen nur Ihr Konfigurationsverzeichnis zu dem classpath hinzufügen.

Wenn Sie Probleme mit dem obigen Code haben, versuchen Sie ServletContext.getResource.

+0

Wie füge ich die config-Verzeichnis auf meinem Classpath in Glassfish/NetBeans? Ich kann es nirgendwo finden ... – doekman

+0

Einfach in WEB-INF/Klassen-Verzeichnis – kgiannakakis

+0

Ich habe das versucht, aber nicht funktioniert nicht ... – doekman

0

+1 für das Einfügen in Ihren Klassenpfad.

Wenn Sie mit Spring (und ich würde empfehlen Sie tun, wenn Sie nicht bereits aus vielen Gründen sind), wenn Sie eine Eigenschaften laden kann diese Datei wie:

database.username=scott 
database.password=tiger 

und setzen Referenzen in Ihr Anwendungskontext wie:

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

(vorausgesetzt, Sie die Eigenschaft Konfigurator konfiguriert haben), und es wird einen Fehler verursachen, wenn die Datei nicht geladen werden kann oder die Eigenschaft nicht existiert. Die Anwendung wird nicht gestartet. Das ist eigentlich eine gute Sache. Damit können Sie Probleme wirklich sehr schnell und viel besser finden, als wenn Sie im Stillen versagen, was manchmal katastrophale Auswirkungen haben kann.

+1

Verwenden Sie einfach die Feder zur Konfiguration? Ich würde lieber einige Standard-Dinge verwenden. – doekman

+0

Das ist nicht alles, was Sie für (offensichtlich) Spring verwenden. Insbesondere für Webanwendungen, die auf dem Anwendungsserver ausgeführt werden, kann ich mir kein Szenario vorstellen, in dem ich Spring nicht verwenden würde. Nach dem JDK muss es das am zweithäufigsten eingesetzte JAR sein. – cletus

+1

Wir erstellen nur Webservices. – doekman

1

Ich habe viel versucht, aber ich löste dies mit:

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

ich die ServletContext aus einer jsp-Seite mit einem Aufruf an getServletContext()getServletContext() passieren muß. Nicht ideal, aber es ist der einzige Weg, wie ich es funktionierte ...

Es wäre aber nett, wenn jemand mit einer anderen Lösung kommen könnte, die ohne die ServletContext funktionieren könnte.

3

Alternativen:

Je nachdem, wie Sie Ihre Domain konfiguriert ist, können Sie möglicherweise asadmin create-system-properties über die Befehlszeile verwenden. Ausführen/siehe asadmin create-system-properties --help für weitere Informationen.

Oder Sie möchten vielleicht Systemeigenschaften über die Glassfish Admin-Oberfläche verwalten.Hier ist der Standard-Link: http://localhost:4848/configuration/systemProperties.jsf?configName=server-config

+0

Das ist schön zu wissen und könnte nützlich sein. Ich möchte einige Einstellungen außerhalb meines Containers haben. Aber die Versionsnummer muss innerhalb des Containers sein, also möchte ich eine Eigenschaftendatei verwenden. Vorteil: Die Versionsnummer kann auch durch das Build-Skript (ant) aktualisiert werden. – doekman

0

Kopieren Sie die Eigenschaftendatei im Web/WEB-INF/classes Pfad

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

Platzieren Sie Ihre Immobilien-Dateien im < Glassfish-Installationsverzeichnis >/Glasfischen/domains/< domain-name >/lib/classes Verzeichnis und sie sind von innerhalb Ihrer Anwendungen über die ResourceBundle Klasse zugänglich. Fügen Sie zum Beispiel eine Eigenschaft Datei mit dem Namen settings.properties in dieses Verzeichnis und dann Zugriff Werte aus der Datei wie folgt aus:.

ResourceBundle.getBundle („Einstellungen“) getString („my-Eigenschaft-key“);

0

Beachten Sie, dass Sie den InputStream schließen müssen. Andernfalls erhalten Sie früher oder später eine 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

Verwandte Themen