2017-09-17 9 views
-1

J'ai essayé plusieurs méthodes au cours des derniers jours sans succès ... J'ai parcouru plusieurs entrées de Stackoverflow et en vain ... Il me manque quelque chose.Le programme ne fonctionnera pas une fois .jar

J'ai essayé trois IDE différents ... IntelliJ, Eclispe et Netbeans. Le problème est lorsque vous essayez de transformer mon programme en un fichier exécutable impossible à exécuter (en double-cliquant ou en exécutant la commande).

Lors de l'exécution de la commande suivante sur:

java jar D: \ Computing \ Programmation \ Java \ Projects \ JavaFXGameMenu \ out \ objets \ JavaFXGameMenu_jar \ JavaFXGameMenu.jar

je reçois: erreur: Impossible de trouver ou de charger la classe principale root.Main

Quand je lance le même, mais avec javaw place .. i sont pas des messages d'erreur, mais rien ne se passe non plus. Je suis principalement en utilisant IntelliJ comme une application JavaFX que je construis.

C'est la hiérarchie du projet: enter image description here

Lors de la création du Artefact je choisis ce qui suit basé sur d'autres sujets:

enter image description here

Je puis re courir ce à l'aide: Java jar D : \ Computing \ Executables \ JavaFXGameMenu.jar

Je reçois le message suivant:

enter image description here

J'ai mis les variables d'environnement pertinentes dans mon système et le chemin et je suis en utilisant jre1.8.0_144.

Toute aide à traquer ce que le problème pourrait être très apprécié

code ci-dessous ... mais compile entièrement et fonctionne dans IDE sans erreurs ... le problème est lorsque son transformé en .jar et a couru de la commande.

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

Copie possible de [Que signifie "Impossible de trouver ou charger la classe principale" signifie?] (Https://stackoverflow.com/questions/18093928/what-does-could-not-find-or-load-main- class-mean) – Ravi

+0

Pourriez-vous inclure le code qui ajoute l'élément nul – jrtapsell

+0

@Ravi nulle part près du double de cette réponse. C'est l'un des threads que j'ai essayé et aboutit au même problème. – ArcherGilly

Répondre

0

Le problème était de déclarer des entréesStreams.

Cela fonctionne à la fois en IDE et en cours d'exécution du pot:

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); 

Par rapport à ce que j'avais avant:

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"); 
} 

Les modifications des chemins, étaient d'où j'ai essayé d'ajouter la ressource dossier dans le dossier racine au lieu de dans src.

0

L'erreur est à la ligne Main.createContent 102. Peut-être que vous avez oublié d'initialiser le nœud enfant (je ne suis pas vraiment familier avec JavaFX).

0

Vous ajoutez un élément null en tant qu'enfant d'un volet, provoquant le problème de pointeur nul que vous rencontrez, si vous utilisez le débogueur, vous pourrez trouver où la variable qui ne doit pas être null est définie à null.

Edition - après le code ajouté

Vous voyez 2 champs dans les prises d'essayer (imageLogo, bottomLogo), et en les ajoutant même si elles échouent, ce qui ajoute des valeurs nulles, ce qui provoque l'erreur.

Vous utilisez un chemin relatif pour les images, c'est probablement le problème, exécutez-vous le fichier jar à partir de la racine du projet? Si ce n'est pas le cas, vous pouvez définir le chemin absolu, mais l'utilisation des ressources sera plus fiable et permettra au jar de s'exécuter sur différents ordinateurs. Comme mentionné @cedrikk, le problème est lié à votre code dans Main.createContent.

+0

Il compile entièrement dans IDE et il n'y a pas d'élément Null dans l'IDE montrant soit .. ce message d'erreur se produit lors de la transformation en .jar et en passant par la commande. – ArcherGilly

+0

Essayez d'attacher le débogueur à partir du JAR, et passez votre code – jrtapsell

+0

Erreur expliquée – jrtapsell

0

Vous avez dit que le problème est lorsque vous essayez d'exécuter le fichier jar comme un exécutable - avez-vous essayé de l'exécuter dans l'EDI? Si ce n'est pas le cas, vous devriez essayer de le déboguer pour vous aider à trouver le problème. Faites un clic droit sur votre classe principale et choisissez le débogage. En ce qui concerne l'exécution avec javaw, la raison pour laquelle vous n'avez reçu aucun message d'erreur est que javaw exécute des programmes Java sans console - où vous obtiendriez normalement des messages d'erreur à moins d'utiliser une solution de journalisation.

+0

Cela fonctionne parfaitement dans IDE sans erreurs. N'avez-vous pas pensé que j'aurais utilisé le débogage ... cela ne se produit qu'en dehors d'IDE. – ArcherGilly