2017-01-24 10 views
1

IntelliJによって構築された.jarファイルを開く際に問題があります。IntelliJによって構築されたjarファイルをJavaで開くことができません。

それが例外をスロー:私はのIntelliJで私のプログラムを実行しようとすると、

Exception in Application start method 
java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389) 
     at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) 
Caused by: java.lang.RuntimeException: Exception in Application start method 
     at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917) 
     at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182) 
     at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.IllegalStateException: Location is not set. 
     at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2434) 
     at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409) 
     at application.MainApp.initRootLayout(MainApp.java:51) 
     at application.MainApp.start(MainApp.java:42) 
     at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) 
     at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) 
     at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) 
     at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
     at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
     at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
     ... 1 more 
Exception running application application.MainApp 

が、(ファイル名を指定して実行] - > [ファイル名を指定して実行「MainAppに」)それは問題なく動作します。 私を助けることができますか?

MainApp.java

package application; 

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Scene; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Modality; 
import javafx.stage.Stage; 
import model.Person; 
import view.PersonEditDialogController; 
import view.PersonOverviewController; 

import java.io.IOException; 

public class MainApp extends Application { 

    private Stage primaryStage; 
    private BorderPane rootLayout; 

    private ObservableList<Person> personData = FXCollections.observableArrayList(); 


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

    public MainApp() throws IOException { 
     personData.add(new Person("Name Surname")); 
     personData.add(new Person("Name Surname")); 
     personData.add(new Person("Name Surname")); 
    } 


    @Override 
    public void start(Stage primaryStage) { 
     this.primaryStage = primaryStage; 
     this.primaryStage.setTitle("My Application Title"); 

     initRootLayout(); 

     showPersonOverview(); 
    } 

    public void initRootLayout() { 
     try { 
      FXMLLoader loader = new FXMLLoader(); 
      loader.setLocation(MainApp.class.getResource("../view/RootLayout.fxml")); 
      rootLayout = (BorderPane) loader.load(); 

      Scene scene = new Scene(rootLayout); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } 
     catch(IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public void showPersonOverview() { 
     try { 
      FXMLLoader loader = new FXMLLoader(); 
      loader.setLocation(MainApp.class.getResource("../view/PersonOverview.fxml")); 
      AnchorPane personOverview = (AnchorPane) loader.load(); 

      rootLayout.setCenter(personOverview); 

      PersonOverviewController controller = loader.getController(); 
      controller.setMainApp(this); 
     } 
     catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public boolean showPersonEditDialog(Person person) { 
     try { 
      FXMLLoader loader = new FXMLLoader(); 
      loader.setLocation(MainApp.class.getResource("../view/PersonEditDialog.fxml")); 
      AnchorPane page = (AnchorPane) loader.load(); 

      Stage dialogStage = new Stage(); 
      dialogStage.setTitle("Edit Person"); 
      dialogStage.initModality(Modality.WINDOW_MODAL); 
      dialogStage.initOwner(primaryStage); 
      Scene scene = new Scene(page); 
      dialogStage.setScene(scene); 

      PersonEditDialogController controller = loader.getController(); 
      controller.setDialogStage(dialogStage); 
      controller.setPerson(person); 

      dialogStage.showAndWait(); 

      return controller.isOkClicked(); 
     } 
     catch (IOException ex) { 
      ex.printStackTrace(); 
      return false; 
     } 
    } 

    public Stage getPrimaryStage() { 
     return primaryStage; 
    } 

    public ObservableList<Person> getPersonData() { 
     return personData; 
    } 

} 
+0

'application.MainApp'実装を含めてください。例外は、 'FXMLLoader'を正しく完全に初期化していないことを示しています。 – Kiskae

+0

ご返信ありがとうございます。私は最初の投稿を編集し、MainAppコード – fafal

答えて

2

それは.jarファイルのコンテキストで呼び出された場合私の推測では、そのMainApp.class.getResource("../view/PersonOverview.fxml") 'null' を返しだろう。これは、例外が場所がないという理由を説明するsetLocation(null)が呼び出されたことを意味します。

リソースローディングは、クラスローダーによって異なる動作をします。 IntelliJ(実行時)では、ハードディスク上のファイルのURIを返しますが、後者の場合は.jar内のファイルにURIを返します。恐らくそれを壊しているのは、資産の相対的な位置( "..")です。

リソースルート( "/view/PersonOverview.fxml")を指定して絶対位置を指定すると、問題が解決する可能性がありますが、テストが必要な場合があります。

+0

を含んでいます。どうもありがとうございました – fafal

関連する問題