什么是Java EE 7属性文件配置的最佳实践建议?
应用程序配置在哪里属于现代Java EE应用程序? 人们有什么最佳实践建议?
通过应用程序配置,我的意思是设置连接设置到其他盒子上的服务,包括外部服务(例如Twitter和我们的内部Cassandra服务器……用于诸如主机名,凭证,重试尝试之类的东西)以及与业务逻辑相关的东西(事物)一个人可能会被诱惑作为常量存储在类中,例如某些东西过期等等。
假设:
- 我们使用单个EAR文件部署到Java EE 7服务器(Wildfly 8.1),该文件包含多个战争和一个ejb-jar。
- 我们将部署到各种环境:unit testing,本地开发安装,基于云的UAT基础架构,压力测试和生产环境。 我们的许多房产会因这些环境而异。
- 如果这是人们推荐的最佳实践,我们不反对将属性配置耦合到DI框架。
- 所有这些都是为了新的开发,因此我们不必遵守传统的要求或限制。 我们非常关注当前的现代最佳实践。
配置是属于EAR的内部还是外部?
如果在 EAR 之外 ,哪里以及如何最好地可靠地访问它们?
如果在 EAR 内部 ,我们可以将它存储在类路径中的任何位置,以便在执行期间轻松访问。 但是我们必须在每次配置更改时重新组装(并且可能重新构建)。 由于我们将拥有多个环境,因此我们需要一种方法来区分EAR中的文件。 我在这里看到两个选项:
- 利用预期的文件名(例如
cassandra.properties
),然后构建多个特定于环境的EAR(例如,appxyz-PROD.ear
)。 - 构建一个EAR(例如
appxyz.ear
)并将所有各种环境配置文件放入其中,将环境变量附加到每个配置文件名(例如cassandra-PROD.properties
)。 当然还要添加一个环境变量(到vm或其他),以便代码知道要拾取哪个文件。
人们可以推荐哪些最佳实践来解决这一共同挑战?
谢谢。
我不知道什么是最佳实践,但这就是我们的工作。
(但请注意,这仅适用于每个服务器的每个应用程序的一次安装,并且当每个服务器想要使用多个部署时,例如多租户部署时,将会失败)。
CDI注入属性值
我们使用一种稍微复杂的CDI注入方法将.properties
文件中的配置值直接注入到bean中,如下所示:
@Inject @ConfigurationValue(value="amazonS3FileContentsAccessKey") private String accessKey;
相应的@Producer
bean从类路径和给定的“本地”位置读取配置文件:
全局/本地.properties
文件
- 每个EAR在类路径上包含一个“全局”
.properties
文件,用于配置值很少变化和/或通常在环境中保持一致(例如某些事物过期的天数)。 此外,全局配置文件包含合理的默认值(例如,数据库服务器主机名的“localhost
”)。 全局properties
文件(有多个,见下文)在源树中维护。 - 对于每个开发环境/安装/服务器/部署,(可能)是一个“本地”属性文件,其中包含覆盖全局配置设置的本地设置,例如数据库名称,密码等。
“本地”属性文件的预期路径在全局配置文件(例如/etc/myapp/local.properties
)或C:\myapp\local.properties
。
实际上,我们甚至允许在文件名中替换本地配置文件中的一些变量,例如“ ${hostname}
”。 最初的想法是,通过主机名( local.machineA.properties
, local.machineB.properties
)区分它们,也可以在一些中央源控件中维护本地属性,但我们目前不使用它,因为我们的生产所有计算机上的设置都相同(Amazon S3密钥,数据库密码/主机等)。
组装开发,测试,生产
我们根据使用Maven配置文件的开发阶段组装不同的EAR。
一开始,将所需的global.${profile.name}.properties
文件(其中profile.name
,例如dev
或production
)复制到类路径中的预期global.properties
文件中。
例如, dev
和testing
共享一个共同的AmazonS3秘密/存储桶,它在configuration.dev.properties
文件中为所有开发人员配置一次,而configuration.production.properties
则不包含我们的生产密钥。
此外,我们的dev
和testing
环境已经启用并配置了调试,比如web.xml
,但当然staging
和production
都没有。 我们基于.properties
的方法无法更改web.xml
等文件,但使用Maven构建配置文件很容易。
根据每个人的经验,您的问题可以有许多可能的解决方案。 所以,为什么不试试一些已经讨论过的想法。 请看看
- 为dev / QA / prod配置Java EE 6
- 如何配置Java EE应用程序以应用不同的设置
希望这两个能让您对如何使用maven构建整个环境有一些共识。
- dependency injection:按区域划分范围(Guice,Spring,Whatever)
- Android Dagger 2 Dependency没有被注入
- Jersey和spring集成 – bean Injections在运行时为null
- 配置Guice模块提供的对象
- 如何在jersey2 / hk2应用程序中获取Jackson Object Mapper的引用
- 被测单元:Impl还是接口?
- 使用@Autowired将依赖项注入使用“new …”创建的对象中
- 如何以静态方法以编程方式将Java CDI托管bean注入局部变量
- 如何在jersey / hk2应用程序中正确配置EntityManager?