使用Javafx Maven插件编译项目后,Program Cant找到资源

时间:2015-11-12 22:36:25

标签: java maven javafx pom.xml packaging

好吧,所以我对javafx和一般的编程都是新手。我之前从未实际打包过程序,因为我从来不需要在IDE之外运行它们。我需要打包我的javafx程序,并且必须使用maven来处理我的所有其他依赖项。

在包含pom文件的目录中使用命令mvn jfx:jar编译程序时,构建成功并生成我的jar。通过WINRar检查时,包含以前位于根目录的/ src / main / resource文件夹中的所有文件。

然而,当使用java -jar(nameofjar).jar运行时,它不会启动,而是产生一些错误,这些错误都与无法找到特定资源有关,特别是FXML,以及其他资源。

参考文件

welcome.fxml

public void start(Stage primaryStage) {


    try {
        AnchorPane pane = FXMLLoader.load(MainApp.class.getResource("welcome.fxml"));
        Scene scene = new Scene(pane);
        primaryStage.setScene(scene);
        primaryStage.setTitle("HeelBot Beta "+versionNumber);

        primaryStage.getIcons().add(new Image("Icon.png"));
        primaryStage.setResizable(true);
        primaryStage.show();
    } catch (Exception ex) {
        Logger.getLogger(MainApp.class.getName()).log(Level.SEVERE, null, ex);
    }

defaultProperties.properties

    public class PropertiesManager {
    public static void editProperty(String key, String value) throws IOException {
        // create and load default properties
        Properties defaultProps = new Properties();
        FileInputStream in = new FileInputStream("src/main/resources/defaultProperties.properties");
        defaultProps.load(in);
        in.close();

// create application properties with default
        Properties applicationProps = new Properties(defaultProps);

// now load properties
// from last invocation
        in = new FileInputStream("src/main/resources/appProperties.properties");
        applicationProps.load(in);
        in.close();
//set properties
        applicationProps.setProperty(key,value);
        FileOutputStream out = new FileOutputStream("src/main/resources/appProperties.properties");
        applicationProps.store(out, "---No Comment---");
        out.close();

    }

POM文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.coursecruncher</groupId>
    <artifactId>heelbot</artifactId>
    <version>1.0-SNAPSHOT</version>
<build>
    <plugins>
        <plugin>
            <groupId>com.zenjava</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>8.1.4</version>
            <configuration>
                <mainClass>MainApp</mainClass>
                <verbose>true</verbose>
                <jfxMainAppJarName>heelbot.jar</jfxMainAppJarName>
                <deployDir>${project.basedir}/src/main/resources</deployDir>
                <updateExistingJar>true</updateExistingJar>
                <allPermissions>true</allPermissions>
            </configuration>
        </plugin>

    </plugins>

</build>

    <dependencies>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>2.48.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.2.4</version>
        </dependency>
    </dependencies>

</project>

项目结构

├── configure
├── configure.in
├── src
│   ├── main
│   │   ├── java 
│   │   │     ├── CoreController(class)
│   │   │     ├── Login(class)
│   │   │     ├── LoginController(class)
│   │   │     ├── MainApp(class)
│   │   │     └── PropertiesManager(class)
│   │   │        
│   │   ├── resources
│   │   │     ├── appProperties.properties
│   │   │     ├── defaultProperties.properties
│   │   │     ├── welcome.fxml
│   │   │     ├── core.fxml
│   │   │     └── Heelbot.css 

错误

enter code here

java.io.FileNotFoundException: src\main\resources\defaultProperties.properties (
The system cannot find the path specified)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(FileInputStream.java:195)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at java.io.FileInputStream.<init>(FileInputStream.java:93)
        at PropertiesManager.editProperty(PropertiesManager.java:11)
        at LoginController.initialize(LoginController.java:60)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
        at Main.start(Main.java:53)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$163
(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(Platfor
mImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.
java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformI
mpl.java:294)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatch
er.java:95)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.ja
va:191)
        at java.lang.Thread.run(Thread.java:745)
java.io.FileNotFoundException: src\main\resources\defaultProperties.properties (
The system cannot find the path specified)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(FileInputStream.java:195)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at java.io.FileInputStream.<init>(FileInputStream.java:93)
        at PropertiesManager.queryProperty(PropertiesManager.java:34)
        at LoginController.initialize(LoginController.java:106)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
        at Main.start(Main.java:53)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$163
(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(Platfor
mImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.
java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformI
mpl.java:294)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatch
er.java:95)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.ja
va:191)
        at java.lang.Thread.run(Thread.java:745)
