Ошибка при запуске jar: компоненты среды выполнения JavaFX отсутствуют и необходимы для запуска этого приложения [VS Code] [Java]
Мой проект JavaFX отлично работает в редакторе, но когда я пытаюсь выполнить сборку в .jar, он не запускается. Я использую java 17, поэтому мне нужно вручную импортировать его, и я правильно импортировал библиотеки в settings.json и добавил vmArgs в launch.json. Когда я бегу-
java gui.java
(gui.java - это имя моего класса) Я получаю сообщения об ошибках, например:
error: package javafx.application does not exist
,
error: package javafx.geometry does not exist
,
error: package javafx.scene does not exist
. Я знаю, что мне следует использовать другую версию java или что-то другое, отличное от кода vs, но я не знаю, как преобразовать проект в более раннюю версию java, и я хочу использовать vs code. Кто-нибудь знает, как я могу получить .jar или любой исполняемый файл, работающий для него. Меня даже устраивает что-то вроде сценария bash, который компилирует его вручную, мне просто нужно запустить его вне редактора. Вот мой код gui, я знаю, что он плохой.
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Scanner;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class gui extends Application {
ArrayList<CheckBox> checkBoxes = new ArrayList<CheckBox>();
static String currentDir = System.getProperty("user.dir");
static File checkListFile = new File(currentDir + "\\list.TXT");
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
BorderPane root = new BorderPane();
Scene scene = new Scene(root, 450, 250);
VBox vbCenter = new VBox();
TextField input = new TextField();
input.setOnKeyPressed( event -> {
if( event.getCode() == KeyCode.ENTER ) {
addCheckBox(input.getText(), vbCenter);
input.setText("");
saveCheckBoxes();
}
});
vbCenter.getChildren().add(input);
HBox hbButtons = new HBox();
Button reset = new Button("Reset");
reset.setOnAction( event -> {
removeCheckBoxes(vbCenter);
});
hbButtons.getChildren().add(reset);
hbButtons.setAlignment(Pos.CENTER_LEFT);
loadCheckBoxes(vbCenter);
root.setPadding(new Insets(20));
root.setCenter(vbCenter);
root.setBottom(hbButtons);
primaryStage.setTitle("Checklist");
primaryStage.setScene(scene);
primaryStage.show();
}
public void addCheckBox(String name, VBox vbCenter) {
CheckBox checkBox = new CheckBox(name);
checkBoxes.add(checkBox);
vbCenter.getChildren().add(checkBox);
}
public void removeCheckBoxes(VBox vbCenter) {
for (CheckBox checkBox : checkBoxes) {
vbCenter.getChildren().remove(checkBox);
}
checkBoxes = new ArrayList<CheckBox>();
try {
clearTheFile(checkListFile);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void clearTheFile(File file) throws IOException {
FileWriter fwOb = new FileWriter(file);
PrintWriter pwOb = new PrintWriter(fwOb, false);
pwOb.flush();
pwOb.close();
fwOb.close();
}
public void saveCheckBoxes() {
String[] name = new String[checkBoxes.size()];
for (int i = 0; i < checkBoxes.size(); i++) {
name[i] = checkBoxes.get(i).getText();
}
writeData(name, checkListFile);
}
public void loadCheckBoxes(VBox vb) {
String[] data = readData(checkListFile);
for (String s : data) {
CheckBox checkBox = new CheckBox(s);
checkBoxes.add(checkBox);
vb.getChildren().add(checkBox);
}
}
public String[] readData(File file) {
String[] result = new String[0];
try {
result = new String[(int)Files.lines(file.toPath()).count()];
Scanner scanner = new Scanner(file);
int index = 0;
while (scanner.hasNextLine()) {
result[index] = scanner.nextLine();
index++;
}
scanner.close();
}
catch (Exception e) {
e.printStackTrace();
}
return result;
}
public void writeData(String data, File file) {
try {
FileWriter writer = new FileWriter(file);
writer.write(data);
writer.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
public void writeData(String[] dataArr, File file) {
String data = "";
for (int i = 0; i < dataArr.length; i++) {
data += (dataArr[i] + "\n");
}
writeData(data, file);
}
}
launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Launch Current File",
"request": "launch",
"mainClass": "${file}"
},
{
"type": "java",
"name": "Launch gui",
"request": "launch",
"vmArgs": "--module-path C:/Users/Billy1301/Downloads/openjfx-17.0.1_windows-x64_bin-sdk/javafx-sdk-17.0.1/lib --add-modules javafx.controls,javafx.fxml",
"mainClass": "gui",
"projectName": "Productivity_5753000c"
}
]
}
settings.json
{
"java.project.referencedLibraries": [
"lib/**/*.jar",
"c:\\Users\\Billy1301\\Downloads\\openjfx-17.0.1_windows-x64_bin-sdk\\javafx-sdk-17.0.1\\lib\\javafx.base.jar",
"c:\\Users\\Billy1301\\Downloads\\openjfx-17.0.1_windows-x64_bin-sdk\\javafx-sdk-17.0.1\\lib\\javafx.controls.jar",
"c:\\Users\\Billy1301\\Downloads\\openjfx-17.0.1_windows-x64_bin-sdk\\javafx-sdk-17.0.1\\lib\\javafx.fxml.jar",
"c:\\Users\\Billy1301\\Downloads\\openjfx-17.0.1_windows-x64_bin-sdk\\javafx-sdk-17.0.1\\lib\\javafx.graphics.jar",
"c:\\Users\\Billy1301\\Downloads\\openjfx-17.0.1_windows-x64_bin-sdk\\javafx-sdk-17.0.1\\lib\\javafx.media.jar",
"c:\\Users\\Billy1301\\Downloads\\openjfx-17.0.1_windows-x64_bin-sdk\\javafx-sdk-17.0.1\\lib\\javafx.swing.jar",
"c:\\Users\\Billy1301\\Downloads\\openjfx-17.0.1_windows-x64_bin-sdk\\javafx-sdk-17.0.1\\lib\\javafx.web.jar",
"c:\\Users\\Billy1301\\Downloads\\openjfx-17.0.1_windows-x64_bin-sdk\\javafx-sdk-17.0.1\\lib\\javafx-swt.jar"
]
}