10

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

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

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

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

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

4

8 回答 8

11

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

ResourceBundle.getBundle("settings").getString("my-property-key");

于 2013-01-07T13:16:19.480 回答
5

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

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

为什么没有人带着这个来?

于 2009-03-19T09:35:32.280 回答
3

备择方案:

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

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

于 2009-03-17T19:50:57.683 回答
1

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

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

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

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

于 2009-02-10T09:36:23.753 回答
1

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

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

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

如果有人能想出另一个解决方案,那就太好了,如果没有ServletContext.

于 2009-03-13T12:04:20.470 回答
0

+1 将其放入您的类路径中。

如果您正在使用 Spring(如果您因为很多原因还没有使用 Spring,我强烈建议您这样做),那么您可以像这样加载属性文件:

database.username=scott
database.password=tiger

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

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

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

于 2009-02-10T10:57:31.727 回答
0

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

Properties p=new Properties();
p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("myproperty.properties"));
于 2012-08-10T08:26:49.147 回答
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)
|#]

加载属性

于 2013-10-16T16:40:48.777 回答