# Builder nötig ?



## DefconDev (4. Mai 2018)

Hallo zusammen,

ich habe ein Hobby-Projekt, welches folgende Struktur besitzt:





die roten Felder sind klassische Pakete mit den Klassen.
Im Ordner sind resources wie .properties Dateien in hellblau und das gelbe Feld ist der Ordner für alle .fxml. Ich arbeite mit JavaFX, wenn das relevant ist.

Hinzu kommt, dass ich externe Libs eingebunden habe. Jetzt möchte ich das ganze Projekt so zusammen schnüren, dass ich das als .jar erstellen kann. Bisher ist das nicht möglich weil die Jar nach dem Erstellen keine Pfade mehr findet. Brauche ich jetzt einen Builder um das zu bewerkstelligen oder kann ich auch die Boardmittel von Eclipse verwenden?


----------



## mrBrown (4. Mai 2018)

Der Einsatz eines Build-Tools ist bei sowas generell zu empfehlen, Eclipse kann das aber auch von Haus aus.

Bei Problemen mit Pfaden kann der Fehler aber auch in deinem Programm liegen, welche Pfade findet der denn nicht?


----------



## DefconDev (5. Mai 2018)

Sorry, dass ich erst so spät antworte, war noch arbeiten.


Spoiler: Exception



