Я нашел причину и обходной путь для этой проблемы.
Класс javafx.fxml.FXMLLoader использует этот конструктор URL при создании FXMLLoader для включаемых файлов fxml:
public URL(URL context, String spec)
используя местоположение из конструктора FXMLLoader (location) в качестве контекста и используя «источник» из include-элемента в качестве спецификации.
Так что при загрузке моего корневого fxml-файла с путем «view / app.fxml»,контекст будет пакетом «view» в моей IDE, а корень classpath - в экспортированном .jar.
Я попытался создать URL-адрес приложения с помощью
URL classpath = getClass().getProtectionDomain().getCodeSource().getLocation();
URL location = new URL(classpath, "view/app.fxml");
но мой контекст не будет использоваться снова, когда он снова будет подключен к тому же конструктору позже FXMLLoader.
Так что единственный обходной путь, о котором я могу подумать, - это просто поместить все fxml-файлы (по крайней мере, те, которые стег включения) в корень исходной папки.Таким образом, он будет расположен непосредственно на пути к классам в любой среде.