Eclipse 和 Maven - jar 中的资源
Eclipse and Maven - resources in 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 启动应用程序时,它工作正常。但是,当我从 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>
您应该按照以下方式加载您的资源:
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?
我知道这个问题以前被问过很多次了,但我还是没办法解决它。 我想要实现的是创建 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>
您应该按照以下方式加载您的资源:
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?