Java XML文件在Netbeans IDE中正确加载,但不在包含它的JAR中加载
我正在编写一个游戏,使用的TMX格式用于2D瓷砖映射(所说的格式是基于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
[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。我还没有自定义构建脚本。请先打印出正在加载的内容,然后再尝试对其进行分析,以验证在不同情况下没有加载不同的内容。