2017-02-17 207 views
9

我的项目结构如下所示。我不想将配置文件作为资源包含进来,而是在运行时读取它,以便我们只需更改设置而无需重新编译和部署。我的问题是两件事情Java/Gradle读取外部配置文件

  1. 阅读恰恰是没有,尽管不同的方式工作的文件,我已经试过(见当前实现下面我试图)
  2. 使用时的gradle,我该needto告诉它如何构建/或部署该文件,并在哪里?我认为这可能是问题的一部分..配置文件在进行gradle构建或尝试在Eclipse中进行调试时没有部署。

我的项目结构:

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(); 
     } 
    } 
+0

我不知道如何以及在哪里部署应用程序,但是您可以使用它:https://github.com/stevesaliman/gradle-properties-plugin? 第二个选择是有一个静态路径到文件,其中将包含其他配置的路径。 –

+0

你能分享你的实际build.gradle? – ToYonos

回答

4

Ans 1

阅读恰恰是没有,尽管各种方法我都试过 (查看当前执行下面我试图)

与已描绘的您的配置文件的位置工作的文件,

更改

String configPath = "/config.dev.properties";

String configPath = "src\main\config\com\my_app1\config.dev.properties";

但是先阅读第二个答案。

答2

使用时的gradle,我该needto告诉它如何构建/或部署的文件 ,在哪里?我认为这可能是问题的一部分..配置 文件未在Eclipse中进行gradle build或尝试 调试时部署。

你有两个选择:

  1. 重命名config目录resources。 Gradle自动在“src/main/resources”目录下建立资源。
  2. 让Gradle知道额外的目录作为资源。

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

我认为海报不希望文件包装在一个罐子里,并希望它在一个目录,它可以调整,而无需再次解压缩和压缩 –

+0

如果OP确认这是他所需要的,我会调整我的答案。 – VHS

+0

@VHS - 你的答案最接近我想要的,特别是答案2.2。是的,我想要它在外面。所以我指定了build.gradle中的条目,如您所示,我现在看到当我执行gradle build时,它会创建一个/ my_app1/build/resources/main文件夹。然而,我仍然无法阅读这与我上面的代码。错误是:“java.io.FileNotFoundException:\ config.dev.properties(系统找不到指定的路径)” – mike01010

3

阅读恰恰是没有,尽管不同的方式工作的文件,我已经试过(见下面我目前的实现我正在尝试)

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

无论如何,我只是猜测你在做什么。你需要澄清你的问题。你的应用程序是一个可执行的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等位置加载配置。当应用程序具有可以更改的配置(可以通过手动编辑文件或由应用程序本身进行更改时)使用此解决方案,因此不需要使用新配置重新编译应用程序。

让我知道如果我误解了某些东西,所以我们可以弄清楚你想问我们什么。

+1

尝试使用try-with-resources使代码更清晰 – rajadilipkolli

+0

感谢您的建议。我更喜欢最终使用,因为它的代码与问题中的代码类似。 – Flood2d

1

你的问题是微渺,但我得到你想要的配置文件(县)住罐子的“外部”的感觉。我建议你看看application plugin。这将创建一个应用程序的zip文件,并且还会生成一个启动脚本来启动它。我想你会需要:

  1. 定制distZip任务多加一个文件夹下的配置文件
  2. 定制startScripts任务额外的文件夹添加到启动脚本的类路径
0

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

myproj/ 
     /configs 

这样做可以让我通过读CONFIGS“配置/ config.dev.properies”

0

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

FileInputStream input = new FileInputStream("src/main/.../config.dev.properties"); 

Properties prop = new Properties() 
prop.load(input); 
// ....your code 
+0

请不要只发布代码的答案,而是解释你的代码做什么以及它如何解决OP的问题。 –