7

我在 JBoss 7.1.1 AS 上部署了几个独立的 Java EE 模块(WAR Web 应用程序和 JAR EJB 模块)。我想要:

  1. 将这些模块的配置集中在一个 *.properties 文件中。
  2. 使该文件在类路径中可用。
  3. 保持此文件的安装/配置尽可能简单。理想情况下只是将它放在一些 JBoss 文件夹中,例如:${JBOSS_HOME}/standalone/configuration。
  4. 无需重新启动应用程序服务器即可使该文件的更改可用。

这可能吗?

我已经找到了这个链接:How to put an external file in the classpath,它解释了最好的方法是制作静态 JBoss 模块。但是,我必须在我部署的每个应用程序模块中都依赖这个静态模块,这是我试图避免的一种耦合。

4

2 回答 2

6

也许一个简单的解决方案是从单例或静态类中读取文件。

private static final String CONFIG_DIR_PROPERTY = "jboss.server.config.dir"; 

private static final String PROPERTIES_FILE = "application-xxx.properties";

private static final Properties PROPERTIES = new Properties();

static {
    String path = System.getProperty(CONFIG_DIR_PROPERTY) + File.separator + PROPERTIES_FILE;  
    try {  
        PROPERTIES.load(new FileInputStream(path));
    } catch (MalformedURLException e) {
       //TODO 
    } catch (IOException e) {
       //TODO
    } 
}
于 2013-06-14T10:14:21.203 回答
4

这是一个仅使用 CDI 的完整示例,取自此站点

此配置也适用于 JBoss AS7。

  1. 在 WildFly 配置文件夹中创建并填充属性文件

    $ echo 'docs.dir=/var/documents' >> .standalone/configuration/application.properties
    
  2. 将系统属性添加到 WildFly 配置文件。

    $ ./bin/jboss-cli.sh --connect
    [standalone@localhost:9990 /] /system-property=application.properties:add(value=${jboss.server.config.dir}/application.properties)
    

这会将以下内容添加到您的服务器配置文件(standalone.xml 或 domain.xml)中:

<system-properties>
    <property name="application.properties" value="${jboss.server.config.dir}/application.properties"/>
</system-properties>
  1. 创建加载和存储应用程序范围属性的单例会话 bean

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Properties;
    
    import javax.annotation.PostConstruct;
    import javax.ejb.Singleton;
    
    @Singleton
    public class PropertyFileResolver {
    
        private Logger logger = Logger.getLogger(PropertyFileResolver.class);
        private String properties = new HashMap<>();
    
        @PostConstruct
        private void init() throws IOException {
    
            //matches the property name as defined in the system-properties element in WildFly
            String propertyFile = System.getProperty("application.properties");
            File file = new File(propertyFile);
            Properties properties = new Properties();
    
            try {
                properties.load(new FileInputStream(file));
            } catch (IOException e) {
                logger.error("Unable to load properties file", e);
            }
    
            HashMap hashMap = new HashMap<>(properties);
            this.properties.putAll(hashMap);
        }
    
        public String getProperty(String key) {
            return properties.get(key);
        }
    }
    
  2. 创建 CDI 限定符。我们将在我们希望注入的 Java 变量上使用这个注解。

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    import javax.inject.Qualifier;
    
    @Qualifier
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR })
    public @interface ApplicationProperty {
    
        // no default meaning a value is mandatory
        @Nonbinding
        String name();
    }
    
  3. 创建生产者方法;这将生成要注入的对象

    import javax.enterprise.inject.Produces;
    import javax.enterprise.inject.spi.InjectionPoint;
    import javax.inject.Inject;
    
    public class ApplicationPropertyProducer {
    
        @Inject
        private PropertyFileResolver fileResolver;
    
        @Produces
        @ApplicationProperty(name = "")
        public String getPropertyAsString(InjectionPoint injectionPoint) {
    
            String propertyName = injectionPoint.getAnnotated().getAnnotation(ApplicationProperty.class).name();
            String value = fileResolver.getProperty(propertyName);
    
            if (value == null || propertyName.trim().length() == 0) {
                throw new IllegalArgumentException("No property found with name " + value);
            }
            return value;
        }
    
        @Produces
        @ApplicationProperty(name="")
        public Integer getPropertyAsInteger(InjectionPoint injectionPoint) {
    
            String value = getPropertyAsString(injectionPoint);
            return value == null ? null : Integer.valueOf(value);
        }
    }
    
  4. 最后将属性注入您的 CDI bean 之一

    import javax.ejb.Stateless;
    import javax.inject.Inject;
    
    @Stateless
    public class MySimpleEJB {
    
        @Inject
        @ApplicationProperty(name = "docs.dir")
        private String myProperty;
    
        public String getProperty() {
            return myProperty;
        }
    }
    
于 2015-03-11T20:41:42.017 回答