2014-10-31 130 views
9

我正在用maven構建一個可執行的jar文件,這意味着您使用「java -jar file.jar」運行它。Maven:添加外部資源

我想在用戶定義的屬性(只是一個包含鍵/值的文件),在開發階段我把我的「user.properties」文件放在maven/src/main/resources /文件夾中。

我的屬性文件加載:

final Properties p = new Properties(); 
final InputStream resource = IOParametres.class.getResourceAsStream("/user.properties"); 
p.load(resource); 

現在,我想保持該文件的JAR之外,並有這樣的事情:

- execution_folder 
    |_ file.jar 
    |_ config 
     |_ user.properties 

我試圖與Maven插件很多東西像maven-jar-plugin,maven-surefire-plugin和maven-resources-plugin,但我無法得到它的工作...

在此先感謝您的幫助!

+0

user.properties是一個單獨的文本文件,您保存在您的jar旁邊並希望在運行時讀取?因爲如果是這樣...你可能應該像對待任何其他外部文件一樣對待 – Deltharis 2014-10-31 10:19:42

+0

是的,它只是一個單獨的文件,但事情是 1-我不知道用戶將放置jar和配置文件的位置 2 - I有依賴關係使用的其他資源文件(數據庫連接等) – GournaySylvain 2014-10-31 10:26:26

+0

如果你喜歡外面的屬性文件,你需要設置類路徑指向你的'executon_folder/config /'文件夾,否則你將無法訪問你的用戶。 properties'。所以一個簡單的'java -jar file.jar'將不起作用。 – khmarbaise 2014-10-31 13:57:55

回答

13

我發現我只需要使用maven配置。

首先我config文件夾添加到類路徑:

<build> 
<plugins> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.3.1</version> 
    <configuration> 
     <archive> 
      <manifestEntries> 
       <Class-Path>config/</Class-Path> 
      </manifestEntries> 
     </archive> 
    </configuration> 
</plugin> 
</plugins> 
</build> 

我加載資源,以同樣的方式爲前:

final InputStream resource = IOParametres.class.getResourceAsStream("/user.properties"); 
p.load(resource); 

如果你想保持你的例子資源文件在您的回購和從您的內部刪除他們:

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <excludes> 
       <exclude>user.properties</exclude> 
       <exclude>conf/hibernate.cfg.xml</exclude> 
      </excludes> 
     </resource> 
    </resources> 
</build> 

旁邊的jar文件,我添加一個配置文件夾所有我需要的資源文件。

結果是:

  • user.properties可以使用的getResourceAsStream加載
  • 其他庫依賴於特定的資源(我不會說,但我覺得......沒有那麼好)可以加載他們的資源沒有任何問題。

感謝您的幫助,我希望這有助於某個人!

+0

我想要做同樣的事情,但首先我需要獲取jar文件旁邊的configs目錄。如何實現這一目標? – SachiDangalla 2018-02-26 08:58:08

+0

我真的不明白你的問題在我的情況下,配置文件沒有存儲在jar文件(排除在pom.xml文件中)。配置文件的創建和複製必須在部署端進行管理 – GournaySylvain 2018-02-26 09:29:14

+0

是的。我想要一種方法來獲取jar外的配置文件夾,而無需手動拷貝或粘貼。你是怎麼處理的呢? – SachiDangalla 2018-02-26 09:32:22

1

正如我在評論中提到的 - 它看起來像你想使用user.properties文件作爲除了你的jar之外的文本文件。如果是這樣的話,比使用它更簡單 - 包含你的jar文件的目錄是在運行時檢查的當前目錄。這意味着你需要的只是:

properties.load(new FileInputStream("config/user.properties")); 

沒有試圖放在項目classpath上。

如果還有其他工作要做,只需將資源目錄中的屬性複製到目標以避免手工操作的麻煩。這可以通過maven-antrun-plugin來實現:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>generate-resources</phase> 
        <goals> 
         <goal>run</goal> 
        </goals> 
        <configuration> 
         <tasks> 
          <mkdir dir="${project.build.directory}" /> 
          <copy file="${basedir}/src/main/resources/user.properties" tofile="${project.build.directory}/config/user.properties" /> 
         </tasks> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
+0

我理解你的解決方案,我可以用它來處理我的一些文件,但在我的資源中,我也有一個「hibernate.cfg.xml」和其他一些由我調用的庫使用的文件。而這個庫只是尋找資源文件(調用_getResourceAsStream_) – GournaySylvain 2014-11-03 16:02:26