Datenbank lässt sich un Entwicklungsumgebung öffnen, aus .jar aber nicht

Tharsonius

Bekanntes Mitglied
Hallo zusammen,

ich stehe vor einem Rätsel und hoffe, dass Ihr mir weiter helfen könnt.
Wenn ich mein Programm aus der Entwicklungsumgebung starte, dann funktioniert alles einwandfrei.

Wenn ich aber ein .jar Archiv erstelle, dieses auf den Desktop lege und dann von dort ausführe, dann lässt sich die Datenbank nicht öffnen.

Ich verwende eine HDQL DB, die ich von meinem Programm aus in der selben virtuellen Maschine starte, also NICHT als Server.

Soweit so gut, sollte keine Datenbank vorhanden sein wird normalerweise eine leere angelegt, dies macht die HSQL DB automatisch beim öffnen. Nur leider geht das, wenn ich das .jar starte schon nicht.


Erst mal ein wenig Quellcode zum verdeutlichen des Startvorgangs:

Die planer.java im default package:
Java:
import basis.BasisFenster;

public final class Planer
{
  public final static void main(String[] args)
  {
    BasisFenster basis = new BasisFenster();
    basis.setVisible(true);
  }
}

Ein Auszug aus dem Basisfenster:
Java:
package basis;

import javax.swing.*;
import java.awt.event.*;
import java.io.File;
import basis.programmstart_waechter.*;

public final class BasisFenster
extends JFrame
implements WindowListener, ProgrammstartListener
{
  private static final long serialVersionUID = 1L;
  private Sitzung session;
  private JDesktopPane desktop;
  private Menu menu;

  public BasisFenster()
  {
    super("Turnier- und Armeeplaner - Version " + new Config().getVersionString());
    SingleInstanceController sic = new SingleInstanceController(new File("temp/lock.tmp"), "turnierplaner");
    if (sic.isOtherInstanceRunning())
    {
      System.exit(0);
    }
    else
    {
      sic.registerApplication();
      sic.addProgrammstartListener(this);
    }
    desktop = new JDesktopPane();
    desktop.setDesktopManager(new DefaultDesktopManager());
    setContentPane(desktop);
    session = new Sitzung(this);
    menu = new Menu(this, session);
    setJMenuBar(menu);
    setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
    setSize(1000, 700);
    setLocation(0, 0);
    addWindowListener(this);
  }
  
  ...
}

Ein Auszug aus der Sitzung:
Java:
package basis;

import java.awt.*;
import java.util.Timer;
import javax.swing.JOptionPane;
import basis.db_schnittstelle.*;
import basis.tasks.*;

public final class Sitzung
{
  private BasisFenster basisfenster;
  private DBHandle dbhandle;
  private FensterManager manager;
  private BereichVerwalter verwalter;
  private Timer zeitgeber;

  public Sitzung(BasisFenster basisfenster)
  {
    this.basisfenster = basisfenster;
    manager = new FensterManager(this, basisfenster.getDesktop());
    verwalter = new BereichVerwalter(this, manager);
    dbhandle = new DBHandle();
    zeitgeber = new Timer("Zeitgeber", true);
    zeitgeber.schedule(new StartUpDatabase(this), 300); // hierüber wird die Methode startUpDatabase() aufgerufen
  }

  public final void startUpDatabase()
  {
    DBWaechter waechter = new DBWaechter(dbhandle);
    if(waechter.checkDB() == false)
    {
      showError("000001", "Datenbank ist fehlerhaft oder nicht vorhanden.\nBackup wird erstellt und neue Datenbank wird angelegt.");
      if(waechter.createDB(true) == false)
        showError("000002", "Backup oder neue Datenbank konnte nicht erstellt werden.");
    }
    if(waechter.checkDBUpdate() == false)
    {
      manager.zeigeFenster(new NachrichtFenster(this, "Information", "Datenbank ist nicht aktuell.", "", "Backup wird erstellt und", "Datenbank wird aktualisiert."));
      if(waechter.updateDB(true) == false)
        showError("000003", "Backup konnte nicht erstellt werden oder\nDatenbank konnte nicht aktualisiert werden.");
    }
    dbhandle.open();
  }
  
