jar archiv erstellt, aber nicht zu öffnen

Johannes7146

Goldschnabel
Hallo zusammen.
folgendes Problem.
ich habe in Java in kleineres Prgromm geschrieben (Enwicklungsumgebung: Eclipse).
Habe mir dann mit Ecplise ein Jar-Archiv exportieren lassen.

Dieses möchte ich jetz gerne ausführen (nicht entpacken, das funktioniert einwandfrei)
in dem archi befinden sich folgende dateien:
KmAbrechnung$1.class
KmAbrechnung$2.class
KmAbrechnung$3.class
KmAbrechnung.class
KmAbrechnung.java
.classpath
.project

außerdem ein ordner "META-INF" mit folgenen dateien
MANIFEST.MF
REFACTORING".XML


bei einem einfachem doppelklick erscheint folgende fehlermeldung:
failed to load Main-Class manifest attribute from (dann folgt der pfad und name des aarchives)

der quellcode meines Programmes sieht folgender maßen aus:
Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class KmAbrechnung extends JFrame {
	private static final long serialVersionUID = -6909814504886095068L;

	JButton button_useranlegen;

	JButton button_daten_ausgeben;

	JButton button_buchen;

	JButton button_load;

	JButton button_save;

	JTextField tx_fahrer;

	JTextArea tx_info;

	JTextField tx_beifahrer_1;

	JTextField tx_beifahrer_2;

	JTextField tx_beifahrer_3;

	JTextField tx_beifahrer_4;

	JTextField tx_km;

	JLabel lb_Fahrer;

	JLabel lb_aenderung;

	JLabel lb_beifahrer;

	JLabel lb_info;

	static Hashtable<String, Integer> ht = new Hashtable<String, Integer>();

	public KmAbrechnung() {
		this.getContentPane().setLayout(null);
		this.initWindow();
		this.addWindowListener(new WindowListener() {
			public void windowClosed(WindowEvent arg0) {
			}

			public void windowActivated(WindowEvent e) {
			}

			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}

			public void windowDeactivated(WindowEvent e) {
			}

			public void windowDeiconified(WindowEvent e) {
			}

			public void windowIconified(WindowEvent e) {
			}

			public void windowOpened(WindowEvent e) {
			}
		});
	}
	protected void initWindow() {
		// Instanzieren:
		lb_Fahrer = new JLabel("Fahrer:");
		lb_aenderung = new JLabel("gefahrene KM:");
		lb_beifahrer = new JLabel("Beifahrer:");
		lb_info = new JLabel("Info:");
		tx_fahrer = new JTextField();
		tx_info = new JTextArea();
		tx_beifahrer_1 = new JTextField();
		tx_beifahrer_2 = new JTextField();
		tx_beifahrer_3 = new JTextField();
		tx_beifahrer_4 = new JTextField();
		tx_km = new JTextField();

		button_useranlegen = new JButton("Benutzer anlegen");
		button_daten_ausgeben = new JButton("Kontostände");
		button_buchen = new JButton("Buchen");

		button_useranlegen.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0) {
				button_useranlegenClicked();
			}
		});

		button_buchen.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0) {
				button_buchenClicked();
			}
		});
		// Positionen festlegen
		lb_Fahrer.setBounds(5, 5, 50, 25);
		tx_fahrer.setBounds(5, 35, 270, 25);
		lb_aenderung.setBounds(5, 65, 100, 25);
		tx_km.setBounds(5, 95, 270, 25);
		lb_info.setBounds(5, 200, 100, 25);
		lb_beifahrer.setBounds(350, 5, 100, 25);
		tx_info.setBounds(5, 225, 620, 200);
		button_buchen.setBounds(55, 165, 150, 30);
		button_useranlegen.setBounds(365, 165, 150, 30);
		tx_beifahrer_1.setBounds(350, 35, 270, 25);
		tx_beifahrer_2.setBounds(350, 65, 270, 25);
		tx_beifahrer_3.setBounds(350, 95, 270, 25);
		tx_beifahrer_4.setBounds(350, 125, 270, 25);

		// Elemente dem Fenster hinzufügen:
		;
		this.getContentPane().add(lb_Fahrer);
		this.getContentPane().add(lb_beifahrer);
		this.getContentPane().add(lb_info);
		this.getContentPane().add(tx_fahrer);
		this.getContentPane().add(tx_info);
		this.getContentPane().add(tx_beifahrer_1);
		this.getContentPane().add(tx_beifahrer_2);
		this.getContentPane().add(tx_beifahrer_3);
		this.getContentPane().add(tx_beifahrer_4);
		this.getContentPane().add(lb_aenderung);
		this.getContentPane().add(tx_km);
		this.getContentPane().add(button_useranlegen);
		this.getContentPane().add(button_buchen);
		this.setSize(650, 500);
		button_loadClicked();
	}

	public void button_useranlegenClicked() {
		tx_info.setText("");
		if (ht.containsKey(tx_fahrer.getText())) {
			tx_info.setText("Benutzer bereits vorhanden\n");
		} else {
			if (!tx_fahrer.getText().equals("")) {
				ht.put(tx_fahrer.getText(), 0);
				tx_info.setText("Konto angelegt!\n");
			} else {
				tx_info.setText("Erst Namen eintragen!\n");
			}
		}
		button_daten_ausgebenClicked();
		button_saveClicked();
	}

	public void button_loadClicked() {
		tx_info.setText("");
		BufferedReader in = null;
		String line = null;
		try {
			in = new BufferedReader(new FileReader(
					"T:\\Kleeschulte\\fahrgemeinschaft\\konten.txt"));
			while ((line = in.readLine()) != null) {
				String s;
				s = in.readLine();
				try {
					int i = Integer.parseInt(s);
					ht.put(line, i);
				} catch (NumberFormatException e) {
					tx_info.append("Datei beschädigt\n");
				}

			}
		} catch (FileNotFoundException ex) {
			tx_info.append("Datei nicht gefunden:\n");
		} catch (IOException ex) {
			tx_info.append("IOException, Grund:\n" + ex + "\n");
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (Exception ignored) {

				}
			}
		}
		if (!ht.isEmpty()) {
			Enumeration en = ht.keys();
			while (en.hasMoreElements()) {
				String key = (String) en.nextElement();
				Object val = ht.get(key);
				String a = val.toString();
				tx_info.append("Der Kontostand von " + key + " beträgt :" + a
						+ " km\n");
			}
		} else {
			tx_info.append("Keine Konten erstellt!\n");
		}
	}

	public void button_saveClicked() {
		if (!ht.isEmpty()) {
			Enumeration en = ht.keys();
			try {
				FileWriter fw = new FileWriter(
						"T:\\Kleeschulte\\fahrgemeinschaft\\konten.txt");
				while (en.hasMoreElements()) {
					String key = (String) en.nextElement();
					Object val = ht.get(key);
					String a = val.toString();
					fw.write(key + "\n");
					fw.write(a + "\n");
				}
				fw.close();
			} catch (IOException ex) {
				tx_info.append("Fehler: " + ex + "\n");
			}

			tx_info.append("Daten gespeichert!\n");
		} else {
			tx_info
					.append("Es sind keine Konten vorhanden, die gespeichert werden könnten\n");
		}

	}

	public void button_daten_ausgebenClicked() {
		if (!ht.isEmpty()) {
			Enumeration en = ht.keys();
			while (en.hasMoreElements()) {
				String key = (String) en.nextElement();
				Object val = ht.get(key);
				String a = val.toString();
				tx_info.append("Der Kontostand von " + key + " beträgt :" + a
						+ " km\n");
			}
		} else {
			tx_info.append("Keine Konten erstellt!\n");
		}
	}

	public void button_buchenClicked() {
		tx_info.setText("");
		int beifahrer = 0;
		StringBuffer ausgabe = new StringBuffer();
		String s = "";
		int km;

		if (ht.containsKey(tx_fahrer.getText())) {
			try {
				s = tx_km.getText();
				km = Integer.parseInt(s);
				s = "";
				int falscherName = 0;
				// Bearbeitung der Konten der Beifahrer
				// Beifahrer1
				if (!tx_beifahrer_1.getText().equals("")) {
					if (ht.containsKey(tx_beifahrer_1.getText())) {
						int alt;
						beifahrer += 1;
						alt = ht.get(tx_beifahrer_1.getText());
						alt = alt - km;
						ht.remove(tx_beifahrer_1.getText());
						ht.put(tx_beifahrer_1.getText(), alt);
					} else {
						tx_info
								.append("Dem Namen des 1. Beifahrers konnte kein Konto zugeordnet werden \n");
						ausgabe.append(s);
						falscherName += 1;
					}
				}
				// Beifahrer2
				if (!tx_beifahrer_2.getText().equals("")) {
					if (ht.containsKey(tx_beifahrer_2.getText())) {
						int alt;
						beifahrer += 1;
						alt = ht.get(tx_beifahrer_2.getText());
						alt = alt - km;
						ht.remove(tx_beifahrer_2.getText());
						ht.put(tx_beifahrer_2.getText(), alt);
					} else {
						tx_info
								.append("Dem Namen des 2. Beifahrers konnte kein Konto zugeordnet werden \n");
						ausgabe.append(s);
						falscherName += 1;
					}
				}

				// Beifahrer3
				if (!tx_beifahrer_3.getText().equals("")) {
					if (ht.containsKey(tx_beifahrer_3.getText())) {
						int alt;
						beifahrer += 1;
						alt = ht.get(tx_beifahrer_3.getText());
						alt = alt - km;
						ht.remove(tx_beifahrer_3.getText());
						ht.put(tx_beifahrer_3.getText(), alt);
					} else {
						tx_info
								.append("Dem Namen des 3. Beifahrers konnte kein Konto zugeordnet werden \n");
						ausgabe.append(s);
						falscherName += 1;
					}
				}
				// Beifahrer4
				if (!tx_beifahrer_4.getText().equals("")) {
					if (ht.containsKey(tx_beifahrer_4.getText())) {
						int alt;
						beifahrer += 1;
						alt = ht.get(tx_beifahrer_4.getText());
						alt = alt - km;
						ht.remove(tx_beifahrer_4.getText());
						ht.put(tx_beifahrer_4.getText(), alt);
					} else {
						tx_info
								.append("Dem Namen des 4. Beifahrers konnte kein Konto zugeordnet werden \n");
						ausgabe.append(s);
						falscherName += 1;
					}
				}
				// Kontostand des Fahrers bearbeiten
				int alt = ht.get(tx_fahrer.getText());
				alt = alt + (km * beifahrer);
				ht.remove(tx_fahrer.getText());
				ht.put(tx_fahrer.getText(), alt);
				// Ausgabe in die Infobox
				if (falscherName == 0 && beifahrer == 0) {
					tx_info
							.append("Bitte tragen sie mindestens einen Beifahrer ein\n");
				}
				if (beifahrer != 0 && falscherName != 0) {
					tx_info
							.append("Es wurden nur die gültigen Konten bearbeitet...\nBuchung erfolgt!\n");
				}
				if (beifahrer != 0 && falscherName == 0) {
					tx_info.append("Buchung erfolgt!\n");
				}
				if (beifahrer == 0 && falscherName != 0) {
					tx_info
							.append("Da keinem der angegebenen Namen ein gültiges Konto zugeordnet werden konnte,\nist keine Buchung erfolgt!\n");
				}

				// tx_info.setText(s + s2);
			} catch (NumberFormatException e) {
				tx_info
						.append("Das Feld \"gefahrene KM\" akzeptiert nur Zahleneingaben und darf nicht leer sein\n");
			}
		} else {
			// hier die ausgabe wenn kein erlaubter fahrer vorhanden
			tx_info.append("Bitte geben Sie einen gültigen Fahrer an\n");
		}
		button_daten_ausgebenClicked();
		button_saveClicked();
	}
}

