2015-01-20 2 views
0

이 질문은 여러 번 전에 물어 보았지만 여전히 작동하지는 않습니다. 내가 달성하고 싶은 것은 이클립스에서 애플리케이션을 실행하는 동안 리소스 로딩을 중개하지 않고 런타임에 리소스 (jar로 묶음)를로드 할 jar를 생성하는 것이다.Eclipse 및 Maven - jar의 리소스

내 프로젝트 구조는 표준 :로드 이미지 리소스에 대한

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

코드 : 그것은 잘 작동

 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 파일에서 작업하고 만들어?

나는 또한 메이븐 플러그인으로 항아리를 만들려고했으나 운이 없었다.

<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

일반적으로 resources 디렉토리의 파일은 resources라는 폴더가 아닌 classpath의 루트에 있어야한다고 생각했습니다. jar 파일을 어떻게 만들고 있습니까? – thatidiotguy

+0

두 가지 방법으로 : eclipse에서 runnable jar를 내보내고 mvn install에서 설치하십시오. 그들 중 누구도 일하지 않고있다. – MGorgon

+0

글쎄, 문제는 당신의'img' 폴더가 resources 폴더 아래에 있다는 것이다. 그것은 당신이 제공 한 코드를 classpath 맨 위에 위치해야합니다. – thatidiotguy

답변

3

당신은 당신의 자원을로드하기 위해 다음과 같은 방법을 가야한다 :

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

점은 src/main/resources가 자동으로 클래스 패스의 루트입니다 target/class에 복사되는 것입니다. 이것은 패키지화 된 jar뿐만 아니라 Eclipse에서도 작동합니다.

실행 가능한 단지는 다음과 같이 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> 

이를 추가 한 후에는을 통해 전체 실행 가능한 항아리 만들 수 있습니다

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