我使用
从我的 css 文件(位于module/src/main/resources/styles
中)创建了二进制样式表
javapackager -createbss -srcdir 。 -outdir .
根据 this answer以及 this report 中的推荐我用
加载它们scene.getStylesheets().add("styles/style.css");
并删除了 .css 文件,只是为了测试 JavaFX 确实会查找现有的 .bss 文件,即使它们被引用为 .css。
但是,运行该应用程序会出现以下错误:
2017 年 2 月 3 日下午 3:42:47 com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
警告:找不到资源“styles/style.css”。
检查 loadStylesheetUnPrivileged()
我可以看到它确实可以找到资源文件夹中的文件并开始读取它们,但在 DataInputStream.readUTF() 中失败并出现 EOFException。然后,正如预期的那样,它尝试查找我删除的 .css 文件,并在明显失败时给出上面的消息。
我正在研究 Java 8u40,但也尝试过 8u112,具有相同的行为。
我应该在 .css 文件中查找是否有任何内容可能导致生成的 .bss 无效?我找不到任何有关该技术限制的文档。
我很乐意提供任何缺失的信息。
更新
我已将 .css 减少到最小,但相应的 .bss 仍然无法读取。这排除了不支持的关键字的问题。作为引用,这里是最小化的 .css:
.button {
-fx-background-color: blue;
}
另一方面,我创建了一个小型测试应用程序(与 the answer mentioned above 中的非常相似)加载转换为 .bss 的相同最小 .css,并且它按预期工作。两者 (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?
最佳答案
这确实是环境上的差异:当resources
插件在构建时将.bss文件从源目录复制到jar或classes文件夹中时,maven会过滤.bss文件。这本质上是破坏了文件。
因此解决方案是在元素的 pom.xml 中添加一个 exclude
子句:
<project>
...
<build>
...
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
...
<exclude>**/*.bss</exclude>
...
关于JavaFX:无法加载二进制样式表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42028129/