  ...
}

Ein Auszug aus der DBHandle:
Java:
package basis.db_schnittstelle;

import java.sql.*;

public final class DBHandle
{
  private String verbindung;
  private String user;
  private String passwort;
  private Connection con;
  private boolean open;

  public DBHandle()
  {
    verbindung = "jdbc:hsqldb:file:./db/planer";
    user = "sa";
    passwort = "";
    con = null;
    open = false;
  }

  public final boolean open()
  {
    if(open == true)
      return true;
    try
    {
      Class.forName("org.hsqldb.jdbcDriver");
    }
    catch (Exception e)
    {
      return false;
    }
    try
    {
      con = DriverManager.getConnection(verbindung, user, passwort);
    }
    catch (SQLException e)
    {
      return false;
    }
    open = true;
    return true;
  }

  ...
}

Und zu guter letzt die relevante Methode aus der DBWaechter:
Java:
package basis;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

import basis.db_schnittstelle.DBHandle;

// Aktuell verwendete Datenbankversion: HSQL DB 1.8.0.10

final class DBWaechter
{
  private DBHandle dbhandle;
  
  protected DBWaechter(DBHandle dbhandle)
  {
    this.dbhandle = dbhandle;
  }
  
  protected final boolean createDB(boolean mitbackup)
  {
    if(mitbackup == true)
    {
      Date date = new Date();
      SimpleDateFormat datumsformat = new SimpleDateFormat("yyyy-MM-dd_HHmmss");
      StringBuilder sb = new StringBuilder();
      sb.append("db_backup_create_");
      sb.append(datumsformat.format(date));
      File backup = new File(sb.toString());
      File ordner = new File("db");
      if(ordner.exists())
      {
        if(renameDateiOrdner(ordner, backup) == false)
          return false;
      }
    }
    else
    {
      File ordner = new File("db");
      if(ordner.exists())
      {
        if(deleteDateiOrdner(ordner) == false)
          return false;
      }
    }
    File ordnerneu = new File("db");
    ordnerneu.mkdir();
    if(dbhandle.open() != true)
      return false;
    new File("fff").mkdir(); // Testzeile
    // jetzt Datenbanktabellen anlegen und Initialeinträge erstellen
    return dbhandle.close();
  }
  
  ...
}


Wenn ich das jar erstelle habe, dann läuft das ganze Programm soweit korrekt, dass der Ordner db (im DBWaechter) angelegt wird. Das dbhandle.open() aber geht schief, die Testzeile wird NICHT ausgeführt.

Das passiert aber nur, wenn ich das .jar erstellt habe. Aus der Entwicklungsumgebung wie gesagt läuft das alles vollkommen fehlerfrei.


Als Entwicklungsumgebung verwende ich Eclipse.

In meinem Projektordner habe ich einen Unterordner lib, dort liegt die hsqldb.jar.
Diese hsqldb.jar habe ich in meinem Projekt eingefügt und sie wird Java Build Path korrekt angezeigt.

In meiner Klassenstruktur wird die hsqldb.jar als Referenced Libraries angezeigt.


Wenn ich jetzt eine .jar meines projekts erstelle, dann verwende ich die Exportfunktion unter Eclipse.
Export-> Jar File
Ich wähle den src Ordner und den lib Ordner aus, den bestehenden db Ordner wähle ich ab, weil die ja entsprechend angelegt werden soll.
Ich klicke die meisten Einstellungen einfach weiter, lasse ein manifest file generieren und wähle die Klasse mit meiner Main aus. Dann generiere ich das .jar, es gibt keine Fehler.

Und wenn ich das .jar nun starte, dann öffnet sich das Fenster, ganz normal, gibt eine Warnung aus, dass keine DB da ist und eine erstellt wird (vollkommen korrekt) und danach kommt eben mein fehler, dass die DB nicht erstellt werden kann.

