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