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

Java getClass().getClassLoader().getResource(path)在Maven shaded.jar中失败

韦高阳
2023-03-14

当直接使用Java运行我的项目时,我可以确认某个特定的方法能够通过getClass().getClassLoader().getResource(path)获取资源,其中path为docs/info.md,并且在src/main/resources/docs/info.md中存在一个文件

在项目与Maven一起打包到最终的可执行文件。jar中之后,我可以确认路径docs/info.md已经通过jar tf myproject.jar包含

但是,当执行该。jar时,相同的getClass().getClassLoader().getResource(path)返回null。

以下是MyProject.pom:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>

  <!-- io.outright.myproject [parent] -->
  <parent>
    <groupId>io.outright</groupId>
    <artifactId>myproject</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <!-- io.outright.myproject -->
  <groupId>io.outright.myproject</groupId>
  <artifactId>hub</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>hub</name>

  <!-- props -->
  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <!-- deps -->
  <dependencies>

     <!-- ....removed for readability.... -->

  </dependencies>

  <!-- build -->

  <build>

    <resources>
      <resource>
        <directory>${basedir}/src/main/resources</directory>
        <includes>
          <include>**/*</include>
        </includes>
      </resource>
    </resources>

    <plugins>

      <!-- Integration tests -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.19</version>
        <executions>
          <execution>
            <id>integration-test</id>
            <phase>integration-test</phase>
            <goals>
              <goal>integration-test</goal>
            </goals>
          </execution>
          <execution>
            <id>verify</id>
            <phase>verify</phase>
            <goals>
              <goal>verify</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.5.1</version>
        <inherited>true</inherited>
        <configuration>
          <source>${maven.compiler.source}</source>
          <target>${maven.compiler.target}</target>
        </configuration>
      </plugin>

      <plugin>
        <!-- Build an executable JAR -->
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <!--<classpathPrefix>lib/</classpathPrefix>-->
              <mainClass>io.outright.myproject.Main</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.4.3</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <artifactSet>
                <excludes>
                  <exclude>junit:junit</exclude>
                  <!--<exclude>log4j:log4j:jar:</exclude>-->
                </excludes>
              </artifactSet>
            </configuration>
          </execution>
        </executions>
      </plugin>

    </plugins>
  </build>

</project>

共有1个答案

施子民
2023-03-14

使用GetResourceAcstream而不是GetResourceGetResource返回文件的URL,而不是文件本身。然后将inputstream写入文件,并使用该文件。

ClassLoader classLoader = getClass().getClassLoader();
if (classLoader.getResourceAsStream(filePath) == null) {
    // throw error
}
InputStream inputStream = classLoader.getResourceAsStream(filePath);
// write input stream to a file

我也面临同样的问题。这可能会有所帮助:在自己的Mojo中获取maven插件的目录路径

 类似资料:
  • 问题内容: 我在Eclipse Helios中创建了一个带有单个子模块的最小Maven项目。 在文件夹中,我放置了一个文件 java中,我创建了一个包含单个类的包,该类执行以下操作: 但是当我将代码作为junit 4单元测试运行时,我只是得到了NullPointerException。以前,这已经工作了一百万次了。有任何想法吗? 我遵循了此指南: 但仍然出现相同的错误。 问题答案: 使用时 get

  • 问题内容: 我有这个测试应用程序: 当我从Eclipse运行它时,出现错误: 类路径(来自.CLASSPATH文件) 在我的c:\ project \ src文件夹中,我只有Test.java文件和包含pacman.png的’assets’目录。 我在做什么错以及如何解决? 问题答案: 我会这样: “ /assets/pacman.png”是绝对位置,而“ assets / pacman.png”

  • 我的问题是关于以下代码示例: 我查看了Java-API,发现ImageIO类中有3种不同的read()方法: 1.: read(文件输入) 2.:读取(ImageInputStream) 3.:读取(输入流输入) 4.: read(URL输入) 我的问题是:在这个例子中使用了这四种方法中的哪一种?我有点困惑,因为在这个例子中 “getClass()”在这里返回“BufferedImageLoade

  • 我正在尝试加载我的 *.fxml 文件,这些文件位于不同的包中,打包在 JAR 中。 我的文件夹结构:(所有文件夹都在类路径中) 正如这里提到的,我使用以下语句来加载FXML文件。(没有前导斜杠“/”)该方法在文件中调用。 如果我在eclipse中运行这个项目,这工作得很好,但是如果我执行JAR(它是用Gradle创建的),就会出现< code > Java . lang . illegalsta

  • 我正在尝试将我从eclipse制作的pacman游戏导出到。罐子包装。问题是,尽管eclipse上的一切都运行良好,但当。jar已导出,我使用的资源无法正确加载。我将它们放在一个单独的/res文件夹中,该文件夹位于构建路径上。我通过以下方式访问它们: 我做错了什么?这里是我得到的错误的一个例子(只有在eclipse上导出的. jar中运行良好)

  • 这是我的模块信息: 这是我的父gradle构建文件: 这是我的客户端模块构建文件: 我正在尝试获取FXMLLoader的资源,但我根本无法让它工作。我已经挣扎了两个小时,现在我真的很绝望。我尝试了所有可能的文件名组合,每个可能的位置,但仍然返回null。 我还尝试了,但它也不工作。 有人能帮我吗?我将非常感激。

  • 问题内容: 这个问题在很多地方都被问到,变化不尽。例如Java-getClassLoader()。getResource()不仅使我烦恼不已。)我仍然无法使其正常工作。 这是一个代码片段: 此作品-请注意,我硬编码的路径,包含剪辑文件,该文件的目录 是 有,而且 是 在同一目录作为我的.class文件。las,注释掉的代码仅返回url的空值。 其他大多数帖子似乎都涉及getResourceAsSt