Eclipse和Maven - jar中的资源

时间:2015-01-20 19:02:49

标签: java eclipse maven jar

我知道这个问题之前已被问过多次,但我仍然无法管理它。 我想要实现的是创建jar,它将在运行时加载资源(在jar中打包),而不会在从Eclipse执行应用程序时代理资源加载。

我的项目结构是标准的:

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启动App时工作正常。但是,当我从Eclipse导出runnable jar时,它不起作用。

导出的jar在其根目录中有/ resources / img文件夹。但是当应用程序启动时,会抛出异常:

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

如何从runnable jar文件和从Eclipse运行App时使其工作?

我还试图用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>

1 个答案:

答案 0 :(得分:3)

您应该按照以下方式加载资源:

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

关键是src/main/resources会自动复制到target/class,这是类路径的根。这也适用于Eclipse以及打包的jar。

maven通过maven-assembly-plugin创建一个可运行的jar,如下所示:

<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文件夹中生成一个jar文件,其外观如下:'whatever-1.0-SNAPSHOT-jar-with-dependencies.jar'。

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