2016-03-04 94 views
0

我使用Sparkjava開發了一個簡單的應用程序。我使用Intellij,當我運行測試或在本地運行應用程序時,所有資源都是文件。有沒有更簡單的方法來讀取* .jar或文件系統?

但是,當我部署時,整個事情作爲一個jar文件運行。因此,我需要一種方法來從文件系統或jar中讀取我的資源,具體取決於應用程序的啓動方式。下面的代碼可以完成工作,但看起來很笨拙:

String startedOffFile = new java.io.File(Main.class.getProtectionDomain() 
     .getCodeSource() 
     .getLocation() 
     .getPath()) 
     .getName(); 
InputStream inputStream; 
if(startedOffFile.endsWith(".jar")) { 
    ClassLoader cl = PropertiesParser.class.getClassLoader(); 
    inputStream = cl.getResourceAsStream("myapp.dev.properties"); 
} else { 
    inputStream = new FileInputStream(filename); 
} 

是否有更清潔/更簡單的方法?

+0

對我來說很好。 –

+5

爲什麼不總是從類路徑加載資源(即使用ClassLoader.getResourceAsStream()),而不是使用文件IO?資源是否位於類路徑中的目錄中,或位於類路徑中的jar中對您的代碼沒有影響。 –

+0

http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResourceAsStream%28java.lang.String%29 –

回答

1

如果你正在使用Maven的IntelliJ用,只是把配置屬性模塊中的src/main/resources目錄內的文件。如果您沒有使用Maven,那麼將屬性文件放在源代碼樹的根目錄中(在任何包之外 - 例如:src/myapp.dev.properties)。

打包/導出JAR後,將使用new Object().getClass().getClassLoader().getResourceAsStream("myapp.dev.properties")(使用new Object()...,因爲在某些情況/平臺中未定義靜態ClassLoader)可訪問該文件。

IntelliJ/Eclipse環境使用相同的類路徑,這意味着不需要特殊情況下加載文件。

如果您需要區分開發和生產屬性。您可以使用Maven配置文件進行構建時打包,也可以使用-D開關將變量加載到變量中。

+0

使用maven爲特定環境構建特定的Jars不是一個好主意。世界很久以前就已經開始了。當您外化您的配置並讓您的代碼對其作出反應時,持續部署,DevOps和Container部署效果最佳。 –

+0

該問題未指定應用程序的類型。它可能是桌面應用程序,不要忘記,這是一種很常見的應用程序類型,其中不存在DevOps,容器和新時代部署概念。第二件要注意的是實際問題,在IntelliJ運行測試時加載相同的配置,並作爲獨立的JAR文件加載。最後,答案顯然建議用-D選項覆蓋屬性文件。 – sahel

+0

DevOps適用於所有應用程序類型,包括桌面。關於持續部署沒有新東西。這個問題是關於一個Web服務器。使用Maven構建不同的Jars(桌面或其他)沒有錯,但可能導致問題。爲包括IntelliJ在內的所有部署構建單個Jar是一個更好的選擇,因爲它簡化了代碼庫。 –

2

是否您的main創建此類,以確定您的java可執行文件是否定義了config.location參數或將在類路徑中查找。

例如。 java -Dconfig.location=/here/myapp.dev.properties -jar youapp.jar

public class ApplicationProperties { 
    public ApplicationProperties() throws IOException { 
     final Properties properties = new Properties(); 

     String location = getProperty("config.location") 
     if(location != null) { 
      properties.load(new FileInputStream(getProperty("config.location", ENV_PROPERTIES_PATH))); 
     } else { 
      properties.load(Classname.class.getClassLoader().getResourceAsStream("myapp.dev.properties")); 
     } 
    } 

    public Properties getProperties() { 
     return properties; 
    } 
} 
相關問題