Exception in Application start method
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        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(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
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$154(LauncherImpl.java:182)
        at java.lang.Thread.run(Unknown Source)
*Caused by: java.util.MissingResourceException: Can't find bundle for base name language.lang, locale ger*
        at java.util.ResourceBundle.throwMissingResourceException(Unknown Source)
        at java.util.ResourceBundle.getBundleImpl(Unknown Source)
        at java.util.ResourceBundle.getBundle(Unknown Source)
        at language.Language.<init>(Language.java:19)
        at matchMakerMain.MatchMaker_Main.start(MatchMaker_Main.java:20)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(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$147(WinApplication.java:177)
        ... 1 more
Exception running application matchMakerMain.MatchMaker_Main



Will ungern die Pfade permanent ändern für die Variante in der IDE und für das Jar.


----------



## DefconDev (5. Mai 2018)

Doppelpost


----------



## mrBrown (5. Mai 2018)

Und welche Pfade sind es, die nicht gefunden werden?



Hades85 hat gesagt.:


> *locale ger*


Wo kommt denn das "ger" her, hast du das irgendwo so angegeben?


----------



## DefconDev (5. Mai 2018)

Achja, das ist in dem hellblauen Feld markiert, in meinem Bild.

Das ist eine Property Datei.


----------



## mrBrown (5. Mai 2018)

Das beantwortet beide Fragen nicht...

*Steht* irgendwo *in deinem Code* "*ger*"?
*Wo* in deinem Code wird *wie welcher Pfad *benutzt?


----------



## DefconDev (5. Mai 2018)

```
package language;

import java.util.Locale;
import java.util.ResourceBundle;

public class Language {
   
    private Locale locale;
    private ResourceBundle bundle;
    public static String currentLanguage;
   
    public ResourceBundle getBundle() {
        return bundle;
    }
   
    public Language(String lang) {
        currentLanguage = lang;
        locale = new Locale(lang);
        bundle= ResourceBundle.getBundle("language.lang",locale);
    }
}
```


```
package matchMakerMain;

import java.util.prefs.Preferences;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import language.Language;


public class MatchMaker_Main extends Application{

    private static final String version = "4.1_16.01.2018";

    @Override
    public void start(Stage stage) throws Exception {
        Preferences pref = Preferences.userNodeForPackage(MatchMaker_Main.class);
       
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/matchMakerView/MatchMaker_MainScene.fxml"), new Language(pref.get("Language","GER")).getBundle());
       
        Parent root = loader.load();
        Scene scene = new Scene(root);
       
        stage.setScene(scene);
        stage.setTitle("AgeMaker "+version+"@Hades85");
        stage.show();
    }

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


----------



## mrBrown (5. Mai 2018)

Der korrekte Local-ID wäre "de_DE", nicht "ger". Könnte damit zusammenhängen.

Kannst du ansonsten die Datei direkt laden, ohne ResourceBundle?


----------



## DefconDev (5. Mai 2018)

Also in Eclipse kann ich die ohne Murksen starten. Das ändern der Local-ID hat aber auch nichts gebracht. Zeigt den selben Fehler an wenn ich das Projekt exportiere.


----------



## mrBrown (5. Mai 2018)

mrBrown hat gesagt.:


> Kannst du ansonsten die Datei direkt laden, ohne ResourceBundle?


----------



## DefconDev (5. Mai 2018)

Das kann ich dir nicht sagen, weil meine FXML-Dateien alle Platzhalter besitzen und die gefüllt werden mit der jeweiligen Language Property. Das heisst ohne ResourceBundle kann ich keine FXML laden.


----------



## mrBrown (5. Mai 2018)

Du sollst ja auch keine fxml laden, sondern die Datei, die nicht gefunden wird.


----------



## DefconDev (5. Mai 2018)

Sorry ich stehe gerade auf dem Schlauch, mit Datei meinst du meine Jar?


----------



## mrBrown (5. Mai 2018)

Der Fehler ist, dass eine Datei nicht gefunden wird: die .properties, mit den entsprechenden Übersetzungen.
Versuch diese mal ganz normal mit getResource zu laden.


----------



## DefconDev (5. Mai 2018)

Der Fehler hat sich doch verändert nachdem ich Locale im Namen geändert habe:


> java.util.MissingResourceException: Can't find bundle for base name queries, locale de_DE
> Exception in Application start method
> java.lang.reflect.InvocationTargetException
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> ...



Jetzt findet er die Property mit meinen DB Querys nicht.


EDIT: private final String ressourcePath = "resources\\queries\\";


----------



## DefconDev (5. Mai 2018)

```
private void loadQueryBundle() {
        try {
            File file = new File(ressourcePath);
            URL[] urls = { file.toURI().toURL() };
            ClassLoader loader = new URLClassLoader(urls);
            queryBundle = ResourceBundle.getBundle("queries", Locale.getDefault(), loader);

        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
```


----------



## mrBrown (5. Mai 2018)

Hades85 hat gesagt.:


> EDIT: private final String ressourcePath = "resources\\queries\\";


Für Pfade immer '/' benutzen.


----------



## mrBrown (5. Mai 2018)

Hades85 hat gesagt.:


> ```
> private void loadQueryBundle() {
> try {
> File file = new File(ressourcePath);
> ...


Sowas geht in jedem Fall schief, warum dieser Umweg über File -> URI -> URL -> ClassLoader?


----------



## DefconDev (5. Mai 2018)

Weil ich ehrlich gesagt keinen anderen Weg sehe? Wieso geht sowas schief?


----------



## mrBrown (5. Mai 2018)

Wenn man URLs braucht, kann man einfach aus dem String eine URL machen, und spart sich File und URI.
Die drei lassen jeweils unterschiedliche Zeichen zu, weshalb es da zu Problemen kommen wird.


Allerdings braucht man an der Stelle keinen ClassLoader, man kann einfach den passenden Pfad übergeben.
Aus den spärlichen Informationen hier würde ich auf "queries.queries" tippen. (die properties-Datei heißt queries und liegt im Ordner queries in resources?)


----------



## DefconDev (5. Mai 2018)

```
private void loadQueryBundle() {
        try {
//            File file = new File(ressourcePath);
//            URL[] urls = { file.toURI().toURL() };
//            ClassLoader loader = new URLClassLoader(urls);
//            queryBundle = ResourceBundle.getBundle("queries", Locale.getDefault(), loader);
            String filename = "queries/queries.properties";
            InputStream input = Database.class.getClassLoader().getResourceAsStream(filename);
            prop = new Properties();
           
            prop.load(input);
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
```

Habe das jetzt auf deine Empfehlung hin geändert. Jetzt wird die DB nicht mehr gefunden.


```
Mai 05, 2018 2:54:39 AM database.Database initDatabase
SCHWERWIEGEND: null
org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (no such table: am_view_finalplayerstats)
        at org.sqlite.core.DB.newSQLException(DB.java:909)
        at org.sqlite.core.DB.newSQLException(DB.java:921)
        at org.sqlite.core.DB.throwex(DB.java:886)
        at org.sqlite.core.NativeDB.prepare_utf8(Native Method)
        at org.sqlite.core.NativeDB.prepare(NativeDB.java:127)
        at org.sqlite.core.DB.prepare(DB.java:227)
        at org.sqlite.jdbc3.JDBC3Statement.executeQuery(JDBC3Statement.java:81)
        at database.Database.selectTable(Database.java:172)
        at database.Database.loadPlayer(Database.java:122)
        at database.Database.initDatabase(Database.java:67)
        at database.Database.getInstanz(Database.java:53)
        at mainController.Match_Controller.initialize(Match_Controller.java:55)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.reflect.misc.Trampoline.invoke(Unknown Source)
        at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2566)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
        at javafx.fxml.FXMLLoader.access$2700(FXMLLoader.java:103)
        at javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:1143)
        at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:746)
        at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
        at matchMakerMain.MatchMaker_Main.start(MatchMaker_Main.java:22)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(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$147(WinApplication.java:177)
        at java.lang.Thread.run(Unknown Source)

org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (no such table: am_view_finalplayerstats)
        at org.sqlite.core.DB.newSQLException(DB.java:909)
        at org.sqlite.core.DB.newSQLException(DB.java:921)
        at org.sqlite.core.DB.throwex(DB.java:886)
        at org.sqlite.core.NativeDB.prepare_utf8(Native Method)
        at org.sqlite.core.NativeDB.prepare(NativeDB.java:127)
        at org.sqlite.core.DB.prepare(DB.java:227)
        at org.sqlite.jdbc3.JDBC3Statement.executeQuery(JDBC3Statement.java:81)
        at database.Database.selectTable(Database.java:172)
        at database.Database.loadPlayer(Database.java:122)
        at database.Database.initDatabase(Database.java:67)
        at database.Database.getInstanz(Database.java:53)
        at mainController.Match_Controller.initialize(Match_Controller.java:55)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.reflect.misc.Trampoline.invoke(Unknown Source)
        at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2566)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
        at javafx.fxml.FXMLLoader.access$2700(FXMLLoader.java:103)
        at javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:1143)
        at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:746)
        at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
        at matchMakerMain.MatchMaker_Main.start(MatchMaker_Main.java:22)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(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$147(WinApplication.java:177)
        at java.lang.Thread.run(Unknown Source)
Exception in Application start method
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        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(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
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$154(LauncherImpl.java:182)
        at java.lang.Thread.run(Unknown Source)
Caused by: javafx.fxml.LoadException:
file:/C:/Users/marco/Desktop/Test.jar!/matchMakerView/MatchMaker_MainScene.fxml

        at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2571)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
        at matchMakerMain.MatchMaker_Main.start(MatchMaker_Main.java:22)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(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$147(WinApplication.java:177)
        ... 1 more
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.reflect.misc.Trampoline.invoke(Unknown Source)
        at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2566)
        ... 12 more
Caused by: java.lang.NullPointerException
        at mainController.TreeView_Controller.createTreeViewChilds(TreeView_Controller.java:50)
        at mainController.TreeView_Controller.<init>(TreeView_Controller.java:26)
        at mainController.Main_Controller.initialize(Main_Controller.java:33)
        ... 22 more
Exception running application matchMakerMain.MatchMaker_Main
```


----------



## mrBrown (5. Mai 2018)

Dann gibt es wohl diese Tabelle nicht... was soll man denn sonst dazu sagen?


----------



## DefconDev (5. Mai 2018)

mrBrown hat gesagt.:


> Dann gibt es wohl diese Tabelle nicht... was soll man denn sonst dazu sagen?


Der Inhalt der DB wurde beim Exportieren nicht kopiert, warum auch immer. Hätte gestern Nacht darauf wetten können dass es nicht an der Tabelle liegt...Dachte mit SQL Error findet er die DB nicht.
Jedenfalls klappt es jetzt, das Programm kann jetzt gestartet werden.

Wie kann ich denn jetzt bewerkstelligen dass die externen Libs mit auf Github/Gitlab landen?

Ich danke dir vielmals dass du bis in die Puppen gestern, dir die Zeit und GEDULD genommen hast mir zu helfen.


----------



## mrBrown (5. Mai 2018)

Hades85 hat gesagt.:


> Wie kann ich denn jetzt bewerkstelligen dass die externen Libs mit auf Github/Gitlab landen?


Dafür würde man üblicherweise ein Build-Management-Tool wie Maven oder Gradle nutzen, damit sie eben nicht im eigene Repo landen müssen.

Wenn man das nicht will: jars mit ins Repo und adden.


----------

