我一直在寻找在build.gradle
中包含FXML和图像的正确方法,以便将它们构建到jar中。我看了here并试了一下,但它仍然不起作用。
引发此错误:java.lang.NullPointerException: inputStream is null.
以下是build.gradle
(Github):
group 'com.voidustries'
version '1.0-SNAPSHOT'
sourceSets {
main {
resources {
srcDirs = ["src/main/java/com/voidustries/poly"]
includes = ["gui/layoutForm.fxml"]
}
}
}
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.junit.platform:junit-platform-gradle-plugin:1.1.0'
}
}
apply plugin: 'java'
apply plugin: 'org.junit.platform.gradle.plugin'
repositories {
mavenCentral()
}
dependencies {
testCompile('org.junit.jupiter:junit-jupiter-api:5.1.0')
testRuntime('org.junit.jupiter:junit-jupiter-engine:5.1.0')
}
task wrapper(type: Wrapper) {
description = 'Generates gradlew[.bat] scripts'
gradleVersion = '4.3.1'
}
test {
testLogging {
events "passed", "skipped", "failed"
}
}
这是GUI.java(Github):
FXMLLoader loader = new FXMLLoader();
FileInputStream fis = new FileInputStream(settings);
ResourceBundle resourceBundle = new PropertyResourceBundle(fis);
loader.setResources(resourceBundle);
Parent root = loader.load(getClass().getResourceAsStream("layoutForm.fxml"));
Platform.setImplicitExit(false);
堆栈跟踪表示loader.load(getClass().getResourceAsStream("layoutForm.fxml"));
导致错误
这是源树:
com
└───voidustries
└───poly
│ CustomFormatter.java
│ Main.java
│ PolyThreads.java
│ SysTray.java
│
├───gui
│ Controller.java
│ GUI.java
│ Icon.png
│ layoutForm.fxml
│
└───img
Icon.png
您可以看到树中存在layoutForm.fxml
和Icon.png
这是Out树:
com
└───voidustries
└───poly
│ CustomFormatter.class
│ Main.class
│ PolyThreads.class
│ SysTray.class
│
└───gui
Controller.class
GUI.class
在外面的树上,他们都缺席了,我一直在努力解决这个问题几个小时。任何帮助将不胜感激。
此外,如果您需要更多here是Github存储库
答案 0 :(得分:1)
您将xml文件放在名为src/main/java
的文件夹中(提示:java目录适用于java文件)
资源(例如xml,图像文件等)应该放在src/main/resources
这是Maven和Gradle遵循的标准惯例。如果你想改变默认值,但首先我强烈建议你考虑遵循明智的惯例。
另外,关于类加载器的说明
所以在你的例子中
getClass().getResourceAsStream("layoutForm.fxml")
这是在类路径com/voidustries/poly/gui/layoutForm.fxml
因此,如果您想将资源保留在原来的位置,您需要将src/main/java
添加到资源文件夹,而不是src/main/java/com/voidustries/poly
答案 1 :(得分:1)
只要为不满意的人加点三分钱
:在src / main / resources(Windows src \ main \ resources)下,您似乎必须使资源文件的“位置” 匹配用于运行.class文件的类路径。 / p>
我通过在JavaFX gradle项目中使用.fxml文件来得出结论(除非有更多的知识渊博的人说相反)。
类Main
(包含main()
)位于名为“ sample”的包中……因此.java文件的路径为... \ EclipseWorkspace \ TestFXexp \ src \ main \ java \ sample \ Main.java。
这似乎意味着您的.fxml文件必须放在此处:... \ EclipseWorkspace \ TestFXexp \ src \ main \ resources \ sample \ config.fxml。
gradle installdist
然后将正确打包.jar进行部署。展开.jar,您会发现config.xml和.class文件一起放在了目录sample \下,并且Main.class文件能够找到并使用它。
当我这样放置config.fxml时:... \ EclipseWorkspace \ TestFXexp \ src \ main \ resources \ config.fxml ...没用:将config.fxml放在然后 outside .jar文件和Main.class文件中的sample
包找不到。