Java 从jar中获取另一个包中的资源

Java 从jar中获取另一个包中的资源,java,netbeans,jar,nullpointerexception,Java,Netbeans,Jar,Nullpointerexception,好的,我知道这个问题被问了很多,但是我找到的所有解决方案都不起作用。我目前正在用netbeans制作一个使用自定义字体的应用程序。该程序在netbeans中运行良好,没有错误。但是,当Netbeans清理并构建jar时,我会使用以下命令行运行它: java -jar MyProject.jar 程序在以下行返回nullPointerException: try { font = Font.createFont(Font.TRUETYPE_FONT, getClass().get

好的,我知道这个问题被问了很多,但是我找到的所有解决方案都不起作用。我目前正在用netbeans制作一个使用自定义字体的应用程序。该程序在netbeans中运行良好,没有错误。但是,当Netbeans清理并构建jar时,我会使用以下命令行运行它:

java -jar MyProject.jar
程序在以下行返回nullPointerException:

try {
        font = Font.createFont(Font.TRUETYPE_FONT, getClass().getResource("/fonts/Raleway-ExtraLight.TTF").openStream()); //<--this line
    } catch (FontFormatException | IOException | NullPointerException e) {
        System.out.println("Error creating font: "+e);
        System.exit(1);
    }
但它们似乎不起作用。我以前从未使用过流,我觉得如果必须使用流,我可能必须重新编码程序的一大部分(我也加载了很多图像,我不知道它们是否有效)。我把我所有的代码都放在一个软件包中,旁边的字体和图像也放在自己的软件包中。欢迎所有答案。我才真正开始编程,非常感谢您的帮助。提前谢谢


(编辑)只是想说我做了更多的调试,发现字体的位置为空。

好的,我想我已经解决了。默认情况下,如果未设置类路径,则默认情况下,类路径设置为从中运行命令的文件夹。这意味着我的程序在包含我的jar的文件夹中查找字体,这是错误的位置,因为字体在jar中。您可以使用-cp从命令行设置类路径,然后使用冒号(;)分隔所有文件夹和文件(包括外部JAR)。这个问题与我的代码完全无关。

这个字体是在jar文件中,还是仅仅在文件系统中?(换句话说,您是打算部署它,还是预期它已经在您的目标系统上?)字体在jar文件中,在一个名为fonts的文件夹中。这是一个猜测,但看起来是绝对路径(“/fonts/Raleway ExtraLight.TTF”而不是“fonts/Raleway ExtraLight.TTF”)导致getResource失败。
getClass().getClassLoader().getResource();