2015-05-09 4 views
18

Ich entwickle JavaFx-Anwendung in Netbeans, in Netbeans das Projekt ist im Aufbau und läuft gut.Einige Szene nicht laden nach Maven Build

Ich machte einen Build (MVN-Paket) von meinem Projekt, es ist ohne Fehler beendet, aber wenn ich das Programm starte, lädt es nicht alle Szenen und der FXMLLoader wird mit Null-Wert in diesen Fällen zurückgegeben.

Alle .fxml-Datei im selben Ordner.

public class JavaFXApplication extends Application { 

    public static final String TOOLBAR_MAIN = "toolbarMain"; 
    public static final String TOOLBAR_MAIN_FXML = "/fxml/ToolbarMain.fxml"; 
    public static final String TOOLBAR_SUB = "toolbarSub"; 
    public static final String TOOLBAR_SUB_FXML = "/fxml/ToolbarSub.fxml"; 

    public static final String NEW_SESSION_PANEL = "newSession"; 
    public static final String NEW_SESSION_PANEL_FXML = "/fxml/NewSessionPanel.fxml"; 
    public static final String OPEN_SESSION_PANEL = "openSession"; 
    public static final String OPEN_SESSION_PANEL_FXML = "/fxml/OpenSessionPanel.fxml"; 
    public static final String CONNECTIONS_PANEL = "connections"; 
    public static final String CONNECTIONS_PANEL_FXML = "/fxml/ConnectionsPanel.fxml"; 
    public static final String LOGS_PANEL = "logs"; 
    public static final String LOGS_PANEL_FXML = "/fxml/LogsPanel.fxml"; 
    public static final String EXCEPTIONS_PANEL = "exceptions"; 
    public static final String EXCEPTIONS_PANEL_FXML = "/fxml/ExceptionsPanel.fxml"; 
    public static final String MESSAGES_PANEL = "messages"; 
    public static final String MESSAGES_PANEL_FXML = "/fxml/MessagesPanel.fxml"; 

    public static ScreensController menuContainer = new ScreensController(); 
    public static ScreensController contentContainer = new ScreensController(); 

    public static ServerService server = new ServerService(); 

    public static Stage STAGE; 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     STAGE = primaryStage; 

     primaryStage.setOnCloseRequest((WindowEvent t) -> { 
      if (server.isRunning()) { 
       server.cancel(); 
      } 
     }); 

     menuContainer.loadScreen(JavaFXApplication.TOOLBAR_MAIN, 
       JavaFXApplication.TOOLBAR_MAIN_FXML); 
     menuContainer.loadScreen(JavaFXApplication.TOOLBAR_SUB, 
       JavaFXApplication.TOOLBAR_SUB_FXML); 

     contentContainer.loadScreen(JavaFXApplication.NEW_SESSION_PANEL, 
       JavaFXApplication.NEW_SESSION_PANEL_FXML); 
     contentContainer.loadScreen(JavaFXApplication.OPEN_SESSION_PANEL, 
       JavaFXApplication.OPEN_SESSION_PANEL_FXML); 
     contentContainer.loadScreen(JavaFXApplication.NEW_SESSION_PANEL, 
       JavaFXApplication.NEW_SESSION_PANEL_FXML); 
     contentContainer.loadScreen(JavaFXApplication.CONNECTIONS_PANEL, 
       JavaFXApplication.CONNECTIONS_PANEL_FXML); 
     contentContainer.loadScreen(JavaFXApplication.LOGS_PANEL, 
       JavaFXApplication.LOGS_PANEL_FXML); 
     contentContainer.loadScreen(JavaFXApplication.EXCEPTIONS_PANEL, 
       JavaFXApplication.EXCEPTIONS_PANEL_FXML); 
     contentContainer.loadScreen(JavaFXApplication.MESSAGES_PANEL, 
       JavaFXApplication.MESSAGES_PANEL_FXML); 
     menuContainer.setScreen(JavaFXApplication.TOOLBAR_MAIN); 
     contentContainer.setScreen(JavaFXApplication.NEW_SESSION_PANEL); 

     SplitPane root = new SplitPane(); 

     root.getItems().addAll(menuContainer, contentContainer); 
     Scene scene = new Scene(root); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
     primaryStage.setResizable(false); 
     primaryStage.setTitle("Exam Supervisor"); 

    } 

Bildschirm-Controller, wo die Bildschirme geladen:

public class ScreensController extends StackPane { 

    private HashMap<String, Node> screens = new HashMap<>(); 

    public void addScreen(String name, Node screen) { 
     screens.put(name, screen); 
    } 