Das programm lässt sich ohne Probleme aus der Ecplise umgebung heraus starten und wirft keinerlei Execption.

Ich arbeite Unter windos XP Professional.
wünschenswärt wäre wenn sich das jar file nachher nicht nur unter Windows sonder auch unter anderen OS öffnen lässt (Java => Plattformunabhängigkeit) ist aber vorerst nicht unbedingt notwendig.

Vielen Dank für eure Hilfe
gruß Johannes

ich hoffe ich habe alle wichtigen infos genannt
 
Moin!
Sieht wohl so aus, als würde die Klasse mit der main Methode nicht gefunden. Und auch in deinem Quellcode kann ich auch keine solche Methode finden.. Also, wo hast du die versteckelt? ;)

*grüssle*
MeinerEiner
 
*g*

so etwas in der richtung habe ich mir schon gedacht!
um ganz ehrlich zu sein!
ich hab keiner geschrieben, da ich nciht wusste, was dort genau hinein soll:
was mich sehr wundert, da das Prgrommm trotzdem läuft.
das hier ist meine erste übungaufgabe, die eine Fensteranwendung und keine Konsolenanwedung ist!

Daher dachte ich das es daran liegen könnte, dass die Main-methode überlfüssig ist!


edit: habe gerade eine leere main-methode ergänzt:
das ergebniss war leider das selbe......
 
Zuletzt bearbeitet:
Es ist ne Weile her, seit ich zuletzt Eclipse genutzt habe, aber Eclipse scheint sich ja wohl an der fehlenden main Methode nicht zu stören..
Aber das jar- Archiv benötigt eine, wenn es gestartet werden soll.
Soweit ich dein Programm überblicke, müsste in dieser Methode nur ein KmAbrechnung Objekt erstellt werden, und dieses dann auch sichtbar (setVisible(true)) gestellt werden.

In der Manifest Datei muss sich dann auch ein Eintrag "Main-Class" befinden, in dem eben die Klasse mit der Main Methode angegeben ist. Bei der Erstellung des Archivs über Eclipse kann man das aber mit angeben..

*grüssle*
MeinerEiner
 
also...

ich habe folgendes ergänzt:

Code:
public static void main(String[] args) {
		KmAbrechnung a = new KmAbrechnung();
		a.setVisible(true);
	}

leider keinen Erfolg geerntet.... :mad:

auch unter den einstellungen habe ich nichts passendes gefunden.
 
Zuletzt bearbeitet:
Zurück