我从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。
SinceClass.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();
}
}
我以为这个问题已经被问到并回答了!
getClass().getResource()
相对于.class文件进行getClass().getClassLoader().getResource()
搜索,而相对于classpath根目录进行
搜索。
如果这里有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/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内部运行(在IDE内部还是外部都无关紧要是文件系统还是.jar)
我的JRE是1.6(如果有的话,这可能是个大问题)
抱歉,我们无法解决我 认为 很简单的问题:(
附录11/21/12(安德烈亚斯):
由于没有关于此问题的近期活动,所以我想总结一下我们发现的结果:
Class.getResource("/path/image.png")
返回有效的URL,而ClassLoader.getResource("path/image.png")
返回null”:
我从课堂上了解到他们之间的区别。getResource()和类加载器。getResource()?从自己的代码来看 与相同 发布无法读取jar文件中的图像显示使用 在可执行文件中,jar文件返回null,而 返回正确的URL。 委托给删除前导斜杠后,我希望这些调用是相同的,但显然在本例中不是这样。即使将特殊类装入器附加到特定类,每次调用的装入器也应相同,这同样会导致相同的行为。 因此,问题是:是否
我在登录测试方法中面临奇怪的执行行为。我在selenium网格下运行这段代码。网格配置为独立服务器。因此,首先,我使用批处理文件启动selenium网格(Hub\Node)以通过测试执行。 代码:1. pojDataSource.java: clsConstant。java: 模块测试。java: 当我在Eclipse IDE中以调试模式执行代码时,它向我显示了奇怪的行为。首先,它启动浏览器并打开
问题内容: 我想知道和之间有什么区别? 编辑:我特别想知道是否在文件/目录级别涉及任何缓存。如“目录列表是否在Class版本中缓存?” AFAIK以下基本上应该做同样的事情,但事实并非如此: 我在摆弄一些报告生成代码时发现了这一点,这些代码可以WEB-INF/classes/从该目录中的现有文件中创建一个新文件。使用Class中的方法时,可以使用找到部署getClass().getResource
你好,我有一个奇怪的问题。我正在用eclipse打包一个应用程序,以生成一个可执行的jar文件,当我运行它时,会出现错误“error cant find main class[…]”。 当我从命令行示例运行同一个包时 java-jarapp.jar 程序启动。 奇怪的是,只有在Java 7环境中编译的应用程序才会出现错误。 如果我将项目设置为java 6,一切都正常。 我应该做什么来运行Java
我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方
我创建了一个JTree,即使有多个根节点(这对我来说相当困难,因为这是我的第一个JTree),并且准备好了(我想)再往前走一步;一个细胞渲染器。 我试着为每个节点设置一个图标,它工作得很好。现在我正在尝试检查它是什么样的节点(不仅仅是叶子和分支),并构建我想要的图像的文件名的字符串。现在始终返回true,因此它应该是klas_fold.png或klas_unfold.png。但是只执行了一部分,因