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

问题描述:

我能够在IDE(IntelliJ)中正确运行Java程序;但是,当我尝试从命令行运行相同的程序时,它会失败。抛出的错误是:从命令行运行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运行时的工作目录,但这看起来像是一个可怕的设计选择。

感谢您的任何帮助。

编辑:我刚刚确认了configuration.xsd文件包含在罐子里,但不管是什么原因,似乎在奇怪的地方寻找它...

+1

你是否运行打包的'.jar'? – Pyranja

+0

是的。我使用以下命令运行它:'java -jar path/to/the.jar - 输入东西' – mjnichol

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

我会推荐使用Classloader.getResourceAsStream(..)来代替。它透明地处理加载。

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

Here是关于资源加载的一些官方信息,并且this问题可能是感兴趣的。

+0

这工作。感谢您的帮助! – mjnichol