如何使用GlassFish的属性文件

时间:2009-02-10 09:13:06

标签: java configuration java-ee glassfish

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

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

但是如何在配置目录中获取settings.properties - 文件?

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

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

8 个答案:

答案 0 :(得分:11)

将您的媒体资源文件放在 < glassfish-install-dir> / glassfish / domains /< domain-name> / lib / classes 目录中,他们将可以通过 ResourceBundle 类从您的应用程序中访问。例如,将名为 settings.properties 的属性文件添加到此目录,然后从文件中访问值,如下所示:

  

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

答案 1 :(得分:5)

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

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

为什么没有人来这个?

答案 2 :(得分:3)

<强>备选方案:

根据域的配置方式,您可以从命令行使用asadmin create-system-properties。运行/查看asadmin create-system-properties --help了解详情。

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

答案 3 :(得分:1)

有关如何从类路径中读取属性文件的信息,请参阅here

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

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

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

答案 4 :(得分:1)

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

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

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

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

答案 5 :(得分:0)

+1用于将其放入类路径中。

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

database.username=scott
database.password=tiger

并在您的应用程序上下文中添加引用,如:

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

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

Loading Properties