从命令行运行java程序时无法加载资源

时间:2015-10-20 05:31:28

标签: java url intellij-idea xsd resources

我可以在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中,但无论出于什么原因,它似乎都在奇怪的地方寻找它......

1 个答案:

答案 0 :(得分:1)

运行.jar时,其内容未解包,但直接从.jar读取。因此,您加载的资源不能表示为File(它仍然嵌套在.jar内)。您可以在错误消息中看到 - 感叹号后面的部分是jar内资源的路径。

我建议改用Classloader.getResourceAsStream(..)。它透明地处理加载。

请注意,您可以使用new StreamSource(InputStream)从流中构建对架构文档的引用。

Here是关于资源加载的一些官方信息,this问题可能会引起关注。