2009-02-10 28 views
10

Tôi đang tạo một dịch vụ web chạy trong GlassFish và tôi muốn có một số thuộc tính tùy chỉnh. Đối với điều này tôi đang sử dụng lớp Properties. Mã tôi đang sử dụng là:Cách sử dụng tệp thuộc tính với GlassFish

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

Nhưng làm cách nào để nhận được settings.properties -file trong thư mục cấu hình của tôi?

Tôi không chắc chắn về classpath của mình, vì điều này được quản lý bởi NetBeans và GlassFish. Tôi giả định .war -file được thêm vào đường dẫn lớp, khi triển khai ...

Tôi đã thêm giải pháp của riêng mình, nhưng nếu có ai có thể đưa ra một giải pháp tốt hơn, nó sẽ rất được hoan nghênh ...

Trả lời

5

Các giải pháp mà làm việc thực sự là khá đơn giản:

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

Tại sao không ai đi kèm với điều này?

+2

Đó có phải là thư mục cấu hình của bạn không? –

1

Xem here cho cách bạn có thể đọc một thuộc tính tập tin từ classpath của bạn:

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

sau đó, bạn chỉ cần thêm thư mục config của bạn vào classpath.

Nếu bạn gặp sự cố khi sử dụng mã trên, hãy thử ServletContext.getResource.

+0

Làm thế nào để tôi thêm các config-thư mục để classpath của tôi trong GlassFish/NetBeans? Tôi không thể tìm thấy nó ở bất cứ đâu ... – doekman

+0

Chỉ cần đặt nó trong thư mục WEB-INF/classes – kgiannakakis

+0

Tôi đã thử điều đó, nhưng không có tác dụng ... – doekman

0

+1 để đặt nó trong đường dẫn lớp của bạn.

Nếu bạn đang sử dụng Spring (và tôi muốn khuyên bạn làm gì nếu bạn chưa phải vì nhiều lý do) khi bạn có thể tải một thuộc tính tập tin như thế này:

database.username=scott 
database.password=tiger 

và đưa tài liệu tham khảo trong ngữ cảnh ứng dụng của bạn như:

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

(giả sử bạn đã định cấu hình trình cấu hình thuộc tính) và sẽ gây ra lỗi nếu tệp không tải được hoặc thuộc tính không tồn tại. Ứng dụng sẽ không khởi động được. Đây thực sự là một điều tốt. Nó cho phép bạn tìm thấy các vấn đề thực sự thực sự nhanh chóng và tốt hơn nhiều so với việc không âm thầm, đôi khi có thể có những ảnh hưởng thảm khốc.

+1

Chỉ cần sử dụng lò xo để cấu hình? Tôi muốn sử dụng một số thứ tiêu chuẩn. – doekman

+0

Đó không phải là tất cả những gì bạn sử dụng Spring cho (rõ ràng). Đặc biệt đối với các ứng dụng Web đang chạy trong máy chủ ứng dụng, tôi không thể hình dung ra một kịch bản mà tôi sẽ không sử dụng Spring. Sau JDK, nó phải là lọ thứ hai được triển khai phổ biến nhất. – cletus

+1

Chúng tôi vừa tạo webservices. – doekman

1

tôi đã cố gắng rất nhiều, nhưng tôi giải quyết này với:

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

tôi phải vượt qua ServletContext từ một jsp-page với một cuộc gọi đến getServletContext()getServletContext(). Không lý tưởng, nhưng đó là cách duy nhất tôi có thể làm cho nó hoạt động ...

Nó sẽ là tốt đẹp mặc dù bất cứ ai có thể đến với một giải pháp, có thể làm việc withyout ServletContext.

3

Alternatives:

Tùy thuộc vào cách miền của bạn được cấu hình, bạn có thể sử dụng asadmin create-system-properties từ dòng lệnh. Chạy/xem asadmin create-system-properties --help để biết thêm thông tin.

Hoặc bạn có thể muốn quản lý các thuộc tính hệ thống thông qua giao diện quản trị Glassfish.Đây là liên kết mặc định: http://localhost:4848/configuration/systemProperties.jsf?configName=server-config

+0

Điều đó rất hay để biết và có thể hữu ích. Tôi muốn có một số cài đặt bên ngoài vùng chứa của mình. Nhưng số phiên bản cần phải ở bên trong vùng chứa, vì vậy tôi muốn sử dụng tệp thuộc tính. Lợi thế: số phiên bản cũng có thể cập nhật bằng cách xây dựng kịch bản (kiến). – doekman

0

Sao chép tập tin bất động sản của mình vào con đường web/WEB-INF/classes

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

Nơi file thuộc tính trong < glassfish-cài đặt-dir >/glassfish/lĩnh vực/< miền tên >/lib/classes thư mục và chúng sẽ có thể truy cập được từ bên trong ứng dụng của bạn qua lớp ResourceBundle. Ví dụ, thêm một tập tin bất động sản tên settings.properties vào thư mục này và sau đó giá trị truy cập từ các tập tin như thế này:.

ResourceBundle.getBundle ("Cài đặt") getString ("my-hữu-key");

0

Lưu ý rằng bạn phải đóng InputStream. Nếu không, bạn sẽ sớm nhận được một 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

Các vấn đề liên quan