【问题标题】:getResource() return null in Eclipse not in JAR filegetResource() 在 Eclipse 中返回 null 而不是在 JAR 文件中
【发布时间】:2019-08-26 14:11:42
【问题描述】:

我在 Spring Boot 中开发应用程序。我在 src/main/java 中有两个包 1。 com.project.test2。 wsdl。在第一个包中,我有 spring boot 主类。在第二个包里面我有 test.wsdl 文件。我尝试使用以下代码在主类中加载 test.wsdl 文件

URL wsdl = MainClass.class.getClassLoader().getResource(/wsdl/test.wsdl); system.out.println("wsdl: "+wsdl);

它在 Eclipse 中运行时返回 null。将应用程序构建为 jar 并使用 java -jar app.jar 运行应用程序时。它返回正确的路径。为什么它在 Eclipse 中返回 null。但是当我在下面运行没有前缀'/'的代码时,如下所示。它在 Eclipse 和 JAR 中都能正常工作

URL wsdl = MainClass.class.getClassLoader().getResource(wsdl/test.wsdl); system.out.println("wsdl: "+wsdl);

但我的要求是使用路径 /wsdl/test.wsdl

加载资源

【问题讨论】:

  • 你真的需要使用类加载器来读取文件还是可以使用@Resource注解?静态资源文件也必须驻留在 src\main\resources
  • 否,该项目已由其他开发人员开发。我无法改变流量。你能告诉我为什么 Eclipse 返回 null

标签: java eclipse spring-boot


【解决方案1】:

引用相关的 Java 文档(重点是我的):

资源名称

类使用的资源名称的常见约定是使用类的包的完全限定名称,但将所有句点 (.) 转换为斜线 (/),并添加一个name.extension 形式的资源名称。为了支持这一点,并简化系统类(getClassLoader 返回null)的细节处理,Class 类提供了两个方便的方法来调用ClassLoader 中的适当方法。

赋予类方法的资源名称可能有一个初始的“/”,将其标识为“绝对”名称。不以“/”开头的资源名称是“相对的”。

绝对名称从它们的起始“/”中删除,并在没有任何进一步修改的情况下传递给适当的 ClassLoader 方法以定位资源。相对名称根据前面描述的约定进行修改,然后传递给 ClassLoader 方法。

链接:Accessing Resources

【讨论】:

  • 是的,我明白了。但是在 JAR 中它为什么起作用?它返回正确的路径..为什么不以“/”开头时将其视为绝对路径。?
  • @Jai,确实如此,这些总是绝对的,它只是将 jar 的根目录视为某种根文件夹。
  • @Jai,澄清一下,我实际上并没有检查为什么它在 Eclipse 中不起作用(可能是因为没有 JAR,但这听起来像是类路径定义或实现中的错误)。然而,由于在类路径中大多数 JAR 由它们自己的 Loader 实例表示,并且创建了一个名为 ZipFS 的东西,因此每个 JAR 确实应该是一个根文件夹。
  • 那么,有没有办法修复类路径定义?
  • @Jai,取决于它是什么。如果你真的需要它,你应该调查它,如果修复不清楚,可能会问另一个问题。
【解决方案2】:

您需要将wsdl/test.wsdl 移动到src/main/resources 中才能加载资源。

当你打包 app.jar 时,wsdl/test.wsdl 进入 jar 文件内的根路径,所以 .getClassLoader().getResource("wsdl/test.wsdl") 可以正常工作。

【讨论】:

  • 但我的要求是在 src/main/java 中使用它。但是为什么它在带有 /wsdl/test.wsdl 的 JAR 中工作正常
  • 使用 7zip 或其他应用程序打开您的 jar 文件并找到 /wsdl/test.wsdl 的位置。在目标/类中执行相同的操作(Eclipse 在执行您的应用程序之前部署的位置)。你会发现不同之处。这是因为资源位置。顺便说一句,在 src/main/java 中存储 /wsdl/test.wsdl 是没有意义的,因为它只用于 java 代码
  • 是的。 Eclipse 中是否有任何配置更改以使其工作。?
  • 如果你使用 MAVEN 项目,你可以使用一些插件,比如this
猜你喜欢
  • 2019-05-13
  • 2012-07-10
  • 2016-06-22
  • 2013-07-15
  • 2010-10-12
  • 2018-10-14
  • 2017-08-01
  • 1970-01-01
  • 2014-07-14
相关资源
最近更新 更多