Ich habe auch testweise meine Testdatenbank dorthin kopiert, dann erkennt meine Check routine, dass eine da ist, die Verbindung wird aber dennoch nicht geöffnet.


Hat da irgendjemand eine Idee woran das liegen kann? Bin da völlig ratlos.
 

Tharsonius

Bekanntes Mitglied
Ich habe bereits unter Eclipse in den Einstellungen des Projekts-> Run/Debug Settings
die Einstellungen für Planer geändert. Dort kann ich den Class Path angeben, dort hatte ich die hsqldb.jar als User Entry hinzugefügt.

Dies hatte ich bereits vor ner ganzen Weile gemacht, ist also aktuell da drin aber es läuft wie gesagt nicht.
Muss ich das noch irgendwo anders eintragen?
 

Michael...

Top Contributor
das gilt dann aber nur für Eclipse. Aber Du willst ja Dein Programm unabhängig aus einer jar heraus starten, d.h. Du musst die neben Deinem jar auch hsqldb.jar zur Verfügung stellen und dann den ClassPath entsprechend setzen. Ich starte meine Programme meistens per batch File und setzen den ClassPath dann entsprechend auf die benötigten jars und Resourcen. Soweit ich weiss kann man den ClassPath aber auch im manifest File definieren.
 

Tharsonius

Bekanntes Mitglied
Die hsqldb.jar stelle ich in soweit zur Verfügung, dass ich die in mein .jar mit rein packe. Sie ist also da... wird aber wohl nicht angesprochen.

Das heißt, ich müsste mir das manifest file generieren lassen, im Workspace speichern und dann entsprechend anpassen?
Werd das mal probieren. Eclipse sagen, dass er die Info beim generieren gleich eintragen soll geht nicht, oder?
 

Tharsonius

Bekanntes Mitglied
Hmmm, ok, das wusste ich nicht...

Umgestellt, hsqldb.jar und meine planer.jar nebeneinander gelegt und es läuft.

Jetzt habe ich nur 2 Dateien, die ich verteilen muss, was wiederum auch unschön ist, hätte gerne eine einzige gehabt... *seufzt*

Immerhin läuft es erstmal.

Vielen Dank.
 

hansmueller

Bekanntes Mitglied
Hallo,

weiß zwar nicht ob es funktioniert, aber du könntest alle Dateien aus der hsqldb.jar entpacken und in deine planer.jar packen. So hättest du nur noch eine jar-Datei.

MfG
hansmueller
 

Tharsonius

Bekanntes Mitglied
Hm, das wäre eine Möglichkeit, aber wirklich toll ist die auch nicht... ich muss mal schauen. So wie es aussieht muss ich sowieso eine JRE mitliefern, weil wohl (entegegen der ursprünglichen Annahme) die nciht garantiert installiert ist...

Dann sinds eh mehrere Dateien, dann macht das auch nix aus. Werd mir da mal eine saubere Dateistruktur überlegen.

Entscheidend war die Tatsache, dass man ein .jar nicht in ein anderes .jar packen kann. Das wusste ich wirklich nicht.... wieder was gelernt.

Danke nochmals für Eure Mühe / Geduld.

