我可以在IDE(IntelliJ)中正确运行java程序;但是,当我尝试从命令行运行相同的程序时,它失败了。抛出的错误是:
RuntimeUnmarshallException: org.xml.sax.SAXParseException; schema_reference.4: Failed to read schema document 'file:/home/Experiments/file:/home/path/to/jar/my.jar!/configuration.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
堆栈跟踪指出问题出在此处:
String SCHEMA_FILE_PATH = "configuration.xsd";
ClassLoader classLoader = getClass().getClassLoader();
URL resource = classLoader.getResource(SCHEMA_FILE_PATH); // <- breaks here
return new File(resource.getFile());
我的架构文件无法存储在我的IDE中标记为资源根目录的目录中。我打赌,当我从命令行运行时,因为我从不同的工作目录运行它不知道在哪里看。我已经尝试在命令行上设置类路径,以便能够查看包含架构的目录,但这没有帮助。我想我可以将工作目录设置为从我的IDE运行时的工作目录,但这似乎是一个可怕的设计选择。
感谢您的帮助。
编辑:我刚刚确认配置文件包含在jar中,但无论出于什么原因,它似乎都在奇怪的地方寻找它......答案 0 :(得分:1)
运行.jar
时,其内容未解包,但直接从.jar
读取。因此,您加载的资源不能表示为File
(它仍然嵌套在.jar
内)。您可以在错误消息中看到 - 感叹号后面的部分是jar
内资源的路径。
我建议改用Classloader.getResourceAsStream(..)
。它透明地处理加载。
请注意,您可以使用new StreamSource(InputStream)
从流中构建对架构文档的引用。