我正在创建一个在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
- 文件在部署时被添加到类路径中......
我已经添加了自己的解决方案,但如果有人能提出更好的解决方案,那将非常受欢迎......
答案 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)
|#]