    public boolean loadScreen(String name, String resource) { 
     try { 
      FXMLLoader myLoader = new FXMLLoader(getClass().getResource(resource)); 
      System.out.println("name:" + name + " ,resource" + resource + " ,loader:" + myLoader.getLocation()); 
      Parent loadScreen = myLoader.load(); 
      ControlledScreen myScreenControler 
        = myLoader.getController(); 
      myScreenControler.setScreenParent(this); 
      addScreen(name, loadScreen); 
      return true; 
     } catch (Exception e) { 
      System.out.println("name: " + name + ", resource" + resource + " ,exception: " + e.getMessage()); 
      return false; 
     } 
    } 

    public boolean setScreen(final String name) { 

     if (screens.get(name) != null) { 
      final DoubleProperty opacity = opacityProperty(); 

      if (!getChildren().isEmpty()) { 
       getChildren().remove(0); 
       getChildren().add(0, screens.get(name)); 
      } else { 
       getChildren().add(screens.get(name)); 
      } 
      return true; 
     } else { 
      System.out.println(screens.get(name) + " ,screen hasn't been loaded!\n"); 
      return false; 
     } 

    } 

    public boolean unloadScreen(String name) { 
     if (screens.remove(name) == null) { 
      System.out.println("Screen didn't exist"); 
      return false; 
     } else { 
      return true; 
     } 
    } 
} 

Mein GitHub Repo: https://github.com/eszikk/ExamSuperVisorServer

+0

Sie haben die fxml als Unterordner von Ressourcen: tun Sie die gleiche Struktur in der haben JAR-Datei, die erstellt wird? –

+0

Yes.The Build erstellt/target/classes/fxml Struktur und es enthält alle. Fxml-Dateien. –

+0

Das war nicht was ich gefragt habe. In der * generierten JAR-Datei * befindet sich der fxml-Ordner auf der obersten Ebene oder wurde er unter einem Ressourcenordner abgelegt? –

Antwort

1

Try javafx-maven-plugin Hoffnung zu verwenden, kann es helfen.

+0

In der Regel, wenn jemand eine Prämie auf ihre Frage setzt, suchen sie in der Regel nach mehr Details als ein einfacher Link. Bitte erläutern Sie dem OP, warum Ihr Vorschlag helfen wird und auf welche Art und Weise und wie Sie ihn implementieren. Wie es aussieht, ist dies eine schlechte Antwort. – nomistic

+0

Sorry, ich bin neu). Ich hatte ein ähnliches Problem, bevor ich mit diesem Plugin zu packen, vielleicht kann es in diesem Fall helfen. Es ist nur ein Vorschlag. – mremne21

4

Ich schaute in Ihre Netbeans-Projektdateien und die Maven Pom und fand nichts Seltsames. Die Tatsache, dass die Javafx-Bibliotheken nicht im Klassenpfad beider Konfigurationen enthalten sind, sagt mir, dass Sie sie aus der Java-Installation verwenden.

Vielleicht verwenden Sie eine andere Java-Installation von Netbeans und wenn Sie das Maven-Ziel starten. Dann fehlt möglicherweise das fxml-Modul oder es ist kein Java-fx bei der zweiten Installation installiert oder etwas anderes ist nicht kompatibel.

Haben Sie das Maven-Ziel von einer Konsole gestartet? z.B.

java -jar xyz.jar

Versuchen

java -version

und die Version mit der Java-Version von Netbeans (Hilfe> Über) verwendet vergleichen .

Die Erstellung von Netbeans erfolgt über eine interne Maven-Version. Es besteht jedoch auch die Möglichkeit, dass ein externer Maven-Build eine andere Version des Java-Compilers verwendet als der interne NetBeans-Build.

Ich hoffe, dass hilft!

0

Ich habe Ihre Anwendung erfolgreich von außerhalb von Netbeans ausgeführt, nachdem Sie die folgenden Änderungen vorgenommen haben.

Erstens habe ich mich gefragt, warum Sie das Compiler-Plugin haben. Also, ich habe es entfernt und bekam "class file für sun.util.logging.PlatformLogger nicht gefunden" -Fehler während des Builds.

Sie haben über die Frage kommen, wie in JavaFX8 - sun.util.logging.PlatformLogger not found Exception in NetBeans 8

Sie müssen erklären, es zu beheben.

Zweitens, was Sie hatten, war nur die Kompilierphase, nicht ein lauffähiges Glas.

Möglicherweise gibt es eine Möglichkeit, es mit dem Compiler-Plugin zu tun (oder andere abhängige jars im Klassenpfad), aber ich fand es einfacher, das Assembly-Plugin zu verwenden, um ein jar mit allen Abhängigkeiten zu erstellen.

Fügen Sie den folgenden Code zu Ihrem pom.xml

  <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>com.eszik.supervisorserver.main.Main</mainClass> 
        </manifest> 
       </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
     </plugin> 

Als nächstes laufen die beiden mvn separat Befehle.

mvn clean install 
mvn assembly:single 

Und dann java -jar Ziel/SuperVisorServer-1.0-SNAPSHOT-jar-with-dependencies.jar