【问题标题】:My executable jar doesn't work我的可执行 jar 不起作用
【发布时间】:2015-06-28 00:40:26
【问题描述】:

我在“eclipse”中使用 javafx 的项目中工作了一整夜。它工作得很好,所以我按下“导出来获取可运行的 jar 文件,当我得到它时,它只是没有工作,仍然没有。我想问题出在 main 方法中,我将在这里发布。任何帮助会很棒。

package recetas;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.prefs.Preferences;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.stage.Modality;
import javafx.stage.Stage;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import recetas.model.Receta;
import recetas.model.RecetasListWrapper;
import recetas.view.Controlador;
import recetas.view.ControladorEditar;
import recetas.view.VerControlador;



public class MainRecetas extends Application {
    private Stage primaryStage;
    private ObservableList<Receta> recetaData = FXCollections
            .observableArrayList();

    public MainRecetas() {
        recetaData.add(new Receta("Arroz tres delicias"));
        recetaData.add(new Receta("Pollo al horno"));
        recetaData.add(new Receta("Bizcocho de chocolate"));
        recetaData.add(new Receta("Pizza barbacoa"));
        recetaData.add(new Receta("Sopa de pescado"));
        recetaData.add(new Receta("Macarrones a la bolognesa"));
        recetaData.add(new Receta("Pechuga con patatas fritas"));
        recetaData.add(new Receta("Macedonia"));
        recetaData.add(new Receta("Fresas con chocolate"));
        recetaData.get(1).setVal(1);
        recetaData.get(1).setPlato("Plato");
        recetaData.get(1).setDif("Facil");
        recetaData.get(2).setDif("Dificil");
    }

    public ObservableList<HBox> getCajasList() {
        ObservableList<HBox> res = FXCollections.observableArrayList();
        for (int i = 0; i < recetaData.size(); i++)
            res.add(recetaData.get(i).getCaja());
        return res;
    }

    @Override
    public void start(Stage primaryStage) {
        this.primaryStage = primaryStage;
        this.primaryStage.setTitle("Mis recetillas");
        this.primaryStage.getIcons().add(new Image("@../../icono.png"));
        showPersonOverview();
    }

    public void showPersonOverview() {
        Controlador controller = null;
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MainRecetas.class.getResource("view/Vista.fxml"));
            AnchorPane personOverview = (AnchorPane) loader.load();
            Scene scene = new Scene(personOverview);
            primaryStage.setScene(scene);
            controller = loader.getController();
            controller.setMainRecetas(this);
            primaryStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
        File file = getFilePath();
        if (file != null){
            CargarRecetas(file);
            controller.setMainRecetas(this);
        }
    }

    public boolean editar(Receta r) {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MainRecetas.class
                    .getResource("view/VentanaEditar.fxml"));
            AnchorPane editar = (AnchorPane) loader.load();
            Stage dialog = new Stage();
            dialog.setTitle("Editar receta: " + r.getNombre());
            dialog.initModality(Modality.WINDOW_MODAL);
            dialog.initOwner(primaryStage);
            Scene scene = new Scene(editar);
            dialog.setScene(scene);
            ControladorEditar controller = loader.getController();
            controller.setDialogStage(dialog);
            controller.setReceta(r);
            dialog.showAndWait();
            return controller.getOK();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    public boolean nuevo() {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MainRecetas.class
                    .getResource("view/VentanaEditar.fxml"));
            AnchorPane editar = (AnchorPane) loader.load();
            Stage dialog = new Stage();
            Receta r = new Receta(null);
            dialog.setTitle("Nueva receta");
            dialog.initModality(Modality.WINDOW_MODAL);
            dialog.initOwner(primaryStage);
            Scene scene = new Scene(editar);
            dialog.setScene(scene);
            ControladorEditar controller = loader.getController();
            controller.setDialogStage(dialog);
            controller.setReceta(r);
            dialog.showAndWait();
            boolean ok = controller.getOK();
            if (ok)
                recetaData.add(0, r);
            return ok;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    public void ver(Receta r) {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MainRecetas.class
                    .getResource("view/VerReceta.fxml"));
            AnchorPane editar = (AnchorPane) loader.load();
            Stage dialog = new Stage();
            dialog.setTitle(r.getNombre());
            dialog.initModality(Modality.WINDOW_MODAL);
            dialog.initOwner(primaryStage);
            Scene scene = new Scene(editar);
            dialog.setScene(scene);
            VerControlador controller = loader.getController();
            controller.setReceta(r);
            dialog.showAndWait();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void ayuda() {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MainRecetas.class
                    .getResource("view/Ayuda.fxml"));
            AnchorPane editar = (AnchorPane) loader.load();
            Stage dialog = new Stage();
            dialog.setTitle("Ayuda");
            dialog.initModality(Modality.WINDOW_MODAL);
            dialog.initOwner(primaryStage);
            Scene scene = new Scene(editar);
            dialog.setScene(scene);
            dialog.showAndWait();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Stage getPrimaryStage() {
        return primaryStage;
    }

    public ObservableList<Receta> getRecetaData() {
        return recetaData;
    }

    public void eliminar(int i) {
        recetaData.remove(i);
    }

    public void setFilePath(File file) {
        Preferences prefs = Preferences.userNodeForPackage(MainRecetas.class);
        if (file != null) {
            prefs.put("filePath", file.getPath());

            primaryStage.setTitle("Mis recetillas - " + file.getName());
        } else {
            prefs.remove("filePath");

            primaryStage.setTitle("Mis recetillas");
        }
    }

    public File getFilePath() {
        Preferences prefs = Preferences.userNodeForPackage(MainRecetas.class);
        String filePath = prefs.get("filePath", null);
        if (filePath != null) {
            return new File(filePath);
        } else {
            return null;
        }
    }

    public void CargarRecetas(File file) {
        try {
            JAXBContext context = JAXBContext
                    .newInstance(RecetasListWrapper.class);
            Unmarshaller um = context.createUnmarshaller();

            RecetasListWrapper wrapper = (RecetasListWrapper) um
                    .unmarshal(file);

            recetaData.clear();
            try{ recetaData.addAll(wrapper.getRecetas());}
            catch(NullPointerException e){}

            setFilePath(file);

        } catch (JAXBException e) {
            Alert alert = new Alert(AlertType.ERROR);
            alert.setTitle("Error");
            alert.setHeaderText("No se pudo cargar la información del archivo:\n"
                    + file.getPath());
            alert.showAndWait();
        }
    }

    public void guardarRecetas(File file) {
        try {
            JAXBContext context = JAXBContext
                    .newInstance(RecetasListWrapper.class);
            Marshaller m = context.createMarshaller();
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

            RecetasListWrapper wrapper = new RecetasListWrapper();
            wrapper.setRecetas(recetaData);

            m.marshal(wrapper, file);

            setFilePath(file);
        } catch (Exception e) { 
            Alert alert = new Alert(AlertType.ERROR);
            alert.setTitle("Error");
            alert.setHeaderText("No se pudo guardar la información en el archivo:\n"
                    + file.getPath());
            alert.showAndWait();
        }
    }

    public List<Receta> buscarDestacadas() {
        List<Receta> l = new ArrayList<Receta>();
        for (int i = 0; i < recetaData.size(); i++) {
            Receta r = recetaData.get(i);
            if (r.getVal() == 5)
                l.add(r);
        }
        return l;
    }

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