Nov 12, 2015 5:12:08 PM Main start
SEVERE: null
javafx.fxml.LoadException:
file:/D:/Programing%20Data/Projects/CourseCruncher/target/jfx/app/heelbot.jar!/w
elcome.fxml

        at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
        at Main.start(Main.java:53)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$163
(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(Platfor
mImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.
java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformI
mpl.java:294)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatch
er.java:95)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.ja
va:191)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
        at java.util.Properties$LineReader.readLine(Properties.java:434)
        at java.util.Properties.load0(Properties.java:353)
        at java.util.Properties.load(Properties.java:341)
        at PropertiesManager.queryProperty(PropertiesManager.java:39)
        at LoginController.initialize(LoginController.java:106)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
        ... 17 more

我怀疑我的pom配置可能是造成问题的原因。我不太确定如何正确格式化它并尝试了各种组合和教程都无济于事。我最接近的是使用这个pom

备用POM文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.courecruncher</groupId>
    <artifactId>heelbot</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>HeelBotBeta1</name>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>2.48.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.2.4</version>
        </dependency>

    </dependencies>
    <build>
        <defaultGoal>clean package</defaultGoal>
        <plugins>
            <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <id>unpack-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>unpack-dependencies</goal>
                        </goals>
                        <configuration>
                            <excludeScope>system</excludeScope>
                            <excludeGroupIds>junit,org.mockito,org.hamcrest</excludeGroupIds>
                            <outputDirectory>${project.build.directory}/classes</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <executions>
                    <execution>
                        <id>package-jar</id>
                        <phase>package</phase>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <configuration>
                            <executable>${env.JAVA_HOME}/bin/javafxpackager</executable>
                            <arguments>
                                <argument>-createjar</argument>
                                <argument>-nocss2bin</argument>
                                <argument>-appclass</argument>
                                <argument>MainApp</argument>
                                <argument>-srcdir</argument>
                                <argument>${project.build.directory}/classes</argument>
                                <argument>-outdir</argument>
                                <argument>.</argument>
                                <argument>-outdir</argument>
                                <argument>${project.build.directory}</argument>
                                <argument>-outfile</argument>
                                <argument>${project.artifactId}-app</argument>
                                <argument>-v</argument>
                            </arguments>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>

这会导致它找到fxml文件,但仍然会为属性文件抛出错误,我必须手动将属性文件添加到项目目录中。如何让打包的jar能够找到自己的资源,而不是在jar之外寻找资源?

1 个答案:

答案 0 :(得分:0)

我是javafx-maven-plugin的维护者,偶然发现了这个问题;)

问题在于你读取文件的“逻辑”,访问JAR中的属性文件是以另一种方式完成的,但这不是所用插件的错误,它是一个普通的java-thing(如指出的那样)我们的抛出exxception)。要知道“当前文件夹”的位置,只需打印new File(".")

即可

只是告诉你javafx-maven-plugin配置:没有错误

以下是我发现的一些链接,可以向您展示JAR文件中的简单属性加载:

Load properties file in JAR?

Load Properties from resources folder within JAR

编辑:请确保对“当前工作文件夹”有一点了解,调用java -jar somejar.jarjava -jar somefolder/somejar.jar不同,有很大差异