【发布时间】:2015-03-19 03:29:59
【问题描述】:
我知道这个问题以前被问过很多次,但我仍然无法让它发挥作用。 我想要实现的是创建将在运行时加载资源(打包在 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 启动应用程序时工作正常。但是,当我从 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>
【问题讨论】:
-
我认为通常资源目录中的文件应该放在类路径的根目录下,而不是放在名为资源的文件夹中。您目前如何制作 jar 文件?
-
有两种方式:从eclipse导出runnable jar和mvn install。他们都没有工作
-
那么问题是您的
img文件夹位于资源文件夹下。鉴于您提供的代码,它应该位于类路径的顶部。 -
但是当我更改为 getResource("resources/img/splash.png") 从 Eclipse 启动应用程序时它不起作用...
-
没错,你需要解决这个问题。您需要使您的构建与您的开发环境保持一致。