Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从不同位置加载属性_Java_Maven_Properties_Configuration - Fatal编程技术网

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);
这里有几个问题:

  • 我应该如何将环境变量从Maven(在概要文件或其他文件中定义)传递给代码?我不想过滤java类,也不想只使用环境条目预加载另一个属性文件。此外,我认为我无法在生产平台上修改系统属性(
    -Denv=whatever

  • 如果属性文件需要包含其他系统组件访问的某些资源的路径(例如spring的
    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。查看我的更新