# externe Properties datei aus Jar File heraus lesen



## Guest (9. Feb 2009)

Hallo,

ich würde gern aus einem Jar File eine externe Properties Datei einlesen. Wenn die Datei im jar File liegt klappt alles. Aus Eclipse lässt sich das Programm auch starten. Wenn ich allerdings die properties ausserhalb des Jars platziere, bekomme ich eine NullPointerException.

Ich gebe im Programm des absoluten Pfad zur Datei an: C:/Dokumente und Einstellungen/.....

Muss ich die Datei zusätzlich noch irgenwo einbinden, damit es funktioniert ?

Wie gestaltet sich eine Einbindung ?



VG


----------



## diggaa1984 (9. Feb 2009)

meinst vielleicht sowas hier (letzter beitrag)
ResourceBundle


----------



## Gast (9. Feb 2009)

Ja im Prinzip schon. Jedoch funktioniert es ja bei mir im Eclipse und auch wenn die properties im Jar File liegt. ich denke, es muss auch anders funktionieren, ohne, dass ich meinen Code noch einmal anpassen muss.

Ich muss dem Jar File doch nur sagen, welche datei eingebunden werden soll.

oder sehe ich das falsch ?


----------



## diggaa1984 (9. Feb 2009)

hm na absolute angaben sind eh immer kritisch ... aber die datei liegt quasi nicht im selben ordner wie die jar, sondern irgendwo anders!?


----------



## Gast (9. Feb 2009)

Ich habe ein Verzeichnis auf meinem Desktop mit dem namen Export. Hierin befindet sich die Jar mit allen Libraries und die config.properties. Leider wird diese dann nicht gefunden.


----------



## diggaa1984 (9. Feb 2009)

mit dem einbinden is immer sone sache, da stolper ich auch nochmanchmal über diverse steine


----------



## Gast2 (9. Feb 2009)

Anonymous hat gesagt.:
			
		

> [...]Wenn ich allerdings die properties ausserhalb des Jars platziere, bekomme ich eine NullPointerException.


wenn Du eine NPE bekommst, dann verarbeitest Du einen Fehler der beim Öffnen der properties_Datei auftritt falsch ... das muss noch nicht mal was mit dem Pfad zu tun haben

aber ohne Quellcode kann man nur orakeln

hand, mogel


----------



## diggaa1984 (9. Feb 2009)

lässt aber trotzdem darauf schliessen, das er die datei in dem moment nicht finden kann  .. was er ja aber unbedingt möchte


----------



## Gast (9. Feb 2009)

Vielen Dank für die Unterstützung...

Ja, er findet die datei nicht. das steht zu 100% fest.  meine Frage ist eigentlich ganz einfach: Was muss ich tun, um eine externe properties datei in mein Jar File einzubinden? 

Muss ich hier vielleicht den Classpath in der Mainifest datei eintragen?


----------



## Gast2 (9. Feb 2009)

Gast hat gesagt.:
			
		

> [...]er findet die datei nicht. das steht zu 100% fest.[...]


nein - Du bekommst eine NullPointerException und keine FileNotFoundException ... kläre erstmal warum Du die NPE bekommst ... Du kannst jede Datei normal außerhalb einer JAR als Stream öffnen ... das ist keine Hexerei


```
BufferedReader br = new BufferedReader(new FileReader("data/" + name + ".txt"));
```
hier befindet sich die Datei (relativ) in einem Unterverzeichnis von der JAR-Datei


```
BufferedReader br = new BufferedReader(new FileReader("c:/Dokumente und Einstellungen/$WHATEVER/data/" + name + ".txt"));
```
und nun absolut zur jeder beliebigen Datei

selbst wenn FileReader die Datei nicht findet kommt eine FileNotFoundException!



kläre die NullPointerException und dann kannst Du nochmal behaupten kommen

hand, mogel


----------



## Guest (9. Feb 2009)

Hier einmal meine Fehlermeldung:


