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

课堂上奇怪的行为。getResource()和类加载器。可执行jar中的getResource()

令狐献
2023-03-14

我从课堂上了解到他们之间的区别。getResource()和类加载器。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。

自类。getResource()委托给类加载器。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();
   }
}

共有1个答案

华振
2023-03-14

我以为这个问题已经被问到和回答了!

  • 这两门课的区别是什么。getResource()和类加载器。getResource()

getClass()。getResource()相对于搜索对象进行搜索。在getClass()时初始化文件。getClassLoader()。getResource()相对于类路径根进行搜索。

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

1) 在中显示目录组织。罐子,还有。。。

2) 考虑一揽子计划

问:什么(如果有的话)还没有被课堂之间的区别所回答。getResource()和类加载器。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/12:

嗨-

我从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

如果这不是你得到的输出。。。我很困惑。

不管怎样,我在跑:

>

  • Eclipse Indigo(应该没关系)

    在IDE内部运行(无论它是文件系统还是.jar,在IDE内部还是外部,都不重要)

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

    很抱歉,我们无法解决我认为简单的问题:(

    增编11/21/12(安德烈亚斯):

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

    • 根据我们的共同理解,上述问题的答案是:“不,不可能Class.getResource(“/path/image.png”)返回有效的URL,而ClassLoader.getResource(“path/image.png”)返回空值”:

  •  类似资料:
    • 问题内容: 我从Class.getResource()和ClassLoader.getResource()之间有什么区别? 从自己的代码 等同于 无法读取jar文件中的图像的帖子显示了使用 在可执行jar文件中返回null,而 返回正确的URL。 删除前导斜杠后的代表,我希望这些调用是相同的,但显然在这种情况下它们是不同的。即使将特殊的类加载器附加到特定的类上,对于每次调用,它也应该是相同的,再次

    • 我的目标是使用Apache CLI和可执行jar文件读取文本文件,执行字符串操作,然后写入CSV。您可以在终端中执行该工具,如下所示: 我已经为这个功能编写了测试,这些测试正在通过。测试输入文本文件位于中。以下测试正在通过: 我们使用编译带有依赖项的jar文件,然后引发以下FileNotFoundException: 这使我认为查找文件的位置存在问题。我知道有人问过的相关问题。相关问题如下: 可执

    • 我在登录测试方法中面临奇怪的执行行为。我在selenium网格下运行这段代码。网格配置为独立服务器。因此,首先,我使用批处理文件启动selenium网格(Hub\Node)以通过测试执行。 代码:1. pojDataSource.java: clsConstant。java: 模块测试。java: 当我在Eclipse IDE中以调试模式执行代码时,它向我显示了奇怪的行为。首先,它启动浏览器并打开

    • 你好,我有一个奇怪的问题。我正在用eclipse打包一个应用程序,以生成一个可执行的jar文件,当我运行它时,会出现错误“error cant find main class[…]”。 当我从命令行示例运行同一个包时 java-jarapp.jar 程序启动。 奇怪的是,只有在Java 7环境中编译的应用程序才会出现错误。 如果我将项目设置为java 6,一切都正常。 我应该做什么来运行Java

    • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

    • 我在http://www.nodebeginner.org上读了一篇教程,我在数据输出中有一个奇怪的行为。我知道,Stackoverflow也有类似的问题,但没有答案。所以我有这个Web-Server的代码: 调用RequestHandler.Upload的Router.js代码-我的buggy函数 和RequestHandler.Upload的代码 假设POST数据中有一个字符串。该函数的第一行