从命令行运行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文件包含在罐子里,但不管是什么原因,似乎在奇怪的地方寻找它...
答
当运行.jar
,其内容是没有解开,但直接从.jar
中读取。因此,您加载的资源不能表示为File
(它仍嵌套在.jar
内)。您可以在错误消息中看到 - 感叹号后面的部分是jar
中资源的路径。
我会推荐使用Classloader.getResourceAsStream(..)
来代替。它透明地处理加载。
请注意,您可以使用new StreamSource(InputStream)
从流中构建对模式文档的引用。
+0
这工作。感谢您的帮助! – mjnichol
你是否运行打包的'.jar'? – Pyranja
是的。我使用以下命令运行它:'java -jar path/to/the.jar - 输入东西' – mjnichol