Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将属性文件与GlassFish一起使用_Java_Configuration_Jakarta Ee_Glassfish - Fatal编程技术网

Java 如何将属性文件与GlassFish一起使用

Java 如何将属性文件与GlassFish一起使用,java,configuration,jakarta-ee,glassfish,Java,Configuration,Jakarta Ee,Glassfish,我正在创建一个web服务,它在GlassFish中运行,我希望有一些自定义属性。为此,我使用了Properties类。我使用的代码是: Properties p=new Properties(); File f=new File(System.getProperty("user.dir"), "settings.properties"); p.load(new FileInputStream(f)); 但是如何在我的配置目录中获取设置.properties-文件呢 我不确定我的类路径,因为

我正在创建一个web服务,它在GlassFish中运行,我希望有一些自定义属性。为此,我使用了
Properties
类。我使用的代码是:

Properties p=new Properties();
File f=new File(System.getProperty("user.dir"), "settings.properties");
p.load(new FileInputStream(f));  
但是如何在我的配置目录中获取
设置.properties
-文件呢

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

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

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

URL url =  ClassLoader.getSystemResource("test.properties");
Properties p = new Properties();
p.load(new FileInputStream(new File(url.getFile())));
然后只需要将配置目录添加到类路径中


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

+1将其放入类路径

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

database.username=scott
database.password=tiger
并在应用程序上下文中放置引用,如:

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


(假设您已配置属性配置器),如果无法加载文件或属性不存在,则会导致错误。应用程序将无法启动。这其实是一件好事。它能让你非常迅速地发现问题,比默默失败要好得多,因为默默失败有时会带来灾难性的后果。

我已经尝试了很多,但我通过以下方法解决了这个问题:

        // ServletContext ctx
        InputStream stream = ctx.getResourceAsStream("version.properties");
        p = new Properties();
        p.load(stream);
我必须通过调用
getServletContext()getServletContext()
从jsp页面传递ServletContext。不太理想,但这是我唯一能让它工作的方法


不过,如果有人能想出另一个解决方案,那就太好了,可以与您一起使用
ServletContext

备选方案:

根据域的配置方式,您可能可以从命令行使用
asadmin create system properties
。有关详细信息,请运行/参阅asadmin create system properties--help


或者,您可能希望通过Glassfish管理界面管理系统属性。这里是默认链接:

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

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

为什么没有人提供此文件?

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

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

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

database.username=scott
database.password=tiger
getBundle.getBundle(“设置”).getString(“我的属性键”)


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

是否仅使用spring进行配置?我宁愿使用一些标准的东西。显然,这并不是Spring的全部用途。特别是对于在ApplicationServer中运行的Web应用程序,我无法想象不使用Spring的场景。在JDK之后,它必须是第二个最常部署的jar。我们只是在创建Web服务。我只想读取一个属性文件。这应该没那么困难吧?Spring不会带来任何新的东西,但会带来非标准的依赖关系。我如何在GlassFish/NetBeans中将配置目录添加到我的类路径中?我在任何地方都找不到它…只要把它放在WEB-INF/classes目录中,你能试试ServletContext.getResource吗?很高兴知道,可能会派上用场。我想在容器外进行一些设置。但是版本号需要在容器中,所以我想使用一个属性文件。优点:版本号也可以通过构建脚本(ant)更新。这是您的配置目录吗?