如何使用GlassFish的属性文件

我正在创建一个在GlassFish中运行的Web服务,我想要一些自定义属性。 为此,我正在使用Properties类。 我正在使用的代码是:

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

但是如何在我的config目录中获取settings.properties -file?

我不确定我的类路径,因为它由NetBeans和GlassFish管理。 我假设我的.war -file被添加到类路径中,部署时…

我已经添加了自己的解决方案,但如果有人能提出更好的解决方案,那将非常受欢迎……

将属性文件放在 / glassfish / domains / / lib / classes目录中,可以通过ResourceBundle类从应用程序中访问它们。 例如,将名为settings.properties的属性文件添加到此目录,然后从文件中访问值,如下所示:

ResourceBundle.getBundle(“设置”)的getString(“我的属性键”)。

有效的解决方案实际上非常简单:

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

为什么没有人来这个?

备择方案:

根据域的配置方式,您可以从命令行使用asadmin create-system-properties 。 运行/请参阅asadmin create-system-properties --help以获取更多信息。

或者您可能希望通过Glassfish管理界面管理系统属性。 这是默认链接: http:// localhost:4848 / configuration / systemProperties.jsf?configName = server-config

请参阅此处了解如何从类路径中读取属性文件:

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

然后,您只需要将config目录添加到类路径中。

如果您在使用上述代码时遇到问题,请尝试使用ServletContext.getResource 。

我已经尝试了很多,但我解决了这个问题:

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

我必须通过调用getServletContext()getServletContext()从jsp页面传递ServletContext。 不理想,但这是我能让它工作的唯一方法……

如果有人能提出另一个解决方案,那将是很好的,这可以使用ServletContext

+1将它放入类路径中。

如果你正在使用Spring(我强烈建议你这样做,如果你还没有出于很多原因),你可以加载这样的属性文件:

 database.username=scott database.password=tiger 

并将引用放在您的应用程序上下文中:

  

(假设您已配置了属性配置程序),如果无法加载文件或该属性不存在,则会导致错误。 应用程序将无法启动。 这实际上是件好事。 它可以让您真正快速地发现问题,并且比默默地失败更好,这有时会带来灾难性后果。

将属性文件复制到web / WEB-INF / classes路径

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

请注意,您必须关闭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) |#] 

加载属性