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:
Ein Auszug aus dem Basisfenster:
Ein Auszug aus der Sitzung:
Ein Auszug aus der DBHandle:
Und zu guter letzt die relevante Methode aus der DBWaechter:
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.
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.