我在过去几天尝试了很多方法但都没有成功......我已经通过各种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应用程序。
创建工件时,我根据其他线程选择以下内容:
然后我使用以下命令重新运行: Java -jar D:\ Computing \ Executables \ JavaFXGameMenu.jar
我收到以下问题:
我已将相关的环境变量放入我的系统和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);
}
}
答案 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中的位置。