【发布时间】:2016-09-20 15:22:44
【问题描述】:
我知道可以在要部署的 EAR 中嵌入的“beans.xml”文件中配置装饰器。
问题是我对所有环境都使用相同的 EAR,而属性集或特定配置存储在包外的某个文件夹中。
我需要确定是否会使用装饰器“external beans.xml”或一些类似的机制(EAR 之外的东西)。
有什么想法吗?
非常感谢。
【问题讨论】:
标签: java jakarta-ee jboss cdi
我知道可以在要部署的 EAR 中嵌入的“beans.xml”文件中配置装饰器。
问题是我对所有环境都使用相同的 EAR,而属性集或特定配置存储在包外的某个文件夹中。
我需要确定是否会使用装饰器“external beans.xml”或一些类似的机制(EAR 之外的东西)。
有什么想法吗?
非常感谢。
【问题讨论】:
标签: java jakarta-ee jboss cdi
通常,这不起作用 - 标准启用方式是 beans.xml 用于按存档方法,@Priority 用于全局启用。没有像“外部 beans.xml”这样的东西。
虽然有一种方法可以通过 extension 启用它。您需要设置一个扩展并观察AfterTypeDiscovery event。从那里你可以
使用public List<Class<?>> getDecorators();,它返回MUTABLE 装饰器列表——所以你可以将你自己的添加到列表中(以Class 的形式)。这应该会启用它。
【讨论】:
您可以使用的另一种方案是利用构建时包含和处理。 如果您事先知道哪些属性会在构建时激活特定的装饰器,那么您可以使用 maven 资源以及系统属性来定义要过滤的其他资源,因此:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompant</groupId>
<artifactId>my-project-id</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<some.kind.of.selector.properties>$basedir}/src/main/resources/development</some.kind.of.selector.properties>
</properties>
<build>
<resources>
<resource>
<directory>${some.kind.of.selector.properties}</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
<profiles>
<profile>
<id>test</id>
<properties>
<some.kind.of.selector.properties>$basedir}/src/main/resources/test</some.kind.of.selector.properties>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<some.kind.of.selector.properties>$basedir}/src/main/resources/prod</some.kind.of.selector.properties>
</properties>
</profile>
</profiles>
</project>
在构建时,您可以为每个环境指定不同的beans.xml:
mvn clean install -Pprod
甚至直接指定属性
mvn clean install -Dsome.kind.of.selector.properties=/path/to/additional/resources
【讨论】: