2012-03-08 144 views
0

我正在構建一個依賴於某些配置文件的命令行工具。我該如何選擇maven項目中配置文件的位置

在開發過程中,我將這些文件放在src/main/resources之下,並且可以通過getClass().getResourceAsStream("/config-file-name")訪問,效果很好。

我選擇maven-assembly-plugin來構建具有所有依賴項的jar。

<plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>com.myproject.Scheduler</mainClass> 
        </manifest> 
       </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
      <executions> 
       <execution> 
        <id>make-my-jar-with-dependencies</id> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
    </plugin>  

配置文件都包裝在jar中,但我想分開它們。

所以,我添加了以下配置,

<resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <includes> 
       <include>conf.properties</include> 
      </includes> 
      <filtering>true</filtering> 
      <excludes> 
       <exclude></exclude> 
      </excludes> 
     <targetPath>..</targetPath>    
     </resource> 
    </resources> 

做到了這一點之後,配置文件是沿側罐子,而不是包裹在罐子。

但我的代碼現在無法訪問這些文件。

我是否需要改變訪問代碼中文件的方式?

或者我應該不需要把這些文件放在src/main/resources/,任何替代?

如果有人知道,請幫助。

謝謝。


更新:最後,我放棄了使用maven資源文件,而不是,我默認設置的文件路徑相同的路徑罐子,一切正常,除了Eclipse的抱怨。

由於我想將配置文件從jar中移出,並且不希望它位於target/classes文件夾中,所以我使用<targetPath>..</targetPath>將配置文件移動到與jar文件相同的目錄中。

當我重新生成eclipse項目設置時,Eclipse說:無法在輸出文件夾「project/target」中嵌套輸出文件夾「project/target/test-classes」。

有人幫我嗎?

+0

配置文件在你的類路徑中的位置? 'getClass()。getResourceAsStream(「/ config-file-name」)'使用類路徑位置來查找資源。 – 2012-03-08 07:30:12

+0

是的,它使用,但它是訪問maven項目中的資源文件的正常方式。我想我可能會把我的配置文件放在其他地方而不是src/main/resources,我更喜歡與正在運行的jar相同的目錄,我正在尋找如何在代碼內部運行jar路徑。 – 2012-03-08 07:49:01

+0

'System.getProperty(「user.dir」)'會給你內部代碼的路徑。請參閱[System.getProperties()](http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#getProperties%28%29)和[System.getProperty(String key) ](http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#getProperty%28java.lang.String%29)。 – FrVaBe 2012-03-08 08:05:55

回答

0

我終於放棄了使用maven資源文件,默認情況下將文件路徑設置爲與jar相同的路徑,除非Eclipse抱怨,否則一切正常。 (因爲我想將配置文件從jar中移出,並且不希望它位於target/classes文件夾中,所以我使用..將配置文件移動到與jar文件相同的目錄中。我重新生成eclipse項目設置,Eclipse說:無法在輸出文件夾「project/target」中嵌套輸出文件夾「project/target/test-classes」。)

直到現在我還沒有找到解決方案,錯誤。

現在,我放棄了Eclipse,並改爲IntelliJ IDEA,這是一個非常不錯的IDE,尤其與Maven完美集成。我將避免任何使用eclipse進行任何Maven項目的機會。

0

您的應用程序不能訪問配置文件,因爲它不在其類路徑中。

如果您想將配置文件與其他應用程序分開,您可能需要重新查看您的assembly format。您可能希望使用bin而不是jar -with-dependencies,儘管它在分發和使用方面帶來了挑戰。

0

根據屬性文件的複雜程度,可以使用資源插件篩選功能根據maven配置文件更改值。例如,如果你想擁有一個名爲location的屬性,你可以定義一個dev和生產配置文件,然後將該值設置爲pom(或配置文件)中的maven屬性。XML如果你是行家2):

<properties> 
    <my.location>the_real_value</my.location> 
</properties> 

然後在屬性文件,你可以這樣做:

location=${my.location} 

只要確保你設置你的POM中篩選上,像這樣:

<resources> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    </resource> 
</resources> 

當你建立,如果你在目標目錄中查找,並查看屬性文件,你會看到在取代正確的值。

+0

該屬性很複雜,所以我必須使用屬性文件,但不要介意,我不再將其放在src/main/resources中,並通過文件路徑訪問它。 – 2012-03-09 05:26:02

+0

你應該可以在物業中使用任何東西,它會工作。所以不知道爲什麼「複雜」會導致你移動文件並通過文件路徑訪問它,這是一個非常不可移植的方法來使用。 – Michael 2012-03-09 13:02:24

+0

它有很多可能會隨時更改的配置設置。我只想分開配置文件和正在運行的jar,把它們放在pom.xml中似乎沒有任何幫助。 – 2012-03-11 05:31:04

相關問題