"wo bin ich" Experiment

Status
Nicht offen für weitere Antworten.

richardkrieger

Aktives Mitglied
Hallo,

es geht um den absoluten Pfad zum JAR.

habe geglaubt, dass "user.dir" Ordner ist, wo mein jar liegt. Dann festgestellt, dass es nicht so ist. Im API steht auch "current directory". Das heisst wirklich "current directory" und nicht "current jar directory". :)

Habe hier im Forum gesucht und leider nix gefunden, was funktioniert. Anscheinend haben viele das Problem.

Dann habe ich experimentiert:
Code:
package TestPackage;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.io.File;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Klasse1{
	
	JFrame frame=new JFrame();
	JPanel panel=new JPanel();
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Klasse1();

	}
	
	public Klasse1(){
		frame.setLayout(new BorderLayout());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		panel.setLayout(new GridLayout(0,2));
		try{
		panel.add(new JLabel("System.getProperty(\"user.dir\")"));
		panel.add(new JLabel(System.getProperty("user.dir")));
		panel.add(new JLabel("System.getProperty(\"user.home\")"));
		panel.add(new JLabel(System.getProperty("user.home")));
		panel.add(new JLabel("File(\".\").getAbsolutePath()"));
		panel.add(new JLabel(new File(".").getAbsolutePath()));
		panel.add(new JLabel("File(\".\").getCanonicalPath()"));
		panel.add(new JLabel(new File(".").getCanonicalPath()));
		panel.add(new JLabel("File(\".\").getPath()"));
		panel.add(new JLabel(new File(".").getPath()));
		panel.add(new JLabel("File(\".\").getAbsoluteFile()"));
		panel.add(new JLabel(new File(".").getAbsoluteFile().toString()));
		panel.add(new JLabel("File(\".\").getCanonicalFile()"));
		panel.add(new JLabel(new File(".").getCanonicalFile().toString()));
		panel.add(new JLabel("new File(this.getClass().getCanonicalName()).getAbsolutePath()"));
		panel.add(new JLabel(new File(this.getClass().getCanonicalName()).getAbsolutePath()));
		}catch(IOException ioe){
			ioe.printStackTrace();
		}
		
		
		frame.add(panel);
		frame.pack();
		frame.setVisible(true);
	}
}
Resultat: fest ist nur "user.home". Alles andere NICHT. Hier im Forum wird auch empfohlen "user.home" zu nutzen. Brauche aber trotzdem den Pfad zum JAR.

Habe im API Docu gesucht, auf java.sun.com gesucht - nix. Suchmaschinen auch.

Hat vielleicht jemand was anderes gefunden? Internet ist groß :) Vielleicht habe ich falsche Suchbegriffe benutzt?
 
B

Beni

Gast
Wieso brauchst du den Pfad zum JAR?

Woher willst du überhaupt wissen, dass dein Code in einem JAR ausgeführt wird?

Falls du Ressourcen wie z.B. ein Bild aus dem JAR laden willst: benutze "EineKlasse.class.getResource(...)".
 

foobar

Top Contributor
user.dir liefert dir das aktuelle Verzeichnis. Damit findest du auch die ini-Datei.
 
G

Guest

Gast
richardkrieger hat gesagt.:
ausserhalb von jar liegt z.B. eine ini-datei. die wird nicht nur gelesen, sondern auch noch geschrieben.


Das sollte helfen:
Code:
    public static String getAppDir() throws Exception {
        String clazz = ClassTest.class.getCanonicalName().replace('.', '/') + ".class";
        java.net.URL ur = ClassLoader.getSystemClassLoader().getResource(clazz);

        String tmp = ur.toString();

        tmp = tmp.substring(0, tmp.length() - clazz.length() - 1);
        if (tmp.startsWith("jar:")) {
            tmp = tmp.substring(4, tmp.length());
        }
        if (tmp.endsWith("!")) {
            tmp = tmp.substring(0, tmp.length() - 1);
        }

        java.io.File f = new java.io.File(new java.net.URI(tmp));
        if (f.isFile()) {
            f = f.getParentFile();
        }
        return f.getAbsolutePath();
    }

Es liefert den Pfad relativ zur Klasse in der dieser Code steht.

Also wenn die Klasse test.foo.TestClass heisst und in C:\projekt\test\foo\TestClass.class steht dann erhälst du
C:\projekt

oder wenn es im jar liegt in C:\projekt\meinProjekt.jar dann erhälst du auch
C:\projekt
 

richardkrieger

Aktives Mitglied
schon, wenn man in einem Shell-Fenster mit "cd meinprojekt" in den ordner wechselt, wo jar liegt und mit
java -jar jarfile.jar
startet, funktioniert alles wunderbar, ABER:
Mein Linux(Kubuntu), wenn ich aus dem Dateimanager "Öffnen mit..." -> "Sun Java 6 Runtime" wähle, zeigt das programm ganz was anderes. "user.dir" ist plötlich gleich mit "user.home". Im prinzip sind alle gleich mit "user.home".

Vermute, dass bei Windows es auch nicht anders sein wird.
 

Wildcard

Top Contributor
Gerade aus der Linux Welt sollte dir dann doch aber bekannt sein, das der User in der Regel nur in seinem home schreiben darf und das auch dort alle Einstellungen und Konfigurationen abgelegt werden.
Wer führt schon normale Anwendungsprogramme als root bzw. sudoer aus?
 

richardkrieger

Aktives Mitglied
:) wie gesagt, bin selbständiger edv-allrounder und habe schon einiges bei kunden erlebt. möchte, halt, das programm idiotensicher machen. soweit wie möglich idiotensicher :)

ich meine damit mein kunde notfalls alles auf desktop legen kann und es trotzdem funktioniert :)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben