我正在尝试从我在ideallij中创建的javafx项目中导出jar文件。我通过在输出中添加所有jar库来完成工件的属性。然后,我构建工件并创建jar文件。但是,当我尝试使用java - jar name.jar
从终端运行jar时,我收到以下错误:
Application start方法中的异常,java.lang.reflect.InvocationTargetException
fxml文件中的错误点。如何在压缩的jar文件中添加fxml文件?
FXML加载:
public void start(Stage primaryStage) throws Exception {
FXMLLoader fxmlLoader = new FXMLLoader(EchoClient.class.getResource("name.fxml"));
Parent p = fxmlLoader.load();
Scene scene = new Scene(p);
primaryStage.setScene( scene );
primaryStage.setTitle("FX Echo Client");
primaryStage.setWidth( 320 );
primaryStage.setHeight(568);
primaryStage.show();
}
错误位于Parent p = fxmlLoader.load();
。我收到的错误如下:
编辑:经过一番研究后,我得出的结论是following post我的问题是理想的。因此,我从 FXML文件中删除了fx:controller
属性,但通常在没有应用程序功能的情况下调用jar。我如何将控制器功能添加回代码?
我的fxml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="services.EchoClientController">
<children>
<VBox spacing="10.0" VBox.vgrow="SOMETIMES">
<children>
<Label text="Host" />
<TextField fx:id="tfHost" text="localhost" />
<Label text="Port" />
<TextField fx:id="tfPort" text="10000" />
<HBox spacing="4.0">
<children>
<Button fx:id="btnConnect" mnemonicParsing="false" onAction="#connect" text="Connect" />
<Button fx:id="btnDisconnect" mnemonicParsing="false" onAction="#disconnect" text="Disconnect" />
</children>
</HBox>
</children>
<VBox.margin>
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
</VBox.margin>
</VBox>
<Separator prefWidth="200.0" />
<VBox spacing="10.0" VBox.vgrow="ALWAYS">
<children>
<Label text="Message To Send" />
<TextField fx:id="tfSend" />
<Button fx:id="btnSend" mnemonicParsing="false" onAction="#send" text="Send" />
<Label text="Message Received" />
<TextField fx:id="tfReceive" editable="false" />
</children>
<VBox.margin>
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
</VBox.margin>
</VBox>
<Separator prefWidth="200.0" />
<VBox VBox.vgrow="NEVER">
<VBox.margin>
<Insets bottom="10.0" left="20.0" right="20.0" top="10.0" />
</VBox.margin>
<children>
<HBox fx:id="hboxStatus" spacing="10.0">
<children>
<ProgressBar fx:id="piStatus" prefWidth="150.0" progress="0.0" />
<Label fx:id="lblStatus" text="Label" />
</children>
</HBox>
</children>
</VBox>
</children>
</VBox>
答案 0 :(得分:2)
当.fxml文件中存在拼写错误时,我通常会收到此错误。我认为文件本身会流向.jar文件,其中只有一些无法解析的内容。您可以通过临时删除大部分fxml内容来确保(确保没有Java代码的引用到任何缺少的GUI元素)以查看错误是否消失。
答案 1 :(得分:2)
错误只能来自services.EchoClientController
,缺少:
@FXML
private void connect() {
}
@FXML
private void disconnect() {
}
@FXML
private void send() {
}
因为它不能那么简单,请查看构造函数并考虑使用:
@Override
public void initialize(URL url, ResourceBundle rb) {
// Maybe constructor code here.
}
而不是
FXMLLoader fxmlLoader =
new FXMLLoader(EchoClient.class.getResource("name.fxml"));
Parent p = fxmlLoader.load();
我做了(什么不应该有所作为)
Parent p = FXMLLoader.load(EchoClient.class.getResource("name.fxml"));