我需要创建一个具有依赖项的 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);
}
}
根据堆栈跟踪的建议,问题是由
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
。