可执行 jar 中 Class.getResource() 和 ClassLoader.getResource() 的奇怪行为

2023-12-06

我的理解是从Class.getResource() 和 ClassLoader.getResource() 有什么区别?从自己的代码来看,

getClass().getResource("/path/image.png")

getClass().getClassLoader().getResource("path/image.png")

发帖无法读取 jar 文件中的图像显示了使用时出现的问题

getClass().getClassLoader().getResource("path/image.png")

在可执行 jar 文件中返回 null,而

getClass().getResource("/path/image.png")

返回正确的 URL。

Since Class.getResource()代表ClassLoader.getResource()删除前导斜杠后,我希望这些调用是相同的,但显然在这种情况下它们不是。即使将特殊的类加载器附加到特定的类,每次调用它仍然应该是相同的,再次导致相同的行为。

所以,问题是:是否存在任何明显的情况会导致以下情况 代码对于第一次调用返回 null,但对于第二次调用返回正确的 URL?

package com.example;

import java.net.URL;

public class ResourceTest {

   public void run() {
      URL iconUrl1 = getClass().getClassLoader().getResource("path/image.png");
      System.out.println("ClassLoader.getResource(\"path/image.png\"): " + iconUrl1);

      URL iconUrl2 = getClass().getResource("/path/image.png");
      System.out.println("Class.getResource(\"/path/image.png\"): " + iconUrl2);
   }

   public static void main(String[] args) {
      ResourceTest app = new ResourceTest();
      app.run();
   }
}

我以为这个问题已经被问过并回答了!

  • Class.getResource() 和有什么区别 ClassLoader.getResource()?

getClass().getResource()相对于 .class 文件进行搜索getClass().getClassLoader().getResource()相对于的搜索 类路径根。

如果这里有 SSCCE,我不明白为什么没有

1) 显示 .jar 中的目录组织,并且...

2) 考虑封装

问:什么(如果有的话)尚未得到答复Class.getResource() 和 ClassLoader.getResource() 有什么区别?(及其引用的链接)?

=================================================== =======================

我仍然不确定有什么不清楚,但这个例子可能会有所帮助:

/*
  SAMPLE OUTPUT:
  ClassLoader.getResource(/subdir/readme.txt): NULL
  Class.getResource(/subdir/readme.txt): SUCCESS

  ClassLoader.getResource(subdir/readme.txt): SUCCESS
  Class.getResource(subdir/readme.txt): NULL
 */
package com.so.resourcetest;

import java.net.URL;

public class ResourceTest {

    public static void main(String[] args) {
        ResourceTest app = new ResourceTest ();
    }

    public ResourceTest () {
        doClassLoaderGetResource ("/subdir/readme.txt");
        doClassGetResource ("/subdir/readme.txt");
        doClassLoaderGetResource ("subdir/readme.txt");
        doClassGetResource ("subdir/readme.txt");
    }

    private void doClassLoaderGetResource (String sPath) {
        URL url  = getClass().getClassLoader().getResource(sPath);
        if (url == null)
            System.out.println("ClassLoader.getResource(" + sPath + "): NULL");
        else
            System.out.println("ClassLoader.getResource(" + sPath + "): SUCCESS");
    }

    private void doClassGetResource (String sPath) {
        URL url  = getClass().getResource(sPath);
        if (url == null)
            System.out.println("Class.getResource(" + sPath + "): NULL");
        else
            System.out.println("Class.getResource(" + sPath + "): SUCCESS");
    }
}

这是相应的目录树。它恰好是一个 Eclipse 项目,但无论是 Eclipse、Netbeans ...还是 .jar 文件,目录都是相同的:

C:.
├───.settings
├───bin
│   ├───com
│   │   └───so
│   │       └───resourcetest
│   └───subdir
└───src
    ├───com
    │   └───so
    │       └───resourcetest
    └───subdir

正在打开的文件是“subdir/readme.txt”


附录 11/9/2012:

Hi -

我从github上逐字复制了你的代码,重新编译并重新运行:

ClassLoader.getResource(/subdir/readme.txt): NULL
Class.getResource(/subdir/readme.txt): SUCCESS
ClassLoader.getResource(subdir/readme.txt): SUCCESS
Class.getResource(subdir/readme.txt): NULL

