2017-01-24 4 views
1

У меня возникла проблема с открытием файла .jar, созданного IntelliJ.Java не может открыть jar, созданный 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 

, но, когда я пытаюсь запустить мою программу с IntelliJ (Run -> Run "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

Мое предположение было бы, что MainApp.class.getResource("../view/PersonOverview.fxml") возвращает «нулевой», если она вызывается в контексте .jar. Это означает, что вызывается setLocation(null), что объясняет, почему исключение говорит, что нет места.

Загрузка ресурсов ведет себя по-разному в зависимости от загрузчика классов. В IntelliJ (с использованием run) он возвращает URI для файла на жестком диске, в то время как он возвращает URI в файл в .jar для последнего случая. То, что, вероятно, нарушает его, - это относительное расположение актива («..»).

При определении абсолютного местоположения с учетом корня ресурса ("/view/PersonOverview.fxml"), вероятно, будет устранена проблема, хотя может потребоваться некоторое тестирование.

+0

Он работает. большое спасибо – fafal

Смежные вопросы