Runnable jar nur bedingt ausführbar

stan0043

Grünschnabel
Hallo liebe Community,

ich habe ein kleines Java Tool geschrieben, mit dem man mittels kleiner GUI KML-Dateien erzeugen kann. Bevor diese GUI geöffnet wird, gibt es noch einen kleinen Zusatzdialog, in dem nach Benutzernamen und Passwort gefragt wird.

In der Entwicklungsumgebung funktioniert alles einwandfrei, auch beim Debuggen gibt es keine Fehlermeldung. Will ich aber die .jar mittels Doppelklick starten, geht zwar der Abfragedialog wegen Nutzer/Passwort auf, dann passiert aber nichts weiter.

Ähnliches habe ich, wenn ich das Programm über die Konsole starte mittels java -jar Name.jar. Auch hier geht der Abfragedialog auf, dann kommt die Fehlermeldung:

Exception in thread "main" java.lang.NullPointerException at .de.Main.<init>(Main.java:29) at de.Main.main.(Main.java:40)

Das ist alles und bisher wurde ich leider nicht schlau daraus. Habe auch schon versucht, auf alle möglichen Arten die .jar zu erstellen, das bringt aber alles nichts. Ich benutze aktuell Java Eclipse 3.6.2.

Vielleicht weiss jemand etwas darüber? Ich würd mich freuen! :)

stan0043
 
Hi stan0043 und Herzlich Willkommen bei Tutorials,

wegen deinem Problem würde ich dir mal vorschlagen, dass du in deiner Main-Klasse mal in die Zeile 40 schaust. Weil genau das geht aus der Exception hervor, dass dort ein Wert 'null' ist, der nicht 'null' sein sollte.

Gruß

Fabio
 
Hallo sheel,

hier mal der Code:

package de;
import java.awt.Dimension;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;


public class Main extends JFrame {
/**
* Serial UID.
*/
private static final long serialVersionUID = 7616005228338295773L;
final static JFrame frame = new JFrame("JDialog Demo");

/* login password */
public static String log = "";


public Main() {

final MainPanel main = new MainPanel(log);
setLayout(null);
setContentPane(main.getComponent());

setSize(310, 700);
setMinimumSize(new Dimension(310, 700));
setTitle("KML-Tool");
setIconImage(getIcon("/de/icon/Mast.png").getImage());
}

public static void main(String args[]) {
// (new Main()).setVisible(true);

LoginDialog loginDlg = new LoginDialog(frame);
loginDlg.setVisible(true);
// if login successfully open main window
if(loginDlg.isSucceeded()){
log = loginDlg.getPassword();
(new Main()).setVisible(true);
}
}


/**
* Gets an resource icon.
*
* @param pResource resource path
* @return image icon, <code>null</code> if the resource is not found
*/
public static ImageIcon getIcon(final String pResource) {
URL url;
if (pResource.charAt(0) == '#') {
url = Main.class.getResource("/de/"
+ pResource.substring(1));
} else {
url = Main.class.getResource(pResource);
}
if (url != null) {
return new ImageIcon(url);
}
return null;
}
 
SORRY!

Java:
package de;
import java.awt.Dimension;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;


public class Main extends JFrame {
	/**
	 * Serial UID.
	 */
	private static final long serialVersionUID = 7616005228338295773L;
    final static JFrame frame = new JFrame("JDialog Demo");

    /* login password */
    public static String log = "";

	
	public Main() {

		final MainPanel main = new MainPanel(log);
		setLayout(null);
		setContentPane(main.getComponent());

		setSize(310, 700);
		setMinimumSize(new Dimension(310, 700));
		setTitle("KML-Tool");
		setIconImage(getIcon("/de/icon/Mast.png").getImage());
	}

	public static void main(String args[]) {
//		(new Main()).setVisible(true);

		LoginDialog loginDlg = new LoginDialog(frame);
		loginDlg.setVisible(true);
		// if login successfully open main window
		if(loginDlg.isSucceeded()){
			log = loginDlg.getPassword();
			(new Main()).setVisible(true);
		}
	}


	 /**
     * Gets an resource icon.
     *
     * @param pResource resource path
     * @return image icon, <code>null</code> if the resource is not found
     */
    public static ImageIcon getIcon(final String pResource) {
        URL url;
        if (pResource.charAt(0) == '#') {
            url = Main.class.getResource("/de/icon/"
                    + pResource.substring(1));
        } else {
            url = Main.class.getResource(pResource);
        }
        if (url != null) {
            return new ImageIcon(url);
        }
        return null;
    }
}

stan0043
 
Es hängt jedenfalls mit dem Icon zusammen, das ich im MainWindow nutzen möchte. Kommentiere ich den Quellcode aus, funktioniert es. Habe auch eben in Funktion "getIcon" den Befehl:

Java:
url = Main.class.getResource("/de...

um "/de/icon" erweitert, das ists aber leider auch nicht.
 
Ja dann ist ja alles Klar.
Du kopierst das Programm aus dem Entwicklungsordner raus, dann wird das Bild nicht mehr gefunden.

try-catch wäre Übrigens nicht verkehrt, auch wenn es trotzdem wieder ausgibt.

Gruß

PS: Das Bild ist doch ausserhalb des Jars, oder?
 
Hallo sheel,

Das bild habe ich über Import/File System in das Package "de" geholt. Es liegt dort sowohl im Verzeichnis "bin/de/icon/" als auch im Ordner "src/de/icon". Deswegen hätt ich jetzt erwartet, dass das bild mit in die .jar exportiert wird. Falsch?
 
Kenn mich mit Eclipse nicht so wirklich aus.

Aber das kann man einfach überprüfen:
Die Jar sollte sich mit jedem Packprogramm wie eine Zip-Datei entpacken lassen.
Schau einfach nach, ob das Bild drin ist.
 
Zurück