Scene.getStylesheets()。add()在jar文件中不起作用

时间:2013-04-29 19:51:46

标签: java jar resources javafx-2 maven-3

只要我直接从Eclipse运行我的项目,我就没有问题:

scene.getStylesheets().add(getClass().getResource("/stylesheet.css").toExternalForm());

但是,只要我在jar文件中运行此代码,就找不到资源(NullPointerException)。

我尝试将css文件移到我的src文件夹,然后只将stylesheet.css作为路径而不是/stylesheet.css,但这会导致同样的问题:使用正常Eclipse,但不是来自jar。

提示:我正在使用Zonskis Maven JavaFX Plugin来生成jar。

2 个答案:

答案 0 :(得分:7)

我只是浪费了我(你)的时间来写愚蠢的 maven 个人资料。

而不是:

scene.getStylesheets().add(getClass().getResource("/stylesheet.css").toExternalForm());

只需写:

scene.getStylesheets().add("stylesheet.css");

这是Zonski加载css个文件的方式。

当然,您的stylesheet.css文件应位于/src/main/resources,或CLASSPATH上的某个位置。

答案 1 :(得分:1)

将文件移至src/main/resources并添加css文件:

scene.getStylesheets().add(getClass().getClassLoader().getResource("stylesheet.css").toExternalForm());

好吧,如果你想从jar运行它,然后将stylesheet.css更改为stylesheet.bss二进制css ),请打包你的应用程序:

mvn clean compile jfx:build-jar

然后运行你的罐子。

java -jar app.jar

我有一个丑陋的黑客使这个有用(我使用 Netbeans ,惊人的 maven 完整性):

我在project.properties目录中创建了一个src/main/resources文件,

file_css= ${file_css} // by default I use *.css file.

并在我的POM文件中将其设为可过滤:

...
    <build>     
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <filtering>true</filtering>
                </resource>
            </resources>        
            <plugins>           
                <plugin>
                    <groupId>com.zenjava</groupId>
                    <artifactId>javafx-maven-plugin</artifactId>
                    <version> 1.5 </version>
                    <configuration>          
                                    ....
                    </configuration>
                </plugin>
            </plugins>
</build>

...

创建两个maven个人资料,一个用于dev,另一个用于production(打包到jar):

<profiles>
        <profile>
            <id>production</id>
            <properties>
                <file_css>stylesheet.bss</file_css>
            </properties>
        </profile>      
        <profile>
            <id>dev</id>
            <properties>
                <file_css>stylesheet.css</file_css>
            </properties>
        </profile>
</profiles>

所以,您加载css文件,如下所示:

scene.getStylesheets().add(getClass().getClassLoader().getResource(ResourceBundle.getBundle("project").getString("file_css")).toExternalForm());

我使用production个人资料进行打包,dev用于compile, test, run等常规操作。


修改 完整示例托管在github