【问题讨论】:

  • by doesn't work,你的意思是它崩溃了吗?你得到什么样的错误?
  • 从命令行运行它并发布堆栈跟踪
  • 我双击它,它就是不运行。它不会给出任何错误,就像我没有点击一样。
  • 而且在命令行中也没有报错
  • .. 在 jar 中不起作用,@ 符号也不起作用(我什至不知道 @ 应该是什么意思),所以删除 @../../icono.png,将图标放入jar 文件的根目录并通过/icono.png 引用它。还要确保它们引用的 fxml 文件和资源位于正确的位置。如果您仍然有问题,只需尝试将基本的 hello world 应用程序打包为 jar,然后逐渐从您的程序中一次添加一个功能,直到它中断 - 这样您就会更好地了解什么错误是。同时运行java -jar yourapp.jar

标签: java eclipse javafx export executable-jar


【解决方案1】:

由于 cmets 中描述的事件以及您提供的代码,我有两种可能的解决方案。

  1. 从您给出的代码来看,没有launch() 方法。这意味着一旦启动,程序将无处可去,并且应该产生错误,因为没有方法 launch()
  2. 您可能已将其导出为可执行文件以外的其他内容。也许您已将其导出为jar file 而不是runnable jar file。如果您这样做了,您所要做的就是更改导出方式。

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题,但是我在 start 方法中初始化了照片(仅在 JavaFX 中使用),我的问题已经解决,jar 的工作方式与在 IDE 中工作相同(在我的情况下为 Eclipse)。

    @Override
    public void start(Stage stage) {
      // set all photos in this function
    }
    

    Eclipse IDE 中的注意事项:

    1. 在已安装的 JRE 中设置 JDK 而不是 JRE
    2. 从 File->New->Project->JavaFX->JavaFX 项目创建特殊的 JavaFX 项目
    3. 通过“build.fxbuild”构建项目,然后像普通 Java 程序一样导出
    4. 在启动方法中设置所有图标和照片,从不在其他函数中定义图标或任何照片。

    【讨论】:

      猜你喜欢
      • 2012-08-08
      • 2018-09-25
      • 1970-01-01
      • 2014-06-29
      • 2016-06-01
      • 2012-11-21
      • 2015-01-13
      • 2018-12-18
      • 1970-01-01
      相关资源
      最近更新 更多