2017-02-17 249 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的問題。 –