使用 JavaFX 依赖项运行 jar 文件时出错

问题描述 投票:0回答:1

我需要创建一个具有依赖项的 jar 文件,以便我可以在没有源代码文件的情况下传输它。但是当你双击启动这样的jar时,没有任何作用,但是如果你通过命令行以 java -jar file.jar 格式运行它,则会出现以下错误:

Exception in thread "main" java.lang.ExceptionInInitializerError
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65)
Caused by: java.lang.NullPointerException
        at uip.gui.JavaFxRun.<clinit>(JavaFxRun.java:16)
        ... 8 more

这是我的带有插件和启动代码的代码:

<build>
 <plugins>
  <plugin>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-maven-plugin</artifactId>
   <executions>
     <execution>
      <goals>
       <goal>repackage</goal>
      </goals>
      <configuration>
    <classifier>spring-boot</classifier>
    <mainClass>
     uip.gui.JavaFxRun
    </mainClass>
      </configuration>
     </execution>
   </executions>
  </plugin>
 </plugins>
</build>

使用 JavaFX 文件:

public class JavaFXClassFrame extends Application {

    static Logger LOGGER;

    static {
        try (FileInputStream ins = new FileInputStream("src/main/resources/log.config")) {
            LogManager.getLogManager().readConfiguration(ins);
            LOGGER = Logger.getLogger(JavaFXClassFrame.class.getName());
        } catch (IOException e) {
            LOGGER.log(Level.WARNING, "Error ", e);
        }
    }

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        try {
            FXMLLoader loader = new FXMLLoader();
            URL xmlUrl = getClass().getResource("/fileFxml.fxml");
            loader.setLocation(xmlUrl);
            Parent root = loader.load();
            stage.setScene(new Scene(root));
            stage.show();
            LOGGER.log(Level.INFO, "Success ");
        } catch (Exception e) {
            LOGGER.log(Level.SEVERE, "Error", e);
        }
    }
}
public class JavaFxRun {
    static Logger LOGGER;

    static {
        try (FileInputStream ins = new FileInputStream("src/main/resources/log.config")) {
            LogManager.getLogManager().readConfiguration(ins);
            LOGGER = Logger.getLogger(JavaFxRun.class.getName());
        } catch (Exception e) {
            LOGGER.log(Level.WARNING, "Error ", e);
        }
    }

    public static void main(String[] args) {
        JavaFXClassFrame.main(args);
    }
}

JavaFX 启动文件:

public class JavaFxRun {
    static Logger LOGGER;

    static {
        try (FileInputStream ins = new FileInputStream("src/main/resources/log.config")) {
            LogManager.getLogManager().readConfiguration(ins);
            LOGGER = Logger.getLogger(JavaFxRun.class.getName());
        } catch (Exception e) {
            LOGGER.log(Level.WARNING, "Error ", e);
        }
    }

    public static void main(String[] args) {
        JavaFXClassFrame.main(args);
    }
}
java maven jar
1个回答
0
投票

根据堆栈跟踪的建议,问题是由

JavaFxRun
的第16行引起的:

try (FileInputStream ins = new FileInputStream("src/main/resources/log.config")) {

FileInputStream
从文件系统读取文件,而不是从JAR读取文件;此外,如果你解压 JAR,你会发现
log.config
的路径不是你指定的路径。

尝试将该行替换为

try (InputStream ins = JavaFxRun.class.getResourceAsStream("/log.config")) {

此行使用代表类 getResourceAsStream()

Class 对象的方法
JavaFxRun

© www.soinside.com 2019 - 2024. All rights reserved.