Java XML文件在Netbeans IDE中正确加载,但不在包含它的JAR中加载

Java XML文件在Netbeans IDE中正确加载,但不在包含它的JAR中加载,java,xml,netbeans,jar,Java,Xml,Netbeans,Jar,我正在编写一个游戏,使用的TMX格式用于2D瓷砖映射(所说的格式是基于XML的)。当我在NetBeans IDE中构建和运行该程序时,它可以完美地工作。但是,JAR文件没有,抛出以下错误消息: [Fatal Error] :1:1: Content is not allowed in prolog. 当然,在程序继续运行并尝试引用卸载的映射之后,会出现许多NullPointerException jar xvf的使用验证了文件是否正确构建到jar中,并且没有引入额外的数据-未归档的副本与我的s

我正在编写一个游戏,使用的TMX格式用于2D瓷砖映射(所说的格式是基于XML的)。当我在NetBeans IDE中构建和运行该程序时,它可以完美地工作。但是,JAR文件没有,抛出以下错误消息:

[Fatal Error] :1:1: Content is not allowed in prolog.
当然,在程序继续运行并尝试引用卸载的映射之后,会出现许多NullPointerException

jar xvf的使用验证了文件是否正确构建到jar中,并且没有引入额外的数据-未归档的副本与我的src/assets文件夹中的副本完全相同

有关守则如下:;从GameScreenMain.java:

try {
    TMXMapReader mapReader = new TMXMapReader();
    map = mapReader.readMap(ClassLoader.getSystemClassLoader().getResourceAsStream("test_map.tmx"));
} catch (Exception e) {
}
从TMXMapReader.java:

public Map readMap(InputStream in) throws Exception {
    xmlPath = makeUrl(".");

    Map unmarshalledMap = unmarshal(in);

    //unmarshalledMap.setFilename(xmlFile)
    //
    return unmarshalledMap;
}

private Map unmarshal(InputStream in) throws Exception {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    Document doc;
    try {
        factory.setIgnoringComments(true);
        factory.setIgnoringElementContentWhitespace(true);
        factory.setExpandEntityReferences(false);
        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setEntityResolver(entityResolver);
        InputSource insrc = new InputSource(in);
        insrc.setSystemId(xmlPath);
        insrc.setEncoding("UTF-8");
        doc = builder.parse(insrc);
    } catch (SAXException e) {
        throw new Exception("Error while parsing map file: " +
                e.toString());
    }

    buildMap(doc);

    return map;
}
从test_map.tmx:

<?xml version="1.0" encoding="UTF-8"?>
<map version="1.0" orientation="orthogonal" width="18" height="10" tilewidth="64" tileheight="64">
    <tileset firstgid="1" name="Indev" tilewidth="64" tileheight="64">
        <image source="graphics/Indev.png" trans="ff00ff" width="128" height="64"/>
        <tile id="1">
            <properties>
                <property name="collision" value="solid"/>
            </properties>
        </tile>
    </tileset>
    <layer name="Tile Layer 1" width="18" height="10">
        <data encoding="base64" compression="zlib">   eJxjYmBgYKISZiQRU8scXGZhEyfHLEYseok1k5A5uPTgM4sYc/C5DZccPj8yYVGHzRxi0wm10hw6BgB7xwES</data>
    </layer>
</map>

EJXJYMBGYKISZIQRU8SCXGZHEYFHLeySOK5A5UPTGM4SYC/C5DZccPj8yYVGHzRxi0wm10hw6BgB7xwES

为什么完全相同的文件在IDE中工作,而不是在JAR中工作?

如果资源位于类路径中的
assets
文件夹中,则需要将其添加到资源标识符(即文件名和路径),例如
assets/test\u map.tmx


它可能在IDE中工作,因为当前工作目录与从JAR运行程序时不同。从JAR运行时,JAR中不可能有工作目录,因为它只是一个文件。从IDE运行时,JAR尚未构建,每个资源都作为文件存在于文件系统中,可以在
classes
文件夹中创建一个工作目录。因此,当从IDE或JAR运行并依赖于特定或隐式环境(如工作目录)时,可能会有不同的行为。

在构造
InputStream
时,我的赌注可能是一个错误的位置,但您不会显示该代码。InputStream是在第一个代码块中创建的,作为调用readMap()的一部分。(邋遢,我知道。)哦,对不起,我的眼睛老了,灰白了。为什么不使用
getResourceAsStream('/assets/test_map.tmx')
,假设构建过程保留了该文件夹。好的,我尝试了几种方法更改字符串。如果我在前斜杠前面加上“/test_-map.tmx”,IDE就会开始抛出相同的错误,但如果我使用“assets/test_-map.tmx”,则不会。项目类路径包含src/assets。我还没有自定义构建脚本。请先打印出正在加载的内容,然后再尝试对其进行分析,以验证在不同情况下没有加载不同的内容。