Scene.getStylesheets().add() not working inside ja

2019-06-25 05:20发布

问题:

As long as I run my project directly from Eclipse, I have no problem with that:

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

But as soon as I run this code inside of a jar file, the resource is not found (NullPointerException).

I tried moving the css file to my src folder and then only stylesheet.cssas path instead of /stylesheet.css, but this leads to the same problem: Works fine using Eclipse, but not from the jar.

Hint: I am using Zonskis Maven JavaFX Plugin for generating the jar.

回答1:

I just wasted my (your) time writing silly maven profiles.

instead of :

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

simply write :

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

This is how Zonski load css files.

Of course your stylesheet.css file should be in /src/main/resources, or somewhere on the CLASSPATH.



回答2:

Move your file to src/main/resources and add your css file :

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

Well, if you want to run it from the jar, then change stylesheet.css to stylesheet.bss ( binary css), package your application :

mvn clean compile jfx:build-jar

and run your jar.

java -jar app.jar

I have a ugly hack to make this a little usable (I'm using Netbeans,amazing maven integrity):

I create a project.properties file in src/main/resources directory,

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

And make it filterable, in my POM file:

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

...

And create two maven profiles, one for dev, and the other for production (packaging to 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>

So, you load your css file like this :

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

I use production profile for packaging, and dev for usual actions like compile, test, run.


Edit: a complete example is hosted on github.