【问题标题】:How to use a property-file with GlassFish如何在 GlassFish 中使用属性文件
【发布时间】:2010-10-06 14:32:12
【问题描述】:

我正在创建一个在 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-file 已添加到类路径中,部署时...

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

【问题讨论】:

    标签: java configuration jakarta-ee glassfish


    【解决方案1】:

    将您的属性文件放在 /glassfish/domains//lib/classes 目录中,它们将可以访问通过 ResourceBundle 类从您的应用程序中获取。例如,将一个名为 settings.properties 的属性文件添加到该目录,然后像这样访问文件中的值:

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

    【讨论】:

      【解决方案2】:

      有效的解决方案其实很简单:

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

      为什么没人带这个?

      【讨论】:

      • 那是你的配置目录吗?
      【解决方案3】:

      替代方案:

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

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

      【讨论】:

      • 很高兴知道,可能会派上用场。我想在我的容器之外进行一些设置。但是版本号需要在容器内,所以我想使用一个属性文件。优点:版本号也可以通过构建脚本(ant)更新。
      【解决方案4】:

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

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

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

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

      【讨论】:

      • 如何将配置目录添加到 GlassFish/NetBeans 中的类路径中?我在任何地方都找不到它...
      • 放到WEB-INF/classes目录下就行了
      • 你能试试 ServletContext.getResource 吗?
      【解决方案5】:

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

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

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

      如果有人能想出另一个解决方案,那就太好了,不用ServletContext也可以。

      【讨论】:

        【解决方案6】:

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

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

        database.username=scott
        database.password=tiger
        

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

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

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

        【讨论】:

        • 只用spring配置?我宁愿使用一些标准的东西。
        • 这不是你使用 Spring 的全部(显然)。特别是对于在应用程序服务器中运行的 Web 应用程序,我无法想象不使用 Spring 的场景。在 JDK 之后,它必须是第二个最常部署的 jar。
        • 我们只是在创建网络服务。
        • 我只想读取一个属性文件。应该没那么难吧?
        • Spring 不会带来任何新的东西,而是非标准的依赖。
        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-15
            • 1970-01-01
            相关资源
            最近更新 更多