2015-01-20 85 views
0

我知道這個問題之前被問過很多次,但我仍然無法管理它的工作。 我想要實現的是創建jar,它將在運行時加載資源(打包成jar),而不會在從Eclipse執行應用程序時破壞資源加載。Eclipse和Maven - 罐子裏的資源

我的項目的結構標準:

src/main/java 
src/main/resources 
src/test/java 
src/test/resources 

代碼加載圖像資源:開始從Eclipse應用程序時

 ClassLoader classLoader = getClass().getClassLoader(); 
     splashImage = ImageIO.read(new File(classLoader.getResource("img/splash.png").getFile())); 

這是工作的罰款。但是,當我從Eclipse中導出可運行jar時,它不起作用。

導出的jar有/ resources/img文件夾放在它的根目錄下。但是,應用程序啓動時,會拋出異常:

Caused by: javax.imageio.IIOException: Can't read input file! 

它是如何可能使它從運行的JAR文件工作,並從Eclipse運行應用程序時?

我也試圖用maven插件構建jar,但沒有運氣。

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.8</version> 
      <executions> 
       <execution> 
        <id>copy-dependencies</id> 
        <phase>package</phase> 
        <goals> 
         <goal>copy-dependencies</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${project.build.directory}/lib</outputDirectory> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <classpathPrefix>lib/</classpathPrefix> 
         <mainClass>foo.bar.App</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 
+0

我認爲資源目錄中的文件應該放在classpath的根目錄下,而不是放在名爲resources的文件夾中。你目前如何製作jar文件? – thatidiotguy 2015-01-20 19:05:38

+0

有兩種方法:從eclipse和mvn安裝中導出可運行的jar。沒有人工作 – MGorgon 2015-01-20 19:06:55

+0

那麼問題是你的'img'文件夾在資源文件夾下。根據您提供的代碼,它應該位於類路徑的頂部。 – thatidiotguy 2015-01-20 19:08:56

回答

3

你應該去通過以下方式加載你的資源:

classLoader.getResourceAsStream("/img/splash.png") 

的一點是,src/main/resources會自動被複制到target/class這是你的classpath的根目錄。這將在Eclipse以及包裝的jar中工作。

一個可運行的jar將被行家通過maven-assembly-plugin創建這樣的:

<project> 
    [...] 
    <build> 
    [...] 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.5.3</version> 
     <configuration> 
      <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
     [...] 
</project> 

您添加此之後,你可以創建通過全面運行的JAR:

mvn clean package 

這將產生一個罐子文件在target文件夾中,如下所示:'whatever-1.0-SNAPSHOT-jar-with-dependencies.jar'。

我不明白的是在你的構建中使用maven-dependency-plugin?

+0

它與classLoader.getResourceAsStream(「img/splash.png」)一起工作,並且在maven-assembly-plugin中只有很少的輔助配置。 maven-dependency-plugin正在將庫複製到外部文件夾,但現在使用maven-assembly-plugin是沒有用的。感謝幫助 – MGorgon 2015-01-20 19:51:52