【问题标题】:Java Simple Project handling ResourcesJava 简单项目处理资源
【发布时间】:2013-08-14 09:06:46
【问题描述】:

我有一个简单的 java 项目,我有一个名为 Constants 的类 我将所有需要的路径存储在静态变量中,就像这样 例如:

public static final String PLAYFIELD_SMALL_IMAGE_PATH =  Constants.class.getClassLoader().getResource("Player_Small.png").getPath();

只要我留在我的 Eclipse 中就可以正常工作;)

但是当我将程序导出到 JAR 文件并启动它时,我得到一个异常:

java.lang.ExceptionInInitializerError

它在我第一次调用以下命令时出现:

Constants.PLAYFIELD_SMALL_IMAGE_PATH

如果我第二次开始我会收到此错误:

java.lang.NoClassDefFound: Could not initalize class Constants

我到底做错了什么?

编辑 1:

我在这里找到了这个:"NoClassDefFoundError: Could not initialize class" error

似乎是完全相同的问题。那我不应该使用静态变量吗?

编辑 2:

如果我使用静态初始化程序块,则会出现 ExceptionInInitializerError 被立即抛出。没有静态初始化程序块我能够 进入我的程序的第一个菜单。

编辑 3:

也许是另一个提示!当我提取我的 jar 时,所有图形都直接在根文件夹中,所以 我尝试使用这样的相对路径:

public static final String PLAYFIELD_SMALL_IMAGE_PATH = "Player_Small.png";

但如果我这样做了,我的图形就不会加载。

【问题讨论】:

  • 我觉得你用eclipse创建jar的方式有问题
  • 文件 -> 导出 -> 可运行的 JAR 文件 -> 选择 Main 和 Export-Path -> 完成
  • 你能检查 jar tf | grep Constants ... 查看jar中是否存在文件
  • 不能在 windows 上使用 grep 命令,但是当我提取我的 jar 时,常量类存在
  • @user2663778 grep 适用于几乎所有东西,包括 Windows。虽然我还是会使用 Cygwin。

标签: java jar noclassdeffounderror


【解决方案1】:

首先解压你的 jar 并检查是否所有的类都在那里。

你可以做很多事情来解决这个问题,首先我建议使用 maven 并了解这一点(对于初学者来说,请查看 Maven in 5 minutes),但如果你想继续使用最小的 java 项目,你可以尝试以下方法:

Thread.currentThread().getContextClassLoader().getResourceAsStream("File1.jpg");

应该有帮助

【讨论】:

  • 我实际上对 maven 非常熟悉,但我不会将它用于这么小的项目。并使用 Thread.currentThread()..... 导致相同的错误
  • 你检查过你的jar文件是否包含'Constants'类吗?
  • 是的,它包含 Constants.class
  • 那么您是如何尝试使用 'Thread.currentThread().getContextClassLoader().getResourceAsStream(Constants.File_name_blah_blah);' 的?你的文件在哪里?也许尝试对初学者使用绝对路径,看看是否有效?
  • 我使用了 Thread.currentThread().getContextClassLoader().getResource(Constants.FileName).getPath();我的文件位于 graphics/FileName 下,而 graphics 是我项目的资源文件夹
【解决方案2】:

你的问题正是:

public static final String PLAYFIELD_SMALL_IMAGE_PATH =  Constants.class.getClassLoader().getResource("Player_Small.png").getPath();

阅读这篇文章:NoClassDefFoundError。这篇文章解释了如何 解决您的问题。

我建议你把你所有的路径都从你的常量类中去掉 进入另一个类而不在那里使用静态变量。 并且可能使用 URL 而不是 String-Pathes,因为正如您所提到的 你使用图像。图像需要定位 URL,因为它们 不在硬盘上。如果您不使用 URL,您的图像可能无法打印。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 2012-05-03
    • 2010-11-26
    • 2022-12-07
    相关资源
    最近更新 更多