当前位置: 首页 > 知识库问答 >
问题:

Eclipse和Maven-jar中的资源

程举
2023-03-14

我知道这个问题以前被问过很多次,但是我仍然不能管理它工作。我想实现的是创建一个在运行时加载资源(打包在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导出runnable jar时,它不起作用。

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

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

当从Eclipse运行应用程序时,如何从runnable jar文件使其工作?

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

易昌翰
2023-03-14

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

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

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

maven将通过maven assembly插件创建一个可运行的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

这将在目标文件夹中生成一个jar文件,该文件看起来像:'无论-1.0-SNAPSHOT-jar-with-dependencies.jar'。

我不明白的是maven依赖插件在你的构建中的用法?

 类似资料:
  • 问题内容: 我有一个问题,那个maven正在Eclipse安装文件夹中寻找资源。 这是说: 当我的工作区在内部时。 pom.xml是否有任何配置以命令它从其位置看起来是相对的? 编辑#1: 我正在从Eclipse运行Maven。从命令行可以毫无问题地进行编译。 我正在尝试运行Junit测试。 编辑2: 所有依赖项,web.xml等都可以- 我知道这是因为其他开发人员在Linux上和Idea上使用的

  • 问题内容: 我有一些可怕的行为。我有以下Maven配置: 这将创建包含所有类的JAR文件,但我在类路径中有一些资源也应包括在内。如果我将参数放在阶段的前面,那么我的所有资源都会包括在内。如果我使用运行Maven ,则不包含任何资源。我的资源位于(不是通常的目录)下。 问题答案: 目标配置中未正确定义资源的源目录。同样,outputDirectory元素将资源放置在dir中,默认情况下将其打包。试试

  • 我有一些可怕的比目鱼。我有以下Maven配置: 这创建了包含所有类的JAR fie,但我在类路径中有一些资源也应该包括在内。如果我将参数留在phase前面,那么我的所有资源都包括在内了。如果我使用运行maven,则不包含任何资源。我的资源在(不是通常的目录)下。

  • 我正在尝试使用Eclipse(版本Kepler SR2)将一个Java项目打包到一个可运行的jar中。这个项目使用的是Maven(这是我学习的,我对它不太了解)。问题是,该项目在Eclipse中运行良好,但在导出到Jar后,它再也找不到所需的任何资源。 下面是文件夹结构: 资源是通过以下方式加载的: 当从Eclipse执行程序时,这一行工作得非常好,但当使用我用“export>java>runna

  • 在使用Maven捆绑JAR文件中的资源时,我有一种感觉,我错过了一些关键的东西。我的目录结构是标准的Maven结构(即\src\main\java,\src\main\Resources)。 使用IDE时,我将资源文件引用为\main\resources\images\blah。。。它工作得很好,但当Maven捆绑JAR文件时,它会将路径放在相对于根的位置(“\ images\blah”),因此没

  • 我正在使用maven插件创建一个JAR。但是文件夹中的所有文件都直接放在JAR中,而不是resources文件夹中。(根本没有在JAR中创建resources文件夹) 因此,使用JAR的应用程序无法找到log4j2。xml文件。早期的resources文件夹正在创建中,但现在不知何故它没有被创建。 波姆。xml: 项目结构: 罐子结构: 在应用控制台我得到消息: 错误状态记录器Log4j2找不到日