如果那是not你得到的输出......我很困惑。

不管它的价值如何,我正在跑步:

  • Eclipse Indigo(没关系)

  • 在 IDE 内部运行(无论是文件系统还是 .jar,在 IDE 内部还是外部)

  • 我的 JRE 是 1.6(如果有的话,这可能是最重要的)

抱歉,我们无法解决我的问题thought这是一个简单的问题:(


2012 年 11 月 21 日附录(Andreas):

由于最近没有关于这个问题的活动,我想总结一下我们的发现:

  • From our common understanding, the answer to the above question is: "No, it is not possible that Class.getResource("/path/image.png") returns a valid URL, while ClassLoader.getResource("path/image.png") returns null":
    • 我们完全清楚 ClassLoader.getResource() 和 Class.getResource() 之间的区别
    • 我们的示例输出匹配“SUCCESS”和“null”
    • 示例输出符合我们的预期
    • 结论:要么是我们监督了某些事情,要么是某些不同的事情导致了链接问题中描述的“解决方案”起作用。我认为我们目前无法证明其中之一。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可执行 jar 中 Class.getResource() 和 ClassLoader.getResource() 的奇怪行为 的相关文章

  • Java中遍历所有文件

    我想让我的程序打印我计算机上所有文件的巨大列表 我的问题是 当我希望它打印位于我的计算机上的所有文件时 它仅打印第一个硬盘驱动器的第一个文件夹中的文件 有什么想法我在这里做错了什么吗 谢谢 这是我使用的代码 Main import java
  • 深入理解Java中的Volatile

    Java是否允许输出1 0 我已经对其进行了非常深入的测试 但无法获得该输出 我只得到1 1 or 0 0 or 0 1 public class Main private int x private volatile int g Exec
  • Android Proguard Javascript 接口失败

    我在我的项目中使用了一段代码 如此处所述 http lexandera com 2009 01 extracting html from a webview http lexandera com 2009 01 extracting htm
  • FOP apache - 支持希伯来字母

    过去几天我一直在调查 FOP apache 中对希伯来字母的支持 用于生成 PDF 文件的项目 我看到以前有一个问题 我不太明白是否解决了 如果有支持 有人可以向我展示 重定向到简单的示例 为我提供带有希伯来字母的 XSL FO 文件 当使
  • n 个素数之和 java,困惑

    我读过几篇关于这方面的文章 我什至在一次考试中这样做过 但是是在 vb net 中 它工作得很好 但是当我尝试执行我的程序时 Eclipse 只是不停地运行 否则它会给我错误的答案 这是我的第四次尝试 我需要将前 n 个素数相加 因此我检查
  • spring依赖注入会创建单例对象吗?

    spring内部是如何管理这些对象的呢 单例对象什么时候创建和销毁 默认情况下 Spring bean 基本上是单例的 Spring 将为每个类创建一个实例 并且通常会在 Spring 初始化时执行此操作 然而 这几乎是无限可定制的 Spr
  • wsimport Xauthfile 错误

    我正在尝试为我们公司网络外部的受 SSL 保护的 Web 服务 在 Microsoft Biztalk 上 生成客户端 也称为消费者 所需的 java 帮助类 我们只能通过代理访问它 并且无法更改 Web 服务本身的任何内容 这是我提供给
  • 如何在 Spring Data MongoDB 中仅返回查询的特定字段?

    我们如何在 Spring Data Mongo 中选择特定字段 我尝试了以下操作 但我得到了强制转换异常Foo to String Using Query Query value path 0 fields path 0 String fi
  • Amazon SQS 旧配置文件格式警告

    我正在将消息发布到 Amazon SQS 队列 启动时 我在日志中收到以下警告 http nio 9090 exec 2 BasicProfileConfigLoader The legacy profile format requires
  • Java 1.6 和 Desktop.open() 的问题

    我一直在使用 Destop open 在 Windows 计算机 Vista 和 XP 上启动 pdf 查看器 并且大多数都工作得很好 但是 在一台 XP 计算机上 该调用不起作用 只是返回而不抛出任何异常 并且查看器不会启动 据我所知 在
  • jSoup 检查跨度类是否存在

    我有一个具有以下格式的 HTML
  • Spring 在使用 JUnit 的单元测试中不自动装配

    我使用 JUnit 测试以下 DAO Repository public class MyDao Autowired private SessionFactory sessionFactory Other stuff here 正如您所看到
  • 请求的操作:声明您的广告 ID 权限

    今天我收到这封电子邮件 去年 7 月 我们宣布了广告政策变更 以帮助加强 安全和隐私 我们对使用的标识符添加了新的限制 针对儿童的应用程序 当用户选择删除他们的 广告 ID 以选择退出个性化广告 如果满足以下条件 开发人员将收到一串零而不是
  • 升级到 Gradle 2.0 后:在根项目上找不到属性“Compile”

    为了避免在构建 Java 源代码时出现有关特殊字符的警告 我将此行放在我的gradle build在升级到 Gradle 2 0 之前运行良好 tasks withType Compile options encoding UTF 8 升级
  • 在 DAO 中反映继承关系最有效的方法是什么?

    使用 MVC 结构和业务对象 http en wikipedia org wiki Business object DAO http en wikipedia org wiki Data access object建筑学 对于任何正常的业务
  • Web 服务器上的身份验证和授权 ?

    我正在构建一个 Android 应用程序 它与 apache tomcat 上的 Web 服务器进行通信 Web 服务器采用 JAVA EE 构建 目前 为了进行身份验证和授权 我使用用户名 密码 为了管理会话 我使用令牌 因此 当用户登录
  • 使用 Maven 时如何在 Tomcat 7.0 中将上下文路径设置为根(“/”)

    我有一个maven项目 pom xml包含tomcat插件
  • org.openqa.selenium.remote.service.DriverService$Builder.createArgs()Lcom/google/common/collect/ImmutableList;使用 Selenium 3.5.3

    我正在使用 IntelliJ 编写 Selenium Junit 测试 如果我直接从测试触发 测试运行正常 但是 如果我使用 JunitCore 触发 TestRunnerSuite 的测试 我遇到了以下奇怪的错误 在谷歌研究后我没有找到解
  • Log4j 不打印完整的堆栈跟踪

    我检查了 SO 中的所有答案 但没有一个真正帮助我 我的 Log4j 属性文件 log4j rootLogger debug console file log4j appender console org apache log4j Cons
  • 使用 Appengine 进行多线程处理

    既然Appengine不允许java多线程 那么我们如何将现有的多线程代码迁移到该平台呢 例如我有以下代码 Thread t new Thread public boolean alive true public void run whil

随机推荐

  • 从 Visual Studio 2015 中完全删除 ApplicationInsights

    我环顾四周 并没有找到一个好的答案 所以我发布这个问题 希望它可以成为其他希望完全删除 Application Insights 的人的一种 参考 我尝试的第一个显而易见的事情是从 工具和扩展 中卸载该工具 但不幸的是 这让事情变得更糟 现
  • 按价格列对表格进行排序

    这是账单清单 Service Price S1 13 CHF S2 Free S3 Free S4 40 CHF 我想使用 jQuery 或纯 JavaScript 按价格对其进行排序 不是服务器端 I tried jQuery 表排序器
  • 从浏览器中检测 USB 设备是否已插入 Javascript

    是否有基于 Javascript 的机制 我可以通过浏览器检测用户是否插入了特定的 USB 设备 出于安全原因 Web 浏览器中的 JavaScript 仅提供受限制的访问计算机资源 这是不可能将文件存储在任意文件夹中 启动应用程序或与US
  • mod_rewrite php mysql

    我对 mod rewrite 非常陌生 我一直在试图解决这个问题 但真的很困难 p 这是我的问题 我有一个页面http example com user s 81 s 81 正在从数据库中的用户 ID 读取 我想要的是一个链接 http e
  • Request.QueryString 为空时出错

    有时用户会错误地重定向到 Process ViewImages PAGEID 发生这种情况时 他们会收到以下错误 Microsoft VBScript 运行时错误 800a000d 类型不匹配 字符串 FLPM cp images cs a
  • C malloc 只为 int * 分配了 8 个字节 [重复]

    这个问题在这里已经有答案了 我正在尝试创建一个指向6元素int在函数中稍后返回它 因此为此目的我使用malloc 但它的表现似乎并不符合我的预期 这是代码 int j 0 for j lt 5 j int intBig malloc j s
  • C 编译器错误 - 初始值设定项不是常量

    我有一个用于创建新的函数GQueue GQueue newGQueue int n ele int ele size GQueue q GQueue malloc sizeof GQueue if q return NULL q gt pt
  • 直接从指针转换为模板函数?

    我试图获取指向函数模板实例的指针并将其转换为 void include
  • DataGrid 显示图像的路径而不是图像本身

    以下几行最终显示路径而不是它通向的图像 AutoGenerateColums 设置为 true 将其设置为 false 最终会出现完全空的行 System Data DataTable DataTable new System Data D
  • 如何在 React Native 上向 BottomTabNavigator 添加按钮?

    我的目标是同时拥有顶部和底部导航栏Home Dashboard and Album 但不适合SignIn 问题是 我希望将按钮放在底部而不是顶部 最后剩下的难题是如何添加Sign In按钮到底部导航栏 障碍是如果你写
  • 如何在一个窗口上绘制多个 FacetGrid?

    在下面的代码中 我可以通过传递在一个窗口中放置两个简单的seaborn图ax ax i 每个论据都不起作用FacetGrid 类似问题已被问过here 想知道是否有人知道如何做到这一点 谢谢 import pandas as pd impo
  • 不使用 MPMoviePlayer 在 iPhone 上制作动画图像(如电影)的方法

    我需要能够在静态图像上显示动画 鉴于 MPMoviePlayer 无法让您控制任何有用的东西 我认为做到这一点的唯一方法是使用多个静态图像 我们 逐一 显示这些图像以创建 类似电影 的动画 我知道我们可以使用 UIImageView 来做到
  • 仅纵向模式 - iOS

    我有一个应用程序 专为纵向设计 但是我不知道如何限制只使用纵向模式 一旦用户颠倒或横向模式 我不希望我的屏幕方向相应地改变 有什么想法如何去做吗 可以通过重写此方法在应用程序摘要 以及 rootviewcontroller 无论是导航控制器
  • 单位有哪些类型? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有人知道有什么好的参考资料吗 谢谢 蒂姆 Null 参考类型的底部类型 无 所有类型的底部类型 单位 表示没有结果的类型
  • C 中链表何时使用 NULL,何时使用 '\0'?

    我在 C 中了解到 null char 0 NULL 我在下面编写了一个循环 从 C 中的 char 的开头到结尾进行读取 case 1 char buf 32 while buf i NULL do something 然而 我的 gcc
  • SSE向量化与内存对齐的关系

    为什么 SSE AVX 需要对齐内存 我经常得到的答案之一是对齐的内存加载比未对齐的内存加载快得多 那么 为什么这种对齐的内存加载比未对齐的内存加载快得多呢 这不仅仅是 SSE 甚至 x86 特有的 在大多数架构上 加载和存储需要自然对齐
  • Sql 二进制到 C# - 如何在 C# 中获取与二进制等效的 SQL 二进制

    对你们来说这可能是一个愚蠢的问题 我有一个带有一个二进制列的 SQL 表 它有一些二进制格式的数据 e g 0x9A8B9D9A002020202020202020202020 它的等效英文表示是 test 是否可以转换这个string转化
  • 为什么 Visual Studio 2010 中的架构比较显示差异,而实际上没有差异?

    我本来希望Visual Studio 2010能够对Schema Comparison功能带来一些改进 我怀疑有一些 但我无法让一些基本的工作发挥作用 我从 SQL Server 2005 数据库中获取了一个架构 然后为了确保一切正常 我进
  • 将 android-maps-utils 与 ADT 结合使用

    我正在尝试在 Android 项目中使用这个库 1 并全新安装 ADT 我只是不知道该怎么办 该库似乎使用了一些 VCS 和名为 gradle 的东西 看起来是一个构建工具 有人可以告诉我使用全新安装的 ADT 将该库集成到自己的 Andr
  • 可执行 jar 中 Class.getResource() 和 ClassLoader.getResource() 的奇怪行为

    我的理解是从Class getResource 和 ClassLoader getResource 有什么区别 从自己的代码来看 getClass getResource path image png 与 getClass getClass