```
java.lang.NullPointerException
        at java.util.Properties$LineReader.readLine(Unknown Source)
        at java.util.Properties.load0(Unknown Source)
        at java.util.Properties.load(Unknown Source)
        at dao.Sysproperties.loadProps(Sysproperties.java:103)
        at dao.Sysproperties.<init>(Sysproperties.java:51)
        at dao.Sysproperties.getInstance(Sysproperties.java:65)
        at dao.StoryDAO.<init>(StoryDAO.java:39)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)

        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou
rce)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at java.lang.Class.newInstance0(Unknown Source)
        at java.lang.Class.newInstance(Unknown Source)
        at dao.DAOFActory.getDAO(DAOFActory.java:36)
        at controller.StoryController.<init>(StoryController.java:33)
        at export.Export.main(Export.java:29)
Exception in thread "main" java.lang.NullPointerException
        at java.util.Properties$LineReader.readLine(Unknown Source)
        at java.util.Properties.load0(Unknown Source)
        at java.util.Properties.load(Unknown Source)
        at dao.Sysproperties.loadProps(Sysproperties.java:103)
        at dao.Sysproperties.<init>(Sysproperties.java:51)
        at dao.Sysproperties.getInstance(Sysproperties.java:65)
        at export.XMLCreator.<init>(XMLCreator.java:29)
        at export.Export.main(Export.java:30)
```


mein Code: 


```
public class Sysproperties {

	public final static String PROPERTY_NAME = "C:/dokumente und einstellungen/All Users/Desptop/Exporter/config.properties";


	//Statisches Object speichert eine Instanz der eigenen Klasse
	static Object instance;

	// Properties Object
	static Properties properties; 



	final String config;


	/**
	 * Instanziiert ein Properties-Objekt und stößt den Ladevorgang an.
	 * @param config  Dateiname der Konfigurationsdatei
	 */
	public Sysproperties(String config){

		properties = new Properties();
		this.config = config;

		//Properties Datei laden 
		loadProps();

	}


	/**
	 * Gibt GENAU eine Instanz dieser Klasse zurück.
	 * Sysproperties ist so ein Singleton.
	 * 
	 * @return Instanz der Klasse
	 */
	public static Sysproperties getInstance(String config) {

		if (instance == null) {
			instance = new Sysproperties(config);
		}
		return (Sysproperties) instance;
	}


	/**
	 * Hier werden alle Einstellungen aus der Konfigurationsdatei
	 * in das Properties-Objekt geladen.
	 */
	@SuppressWarnings("unused")
	private boolean loadProperties() {

		boolean data = false;

		try {
			properties.load(new FileInputStream(config));
			data = true;
		} catch (final FileNotFoundException e) {
			System.out.println("Config File konnte nicht gefunden weren oder existiert nicht.");
			data = false;
			e.printStackTrace();
		} catch (final IOException e) {
			System.out.println("Es ist ein Fehler beim Lesen der Config Datei aufgetreten.");
			data = false;
			e.printStackTrace();
		}

		return data;

	}// end of load Properties
	
	
	private boolean loadProps() {

		boolean data = false;
		try
        {
            properties.load(getClass().getClassLoader().getResourceAsStream("config.properties"));
            data = true;
        }
        catch (IOException e)
        {
            //logger.error("Cannot locate axis.properties file", e);
        	data = false;
        }

		

		return data;

	}// end of load Properties



	/**
	 * Gibt einen bestimmten Konfigurationsparameter zurück.
	 * @param aPropertyName Name des Parameters
	 * @return Wert des Parameters
	 */
	public String getPropertyValue(String aPropertyName)
	{

		return properties.getProperty(aPropertyName);

	}


public void setPropertyValue(String value, String aPropertyName){
	
	properties.setProperty(aPropertyName,value );
		
	 try { 
		 properties.store(new FileOutputStream("config.properties"), null);
		} catch (IOException e) { 
			System.out.println("Konnte den Wert in der config.properties nicht ändern!");
		} 

		
	}


}// end of class
```

Ich nutze derzeit die >Funktion loadProps() zum Laden der Properties Datei...


----------



## Gast (9. Feb 2009)

Ja jetzt sehe ich es selbst, merde 

properties.load(getClass().getClassLoader().getResourceAsStream("config.properties")); 

ist quark...

Da muss natürlich PROPERTY_NAME  rein 
Ich hoffe, das is es ...


----------



## mvitz (9. Feb 2009)

Über den Klassloader hilft es sonst auch die Datei in den Classpath aufzunehmen und nur über den Namen zu referenzieren.


----------