Vielleicht kann ich den interessierten unter Euch ja in kürze schonmal eine Vorabversion zum Testen geben ;-) aber eh alles wirklich fertig ist wirds noch dauern.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
8u3631984 Bilder in Datenbank speichern - sinnvoll Allgemeine Java-Themen 5
S Kochbuch bzw. Rezepte-Datenbank app mit Swing..? Allgemeine Java-Themen 5
N relativier Pfad für sqlite-Datenbank in Gradle/IntelliJ Allgemeine Java-Themen 2
Avalon Data Transfer Objekte aus Datenbank erstellen Allgemeine Java-Themen 8
B API Token in Datenbank ablegen? Allgemeine Java-Themen 9
S Einzigartigen String in Datenbank finden und löschen Allgemeine Java-Themen 23
P Datenbank-MiniGUI fügt keine Daten ein Allgemeine Java-Themen 4
Q-bert Strings aus der JList in eine Datenbank speichern Allgemeine Java-Themen 1
Meeresgott Kapselung Tabellen der Datenbank erzeugen. Allgemeine Java-Themen 7
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
looparda Unit Test - Abgänigkeit zur Datenbank isolieren Allgemeine Java-Themen 3
T Datentypen MNIST Datenbank auslesen (.gz) Allgemeine Java-Themen 0
O 2 Combobox in Abhängigkeit von der 1 Combobox (Datenbank) Allgemeine Java-Themen 1
L Daten ohne Datenbank richtig abspeichern Allgemeine Java-Themen 5
M Objekt serialisieren/deserialisieren und in einer SQLite-Datenbank speichern Allgemeine Java-Themen 3
F OOP Datenbank-Klasse überall verfübar Allgemeine Java-Themen 2
R Test Umgebung für Datenbank erstellen, was braucht es? Allgemeine Java-Themen 14
D OOP Design Pattern für GUI - Datenbank Anwendung Allgemeine Java-Themen 1
T Zugriff auf Datenbank Allgemeine Java-Themen 1
G Datenbank von nöten? Allgemeine Java-Themen 7
3 Backup von h2-Datenbank-Datei erstellen Allgemeine Java-Themen 6
S Java DateTime für Datenbank Allgemeine Java-Themen 4
F Alternative sun.jdbc.odbc.JdbcOdbcDriver (Access Datenbank) Allgemeine Java-Themen 2
vandread Daten verschlüsseln mit Java oder Datenbank Allgemeine Java-Themen 15
P MYSQL Datenbank Dump einspielen Allgemeine Java-Themen 1
M SQL Datenbank in JAVA Projekt Allgemeine Java-Themen 3
P iTunes Datenbank manipulieren Allgemeine Java-Themen 2
A Ausführbare Java-Datei aus Projekt und Datenbank Allgemeine Java-Themen 3
T Datenbank oder Filesystem? (E-Learning) Allgemeine Java-Themen 2
N Datei aus Datenbank öffnen mit Standardanwendung Allgemeine Java-Themen 2
J Datenbank und OO-Aufsatz Allgemeine Java-Themen 9
M BufferedReader: Vom Logfile zur Datenbank Allgemeine Java-Themen 6
P Klassen Template-Klasse für Datenbank-Abfragen erstellen Allgemeine Java-Themen 2
E JAVA Alternativen zur Datenbank? Allgemeine Java-Themen 7
Dit_ GeoKoordinaten Datenbank (nicht nur Städte) Allgemeine Java-Themen 6
J Progress Bar während Datenbank Erstellung Allgemeine Java-Themen 2
C Datenbank - Textfiles - Anderes Allgemeine Java-Themen 34
G JNDI/LDAP/Datenbank Allgemeine Java-Themen 2
Meldanor Speichern der Datenbank - Lohnen sich mehrere Threads? Allgemeine Java-Themen 2
hdi [Free Download] Film-Datenbank Allgemeine Java-Themen 30
G Excel-Daten in Datenbank speichern - Problem mit leeren Feldern Allgemeine Java-Themen 7
K von List getSelected auf ResultSet Datenbank löschen Allgemeine Java-Themen 2
C Java Polling, Server Prozedur oder doch Datenbank? Allgemeine Java-Themen 4
H .dbf (IV) Datenbank einlesen Allgemeine Java-Themen 9
D Recipes / Codeschnipsel Datenbank für Java? Allgemeine Java-Themen 3
T MySQl Datenbank als Array ausgeben Allgemeine Java-Themen 11
M Rechenweg in Datenbank speichern und nutzen Allgemeine Java-Themen 6
O viele Datensätze aus Datenbank - Java Heap Space - Excepion Allgemeine Java-Themen 25
E Datenbank/iBatis Fehlermeldung Allgemeine Java-Themen 4
G Datenbank zur laufzeit wechseln Allgemeine Java-Themen 11
N ClassLoader - Laden von Bytecode aus einer Datenbank Allgemeine Java-Themen 6
S Speicherung von Daten: Datenbank(sql) oder xml? Allgemeine Java-Themen 9
F Vector in eine Datenbank speichern? Allgemeine Java-Themen 3
A Problem beim Starten der H2-Datenbank Allgemeine Java-Themen 4
S Datenbank Abfragen mit großen Datenmengen Allgemeine Java-Themen 22
G Datenbank-Anwendung schnell erstellen. Allgemeine Java-Themen 7
P Datenbank Tabelle spiegeln Allgemeine Java-Themen 22
E MySQL-Datenbank <-> HashMap/TreeMap Allgemeine Java-Themen 1
P Zugriff auf die DatenBank Allgemeine Java-Themen 44
H Daten aus MySQL datenbank auslesen und in ArrayList stecken Allgemeine Java-Themen 8
P Timestamp in eine Firebird-Datenbank einfügen Allgemeine Java-Themen 6
P Java Acces Datenbank Problem ! (Brauche eine Abfrage) Allgemeine Java-Themen 5
B Datenbank anlegen Allgemeine Java-Themen 10
N Datenbank vs. Filesystem Allgemeine Java-Themen 5
F datenbank oder csv etc Allgemeine Java-Themen 6
V Brauche Beratung in Sachen Java+Datenbank+Web Allgemeine Java-Themen 8
G Ab wann Datenbank verwenden Allgemeine Java-Themen 15
H sichere Datenbank-Verbindung Allgemeine Java-Themen 4
H Datenbank an ein Java Client Server Programm anschliessen Allgemeine Java-Themen 3
F lizenzfreie Datenbank für JAVA-Anwendung Allgemeine Java-Themen 3
S Zeilenausgabe Datenbank Allgemeine Java-Themen 2
S Datenbank Allgemeine Java-Themen 9
G Sichere Passwortübergabe bei Datenbank Allgemeine Java-Themen 14
L Datenbank Abfrage (Felder&Tabelle nicht fix) in ArrayLis Allgemeine Java-Themen 4
S Java Datenbank auf Festplatte installieren Allgemeine Java-Themen 2
G JComboBox mit Werten aus einer Access Datenbank füllen Allgemeine Java-Themen 18
T Java Application Server + Datenbank von CD Allgemeine Java-Themen 8
G Abfrage in datenbank Allgemeine Java-Themen 5
G Daten aus MySQL-Datenbank an JFreeChart übergeben Allgemeine Java-Themen 3
D Userdaten + Datenbank? Allgemeine Java-Themen 11
G HSQLDB Datenbank-Dateien aus Jar-Datei lesen Allgemeine Java-Themen 5
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
T Projekt baut nicht mehr/lässt sich nicht mehr ausführen Allgemeine Java-Themen 6
O Jar lässt sich auf bestimmten Pc nicht starten Allgemeine Java-Themen 18
M String lässt sich nicht Zusammenfügen Allgemeine Java-Themen 10
T Login lässt App crashen! Allgemeine Java-Themen 14
G Jar lässt sich mit macOS nicht starten Allgemeine Java-Themen 9
S Compiler-Fehler IntelliJ Projektdatei lässt sich nicht erstellen. Allgemeine Java-Themen 15
E GUI.jfm lässt sich nicht mehr öffnen Allgemeine Java-Themen 1
K jar-Datei lässt sich unter Windows nicht verwenden Allgemeine Java-Themen 3
L Jar lässt sich nicht öffnen Allgemeine Java-Themen 12
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
K Java lässt sich nicht Installieren Windows7Ultimate 64Bit Allgemeine Java-Themen 1
L Garbage Collector lässt Programm kurz hängen Allgemeine Java-Themen 10
D swingset3.jnlp lässt sich nicht ausführen Allgemeine Java-Themen 2
F Spiel lässt sich nicht aus GUI starten Allgemeine Java-Themen 5
J setUndecorated lässt GUI "spacken" Allgemeine Java-Themen 52
R Windows-Firewall lässt Java nicht durch Allgemeine Java-Themen 17
N Java lässt sich nicht löschen! Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben