Как в приложении Wildfly в EAR один модуль может прочитать файл свойств в другом модуле?

Мой вопрос касается приложения EAR. Я хотел бы знать, как класс в одном модуле может прочитать файл свойств, который находится в другом модуле.

Я работаю с Eclipse Luna и Wildfly 8.2.1.

В Eclipse:
* У меня есть «Проект корпоративного приложения» с именем MyEar.
* У меня есть «Динамический веб-проект» с именем MyWeb, и он является частью MyEar.
* У меня есть «Утилитарный проект» с именем MySrc, который является частью MyEar.

В проекте MyWeb у меня есть файл свойств с именем app.properties, который находится в папке WEB-INF\classes:

DefaultMaximumBatchSize=1000

В проекте MySrc у меня есть класс с именем AppProperties, который при запуске считывает файл app.properties в объект Properties:

package com.srh.config;

import java.io.InputStream;
import java.util.Properties;

public class AppProperties {
    private static final Properties APP_PROPERTIES;

    static {
       InputStream inputStream = null;

       APP_PROPERTIES = new Properties();

       try {
          inputStream = AppProperties.class.getResourceAsStream("/app.properties");
          System.out.println("AppProperties: inputStream=" + inputStream);

          if (inputStream != null) {
             APP_PROPERTIES.load(inputStream);
          }
       } catch (Exception e) {
          System.out.println("AppProperties: Exception occured; e=" + e);
       }
    }

    public static String getValue(String propertyName) {
        if (propertyName == null || propertyName.equalsIgnoreCase(""))
            return null;
        else
            return APP_PROPERTIES.getProperty(propertyName);
    }
}

В проекте MyWeb у меня есть прослушиватель с именем AppContextListener, где я тестирую поиск значения из AppProperties:

package com.srh.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import com.srh.config.AppProperties;

@WebListener
public class AppContextListener implements ServletContextListener {
    public AppContextListener() {
    }

    public void contextInitialized(ServletContextEvent arg0)  { 
        String defaultMaxBatchSize = AppProperties.getValue("DefaultMaximumBatchSize");
        System.out.println("AppContextListener: contextInitialized(ServletContextEvent): defaultMaxBatchSize=" + defaultMaxBatchSize);
    }

    public void contextDestroyed(ServletContextEvent arg0)  { 
    }   
}

Когда я развернул приложение EAR в Wildfly, Eclipse развернул его как MyEar.ear со следующими файлами внутри:

  • lib\MySrc.jar
  • META-INF\application.xml
  • MyWeb.war\META-INF\MANIFEST.MF
  • MyWeb.war\WEB-INF\web.xml
  • MyWeb.war\WEB-INF\classes\app.properties
  • MyWeb.war\WEB-INF\classes\com\srh\listener\AppContextListener.class

Внутри MySrc.jar есть следующие файлы:

  • com\srh\config\AppProperties.class
  • META-INF\MANIFEST.MF

Когда я запускаю Wildfly, я получаю этот вывод в server.log:

AppProperties: inputStream=null
AppContextListener:contextInitialized(ServletContextEvent): defaultMaxBatchSize=null

Так как же модуль MySrc может прочитать файл свойств, который находится в модуле MyWeb?

Спасибо


person srh    schedule 08.09.2015    source источник
comment
Если вы работаете в среде JavaEE, обычно лучше не иметь таких статических синглетонов. Они хлопотные. Узнайте, как работает среда внедрения CDI, и вместо этого используйте класс с аннотацией @Singleton. Затем укажите свойства, необходимые для инициализации, через конструктор синглтона.   -  person Ian McLaird    schedule 09.09.2015


Ответы (1)


Я знаю, что это не отвечает на вопрос напрямую, но обычно при настройке свойств конфигурации для веб-приложения Java EE они указываются в записях среды в web.xml или в дереве JNDI серверов. Затем их можно прочитать из конфигурации сервлета.

В приведенном выше примере попробуйте использовать шаблон "getInstance()" с частным конструктором для синглтона. Почти уверен, что статические инициализаторы запускаются в первом экземпляре класса.

person Chris    schedule 09.09.2015