Java/Gradle读取外部配置文件

Java/Gradle读取外部配置文件,java,gradle,Java,Gradle,我的项目结构如下所示。我不想将配置文件作为资源包含在内,而是在运行时读取它,这样我们就可以简单地更改设置,而无需重新编译和部署。我的问题是两件事 尽管我尝试了各种方法,但读取文件还是不起作用(请参阅下面我正在尝试的当前实现) 使用gradle时,我是否需要告诉它如何构建/或部署文件以及在何处?我认为这可能是问题的一部分。在Eclipse中进行gradle构建或尝试调试时,配置文件没有得到部署 我的项目结构: myproj\ \src \main

我的项目结构如下所示。我不想将配置文件作为资源包含在内,而是在运行时读取它,这样我们就可以简单地更改设置,而无需重新编译和部署。我的问题是两件事

  • 尽管我尝试了各种方法,但读取文件还是不起作用(请参阅下面我正在尝试的当前实现)
  • 使用gradle时,我是否需要告诉它如何构建/或部署文件以及在何处?我认为这可能是问题的一部分。在Eclipse中进行gradle构建或尝试调试时,配置文件没有得到部署
  • 我的项目结构:

    myproj\
            \src
                \main
                    \config
                        \com\my_app1\
                                    config.dev.properties
                                    config.qa.properties
                    \java
                        \com\myapp1\
                                    \model\
                                    \service\
                                    \util\
                                        Config.java
                \test              
    
    Config.java:

    public Config(){
            try {
                String configPath = "/config.dev.properties"; //TODO: pass env in as parameter
                System.out.println(configPath);
                final File configFile = new File(configPath);
                FileInputStream input = new FileInputStream(configFile);
    
                Properties prop = new Properties()
                prop.load(input);
                String prop1 = prop.getProperty("PROP1");
                System.out.println(prop1);
            } catch (IOException ex) {
                ex.printStackTrace();
            } 
        }   
    
    尽管我尝试了各种方法,但读取文件还是不起作用(请参阅下面我正在尝试的当前实现)

    你需要澄清这一说法。您正在尝试从现有文件加载属性吗?因为您发布的加载
    属性
    对象的代码是正确的。因此,错误可能在文件路径中

    不管怎样,我只是在猜你想做什么。你需要澄清你的问题。您的应用程序是否像下面的示例一样是一个可执行的jar?正在尝试加载jar之外的外部文件(在这种情况下,gradle无法帮助您)

    如果您将这样一个简单的应用程序构建为一个可执行的jar

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.Properties;
    
    public class Main {
        public static void main(String[]args) {
            File configFile = new File("test.properties");
            System.out.println("Reading config from = " + configFile.getAbsolutePath());
    
            FileInputStream fis = null;
            Properties properties = new Properties();
    
            try {
                fis = new FileInputStream(configFile);
                properties.load(fis);
            } catch (IOException e) {
                e.printStackTrace();
                return;
            } finally {
                if(fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {}
                }
            }
    
            System.out.println("user = " + properties.getProperty("user"));
        }
    }
    
    运行jar时,应用程序将尝试从位于应用程序工作目录中名为
    test.properties
    的文件加载属性

    因此,如果您有
    test.properties
    ,则如下所示

    user=Flood2d
    
    输出将是

    Reading config from = C:\test.properties
    user = Flood2d
    
    这是因为jar文件和
    test.properties
    文件位于
    C:\
    中,我从那里运行它

    一些java应用程序从Windows上的
    %appdata%
    或MacOS上的
    /Library/Application
    等位置加载配置。当应用程序的配置可以更改(可以通过手动编辑文件或应用程序本身更改)时,使用此解决方案,因此无需使用新配置重新编译应用程序


    如果我误解了什么,请告诉我,这样我们就可以了解您想问我们什么。

    Ans 1

    尽管我尝试了各种方法,但读取文件还是不起作用 (请参阅下面我正在尝试的当前实现)

    使用您描述的配置文件的位置

    改变

    String configPath=“/config.dev.properties”

    String configPath=“src\main\config\com\my\u app1\config.dev.properties”

    不过,请先阅读第二个答案

    Ans 2

    使用gradle时,我是否需要告诉它如何构建/或部署文件 在哪里?我认为这可能是问题的一部分..配置 在执行gradle生成或尝试 在Eclipse中调试

    你有两个选择:

  • config
    目录重命名为
    resources
    。Gradle会自动在“src/main/resources”目录下构建资源
  • 让Gradle知道要视为资源的附加目录

    sourceSets {
        main {
            resources {
                srcDirs = ["src\main\config\com\my_app1"]
                includes = ["**/*.properties"]
            }
        }
     }
    

  • 您的问题有点模糊,但我感觉您希望配置文件位于jar的“外部”

    我建议你看一下这本书。这将为您的应用程序创建一个zip,还将生成一个启动脚本来启动它。我想你需要:

  • 自定义
    distZip
    任务,为配置文件添加额外文件夹
  • 自定义
    startScripts
    任务,将额外文件夹添加到启动脚本的类路径中

  • 我能够读取外部(非资源)文件的解决方案是在应用程序的根目录下创建我的配置文件夹

    myproj/
          /configs
    

    这样做可以让我通过使用'config/config.dev.properies'阅读配置

    我对gradle不熟悉,因此我只能对您的问题1给出一些建议。我认为您可以将属性文件的完整路径作为FileInputStream的参数,然后使用prop.load加载它

    FileInputStream input = new FileInputStream("src/main/.../config.dev.properties");
    
    Properties prop = new Properties()
    prop.load(input);
    // ....your code
    

    我不知道如何以及在哪里部署应用程序,但您可以直接使用它吗?第二个选项是有一个指向文件的静态路径,该路径将包含指向其他配置的路径。您可以共享您的实际build.gradle吗?尝试使用try with resources它使代码位更干净感谢您的建议。我更喜欢使用finally,因为它的代码与问题中的代码类似。我认为海报不希望将文件打包在一个罐子中,而是希望它放在一个目录中,在这个目录中可以不解压缩就进行调整&如果OP确认这是他需要的,压缩againI会调整我的答案。@VHS-你的答案最接近我想要的,特别是Ans 2.2。是的,兰斯,我想要外部的。因此,正如您所指出的,我在build.gradle中指定了条目,现在我看到,当我进行gradle构建时,它会创建一个/my_app1/build/resources/main文件夹。然而,我仍然无法用上面的代码阅读这篇文章。错误是:“java.io.FileNotFoundException:\config.dev.properties(系统找不到指定的路径)”@VHS,在构建它之后,我正在通过eclipse进行调试。想知道我是否必须让eclipse知道给定项目的资源文件在哪里吗?@mike01010,如果您通过
    eclipse
    调试它,则相对路径都是相对于项目文件夹的,即包含
    src
    文件夹的文件夹。因此,如果您的
    build
    文件夹与
    src
    处于同一级别,您可以使用
    build/resources/main/config.dev.properties
    。请不要只发布代码答案,而是解释代码的作用以及它如何解决OPs问题。