我有一个JavaFX项目,它使用getClassLoader((.getResource加载FXML文件,例如:
Main.class.getClassLoader().getResource("fxml/App.fxml").
主代码运行良好,但当我使用Maven Surefire插件运行测试时,我会出现以下错误:
java.lang.IllegalStateException: Location is not set.
javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2459)
javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
经过进一步的调查,我发现当在执行测试时调用getClassLoader((.getResource((时,它试图解析的路径在"target/test-classes"文件夹中,而资源则位于"target/classes"文件夹中。我该如何解决这个问题?如果相关的话,我的项目遵循Maven的默认结构。
编辑:添加了执行资源加载的代码行
在Maven中运行测试时,类路径由target/classes
和target/test-classes
组成
target/classes用于存储已编译的类和资源(在src/main/java、src/main/resources下(target/test-classes用于存储已编译的测试类和测试资源(分别位于src/test/java和src/test/resources下(
你没有显示执行getClassLoader().getResource()
的代码,最重要的是这个getResource的参数——它是如何在运行时(测试期间(得到解决的,所以很难说更多,但问题可能是这个参数没有正确指定。
例如,如果其文件src/main/resources/sample.xml
,则应将其解析为:
getClassLoader().getResource("/sample.xml")