Java 从不同位置加载属性
我正在努力寻找一种解决方案,根据不同的环境从不同的位置访问配置文件(Java 从不同位置加载属性,java,maven,properties,configuration,Java,Maven,Properties,Configuration,我正在努力寻找一种解决方案,根据不同的环境从不同的位置访问配置文件(dev,prod) 这是我的项目的大致布局 │ pom.xml └───src └───main ├───java │ ConfigurationLoader.java ├───resources │ conf1.properties └───webapp
dev
,prod
)
这是我的项目的大致布局
│ pom.xml
└───src
└───main
├───java
│ ConfigurationLoader.java
├───resources
│ conf1.properties
└───webapp
│ web.xml
└───WEB-INF
ConfigurationLoader
是一个自我描述的类,应该是一些简单的单例,在整个应用程序中静态可用
在dev
环境中,它应该从类路径根加载conf1.properties
,但在prod
env中,它应该在容器的根文件夹中找到它们(例如%TOMCAT\u HOME%\bin
)
对于这种选择性属性加载,如何正确地实现ConfigurationLoader
谢谢
UPD:
我对ConfigurationLoader
实现和属性文件位置更感兴趣。问题在于ConfigurationLoader
如何定位这些文件。比如:
String path = "/conf1.properties";
File confFile;
switch (environment) {
case "dev": //classpath
URI location = ConfigurationLoader.class.getResource(path).toURI();
confFile = new File(location);
break;
case "prod": //root (?)
confFile = new File(path);
break;
}
Properties p = new Properties(confFile);
这里有几个问题:
-Denv=whatever
)applicationContext.xml
,它也应该位于dev
的类路径上,或者位于bin
tomcat的文件夹中),该怎么办?这些路径应该是什么样子,我需要如何在我的代码中解析它们,以避免ConfigurationLoader
部分的代码重复是否有机会更多地在maven中解决,而更少地在代码中解决,或者存在其他什么方法?尽管可能有多种解决方案,但我更喜欢以下方法: 使用两个实现相同接口的不同类(例如,
ConfigurationLoader
接口),一个处理类路径中的配置,另一个处理文件大小写。为您的应用程序使用一个属性文件(例如app.properties),该文件将由您的构建(prod和dev的不同值)创建,并且将始终位于类路径中的同一位置,例如根包。在此文件中,您将具有以下属性:
config.loader.class=com.mycompany.ClasspathConfigurationLoader # or FileConfigurationLoader for prod environment
config.loader.resource.classpath=resources/conf1.properties # use classloader.getResourceAsStream() to load this resource
config.loader.resource.file=/path/to/tomcat/home/bin/conf1.properties
现在,由于您的加载程序是一个单例加载程序,因此您将拥有一个静态块,该块将读取属性文件,并根据第一个属性决定创建何种类型的实例作为ConfigurationLoader
类。
然后,每个不同类型的实例都可以使用附加属性来决定加载哪个资源。喜欢这个问题!我们遇到了完全相同的问题,解决方法如下。我们项目的结构基本相同,除了一个额外的
外部资源-{username}
文件夹:
│ pom.xml
└───src
└───main
├───java
│ ConfigurationLoader.java
├───external-resources-drvdijk
│ conf.properties
├───resources
│ conf.default.properties
└───webapp
│ web.xml
└───WEB-INF
然后,在pom.xml
中,我们包括:
<profiles>
<profile>
<id>development</id>
<build>
<resources>
<resource>
<directory>src/main/external-resources-${user.name}</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</profile>
</profiles>
发展
src/main/external resources-${user.name}
真的
这使每个团队成员都能够创建自己的外部资源-{username}
目录,启用Maven概要文件,并进行构建
我们版本的ConfigurationLoader.java
(实际上在我们的项目中使用了不同的名称)将首先读取conf.default.properties
文件中的所有属性(它们也可以是“空”属性,例如db.username=
)。然后,它将加载Maven概要文件或应用服务器的lib
目录中包含的conf.properties
,并用conf.default.properties
中找到的属性覆盖conf.properties
中的所有现有属性
在conf.default.properties
中,我们明确列出了应用程序可以处理的所有属性。如果在加载所有属性(包括conf.properties
)后,某些属性丢失(或找到一些未知属性),应用程序将引发大量错误并拒绝启动
希望这对您有所帮助:)您能否定义两种环境,并使用if语句检查您当时使用的环境?这可能在你的设置文件或类似文件中。+1比我快。个人资料是一条路要走。它们可以在POM中声明,也可以在设置文件中声明,并根据需要启用。另一个例子见:嗨,谢谢你的回答。请参阅上面我的upd以获得更多描述性评论。您好,谢谢,这是我目前的解决方案,但在引用该属性文件中的其他资源时存在问题。我想我需要以ConfigurationLoader的几种实现方式为这些资源重复loader。查看我的更新