我使用
从我的css文件(位于module/src/main/resources/styles
)创建了二进制样式表
javapackager -createbss -srcdir . -outdir .
根据this answer和this 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?
答案 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>
...