Gradle不包括FXML和图像

时间:2018-02-23 05:24:26

标签: java gradle intellij-idea build continuous-integration

我一直在寻找在build.gradle中包含FXML和图像的正确方法,以便将它们构建到jar中。我看了here并试了一下,但它仍然不起作用。

引发此错误:java.lang.NullPointerException: inputStream is null.

以下是build.gradleGithub):

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.fxmlIcon.png

这是Out树:

com
└───voidustries
    └───poly
        │   CustomFormatter.class
        │   Main.class
        │   PolyThreads.class
        │   SysTray.class
        │
        └───gui
                Controller.class
                GUI.class

在外面的树上,他们都缺席了,我一直在努力解决这个问题几个小时。任何帮助将不胜感激。

此外,如果您需要更多here是Github存储库

2 个答案:

答案 0 :(得分:1)

您将xml文件放在名为src/main/java的文件夹中(提示:java目录适用于java文件)

资源(例如xml,图像文件等)应该放在src/main/resources

这是Maven和Gradle遵循的标准惯例。如果你想改变默认值,但首先我强烈建议你考虑遵循明智的惯例。

另外,关于类加载器的说明

  • SomeClass.class.getResource(“foo.xml”)将查找相对于类包的xml
  • SomeClass.class.getResource(“/ foo.xml”)将查找相对于类路径根目录的xml

所以在你的例子中

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包找不到。