JavaFX:无法加载二进制样式表

时间:2017-02-03 15:54:12

标签: java css javafx javafx-8

我使用

从我的css文件(位于module/src/main/resources/styles)创建了二进制样式表

javapackager -createbss -srcdir . -outdir .

根据this answerthis report中的建议,我用

加载它们

scene.getStylesheets().add("styles/style.css");

并删除.css文件只是为了测试JavaFX确实在寻找现有的.bss文件,即使它们被引用为.css。

但是,运行应用程序会出现以下错误:

Feb 03, 2017 3:42:47 PM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged WARNING: Resource "styles/style.css" not found.

检查loadStylesheetUnPrivileged()我可以看到它确实可以找到资源文件夹中的文件并开始读取它们,但是在带有EOFException的DataInputStream.readUTF()中失败。然后,正如预期的那样,它试图找到我删除的.css文件,并在显然失败时给出上面的消息。

我正在研究Java 8u40,但尝试过8u112也有同样的行为。

我的.css文件中是否有任何可能导致生成的.bss无效的内容?我找不到任何关于这项技术局限性的文件。

我很乐意提供任何遗漏信息。

更新

我已将.css降低到最小值,仍然无法读取相应的.bss。这会将不受支持的关键字排除在外。作为参考,这里是最小化的.css:

.button {
    -fx-background-color: blue;
}

另一方面,我创建了一个小的测试应用程序(非常类似于the answer mentioned above中的那个)加载相同的最小.css转换为.bss,它按预期工作。两个(8u40)中使用的Java版本相同,同样javapackager。测试应用程序:

public class Main extends Application {
    @Override
    public void start(Stage stage) throws IOException {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/Mainwindow.fxml"));
            AnchorPane ap = loader.load();
            ap.getStylesheets().add("styles/style.css");

            Scene scene = new Scene(ap);
            stage.setScene(scene);
            stage.show();
    }
}

生成的二进制文件也如预期的那样相同: link to image here, not enough rep to embed :)

我不确定环境中可能导致主应用程序无法加载完全相同的.bss?

1 个答案:

答案 0 :(得分:0)

环境确实存在差异:当resources插件在构建时将其从源目录复制到jar或classes文件夹中时,.bss文件正被maven过滤。这实质上是在破坏文件。

所以解决方案是在项目的pom.xml中添加exclude子句:

<project>
  ...
  <build>
    ...
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <excludes>
          ...
          <exclude>**/*.bss</exclude>
        ...