【问题标题】:Eclipse and Maven - resources in jarEclipse 和 Maven - jar 中的资源
【发布时间】: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 启动应用程序时它不起作用...
  • 没错,你需要解决这个问题。您需要使您的构建与您的开发环境保持一致。

标签: java eclipse maven jar


【解决方案1】:

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

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

重点是src/main/resources 将自动复制到target/class,这是您的类路径的根目录。这也适用于打包的 jar 包中的 Eclipse。

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 在您的构建中的用法?

【讨论】:

  • 它与 classLoader.getResourceAsStream("img/splash.png") 和 maven-assembly-plugin 中的一些附加配置一起使用。 maven-dependency-plugin 正在将库复制到外部文件夹,但现在对 maven-assembly-plugin 没有用。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 2010-12-20
  • 1970-01-01
相关资源
最近更新 更多