2013-01-07 61 views
2

資源我已經建立了基本的Maven項目在Java SE,與資源:的getResource()不是定位在類路徑

main 
    -java 
    -resources 
    -config -> database.properties 

現在,因爲我不想在最後的罐子這個資源,我定義:

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <excludes> 
        <exclude>config/database.properties</exclude> 
       </excludes> 
      </configuration> 
      <executions> 
       <execution> 
        <id>make-jar-ultimateParser</id> 
        <phase>package</phase> 
        <goals> 
         <goal>jar</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${project.build.directory}/dist</outputDirectory> 
         <finalName>testApp</finalName> 
         <archive> 
          <compress>false</compress> 
          <!-- Manifest - MainClass & ClassPath --> 
          <manifest> 
           <mainClass>aa.bb.Class</mainClass> 
           <addClasspath>true</addClasspath> 
           <classpathPrefix>lib/</classpathPrefix> 
          </manifest> 
          <manifestEntries> 
           <Class-Path>config/database.properties</Class-Path> 
          </manifestEntries> 
         </archive> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
     <!-- Copy configuration files --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-resources-plugin</artifactId> 
      <version>2.6</version> 
      <executions> 
       <execution> 
        <id>copy-resources</id> 
        <phase>validate</phase> 
        <goals> 
         <goal>copy-resources</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${project.build.directory}/dist/config</outputDirectory> 
         <resources> 
          <resource> 
           <directory>src/main/resources/config</directory> 
          </resource> 
         </resources> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.0</version> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

所以資源在類路徑上,並且資源的目錄被複制到最終的jar文件中。

我的清單看起來是這樣的: 「類路徑:配置/ database.properties」

但我不能夠閱讀:

String db = "/config/database.properties"; 
properties = new Properties(); 
properties.load(getClass().getResourceAsStream(db)); 

我想絕對/相對路徑,getClass()/ClassLoader 。沒有。它在NetBeans中完美地工作,但就是這樣。

+0

你是說它在NetBeans中可用,但不是在生產中?我不完全明白你想要做什麼。 – ccleve

+0

Maven有自己的類加載器,它可以做有趣的事情。我建議你在maven下打印'java.class.path',你可能會發現它比你期望的要短。 –

+0

你能打印出jar文件maven包的內容嗎?你在其中找到一個database.properties嗎? –

回答

1

您誤解了Maven Resources插件的功能。它只是將資源(可能帶有轉換)複製到構建輸出目錄中。然後將它們包含在構建工件(JAR,WAR,無論)中。

爲了完成這項工作(使用Class-Path清單條目引用JAR的目錄),您需要單獨分發配置文件。或者使用File來引用它,而不用打擾類路徑。

更好的方法是將應用程序作爲程序集分發,該程序集包含核心應用程序,任何依賴項和配置文件。這通常會打包爲一個ZIP文件,並且用戶將其解壓縮以進行安裝。

+0

準確地說我會有core.jar + ./libs + ./config但是我無法讀取./中的資源。使用getResource配置core.jar – user987220

+0

也許我誤解了/ src/main/resources的全部內容,應該將這些「可配置」文件放在/ config中並使用File來讀取它們 – user987220

+0

@ user987220 - src/main/resources '是一個放置不可編譯的文件的地方,這些文件最終會出現在最終的工件中,但是您似乎明確地將它們排除在該工件之外,因此應用程序無法找到它們。 – parsifal

0

我不明白你爲什麼排除它。 Maven使用自己的資源目錄。 項目 | - pom.xml -- src - 主要 ` - 資源 這樣一來,它使得程序員的生活變得更輕鬆。當你使用這種方式時,Theres不需要獲得班級或其他。