转换为.jar时程序不会运行

时间:2017-09-17 10:28:37

标签: java javafx executable-jar

我在过去几天尝试了很多方法但都没有成功......我已经通过各种Stackoverflow条目进行了搜索并无济于事......我必须遗漏一些东西。

我尝试过三种不同的IDE ...... IntelliJ,Eclispe和Netbeans。

问题是当我试图将我的程序变成可执行的jar时,它无法运行(通过双击或运行命令)。

执行以下命令时:

java -jar D:\ Computing \ Programming \ Java \ Projects \ JavaFXGameMenu \ out \ artifacts \ JavaFXGameMenu_jar \ JavaFXGameMenu.jar

我得到:错误:无法找到或加载主类root.Main

当我运行相同但使用 javaw 时,我得到的不是错误消息,但也没有任何反应。

我主要使用IntelliJ作为我正在构建的JavaFX应用程序。

这是项目层次结构: enter image description here

创建工件时,我根据其他线程选择以下内容:

enter image description here

然后我使用以下命令重新运行: Java -jar D:\ Computing \ Executables \ JavaFXGameMenu.jar

我收到以下问题:

enter image description here

我已将相关的环境变量放入我的系统和Path中,我使用的是jre1.8.0_144。

非常感谢任何有关追踪问题的帮助

下面的代码......但这完全编译并在IDE中运行而没有错误......问题是当它变成.jar并从命令运行时。

package root;

import javafx.application.Application;

import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.effect.DropShadow;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.Window;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;


public class Main extends Application {

    private double width = 1920;
    private double height = 1080;

    private Parent createContent(){
        Pane root = new Pane();
        root.setPrefSize(width, height); //W:860 H:600
        ImageView imgLogo = null;
        ImageView bottomlogo = null;
        MenuItem newGame = new MenuItem("NEW GAME");
        MenuItem continueGame = new MenuItem("CONTINUE");
        MenuItem friends = new MenuItem("FRIENDS");
        MenuItem settings = new MenuItem("SETTINGS");
        MenuItem store = new MenuItem("STORE");
        MenuItem exit = new MenuItem("EXIT");

        try(InputStream is = Files.newInputStream(Paths.get("src/resources/Images/dark.jpg"))) {
            ImageView img = new ImageView(new Image(is));
            img.setFitWidth(width);
            img.setFitHeight(height);
            root.getChildren().add(img);
        } catch (IOException e){
            System.out.println("Couldn't Load Image");
        }

        try(InputStream is = Files.newInputStream(Paths.get("src/resources/Images/logo.png"))) {
            imgLogo = new ImageView(new Image(is));
            imgLogo.setX(1000);
            imgLogo.setY(100);
            imgLogo.setFitWidth(600);
            imgLogo.setFitHeight(300);
        } catch (IOException e){
            System.out.println("Couldn't Load Image");
        }

        try(InputStream is = Files.newInputStream(Paths.get("src/resources/Images/SteamAgony.png"))) {
            bottomlogo = new ImageView(new Image(is));
            bottomlogo.setX(100);
            bottomlogo.setY(800);
            bottomlogo.setFitHeight(200);
            bottomlogo.setFitWidth(200);
            bottomlogo.setOpacity(0.7);
        } catch (IOException e){
            System.out.println("Couldn't Load Image");
        }

        MenuBox menu = new MenuBox(
                newGame,
                continueGame,
                friends,
                settings,
                store,
                exit);

        menu.setTranslateX(width / 3.4);
        menu.setTranslateY(height / 2.5);

        settings.setOnMouseClicked(event -> new SceneCreator().createScene(200,300));

        exit.setOnMouseClicked( event -> Platform.exit());

        root.getChildren().addAll(menu, imgLogo, bottomlogo);

        return root;
    }

    @Override
    public void start(Stage primaryStage) throws Exception{
        Scene scene = new Scene(createContent());
        primaryStage.setScene(scene);
        primaryStage.initStyle(StageStyle.UNDECORATED);
        primaryStage.show();
    }

    @Override
    public void stop(){
        //TODO
    }

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

4 个答案:

答案 0 :(得分:0)

错误发生在Main.createContent第102行。也许您忘记初始化子节点(我并不熟悉JavaFX)。

答案 1 :(得分:0)

您正在添加一个null元素作为Pane的子元素,导致您面临的空指针问题,如果您使用调试器,您将能够找到不应该为null的变量的位置被设置为null。

编辑 - 添加代码后

您在try catch(imageLogo,bottomLogo)中看到2个字段,并且即使它们失败也会添加它们,这会添加空值,从而导致错误。

您使用图像的相对路径,这可能是问题,您是否从项目根运行jar?如果没有,你可以放置绝对路径,但使用资源会更可靠,并允许jar在不同的计算机上运行。

答案 2 :(得分:0)

正如@cedrikk所提到的,问题与您在Main.createContent中的代码有关。

你说问题是在尝试将jar作为可执行文件运行时 - 你尝试在IDE中运行它吗?如果没有 - 您应该尝试,并在其中 - 调试它以帮助您找到问题。只需右键单击Main类并选择debug。

关于使用javaw运行它,没有错误消息的原因是因为javaw在没有控制台的情况下执行java程序 - 除非使用某些日志记录解决方案,否则通常会收到错误消息。

答案 3 :(得分:0)

问题在于声明inputStreams。

这适用于IDE和从jar运行:

    String bgImg = "root/resources/dark.jpg";
    URL bgImgPath = Main.class.getClassLoader().getResource(bgImg);
    ImageView img = new ImageView(new Image(bgImgPath.toExternalForm()));
    img.setFitWidth(width);
    img.setFitHeight(height);
    root.getChildren().add(img);

与之前相比:

try(InputStream is = Files.newInputStream(Paths.get("src/resources/Images/dark.jpg"))){
    ImageView img = new ImageView(new Image(is));
    img.setFitWidth(width);
    img.setFitHeight(height);
    root.getChildren().add(img);
}catch (IOException e) {
    System.out.println("Could not load");
}

路径的更改来自我尝试将资源文件夹添加到根文件夹而不是src中的位置。