5

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

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

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

我尝试将css文件移动到我的src文件夹,然后仅stylesheet.css作为路径而不是/stylesheet.css,但这会导致相同的问题:使用 Eclipse 可以正常工作,但不能从 jar 中。

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

4

2 回答 2

7

我只是浪费了我(你的)时间来编写愚蠢的Maven配置文件。

代替 :

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

只需写:

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

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

当然你的stylesheet.css文件应该/src/main/resourcesCLASSPATH.

于 2013-05-01T11:14:10.470 回答
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

我有一个丑陋的 hack 让它有点可用(我正在使用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配置文件进行包装,以及devcompile, test, run.


编辑: 一个完整​​的例子托管在github 上

于 2013-04-29T20:03:16.760 回答