externe Properties datei aus Jar File heraus lesen

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
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
 
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 ?
 
hm na absolute angaben sind eh immer kritisch ... aber die datei liegt quasi nicht im selben ordner wie die jar, sondern irgendwo anders!?
 
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.
 
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
 
lässt aber trotzdem darauf schliessen, das er die datei in dem moment nicht finden kann .. was er ja aber unbedingt möchte 😀
 
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?
 
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

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

Code:
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
 
Hier einmal meine Fehlermeldung:

Code:
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:

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...
 
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 ...
 
Über den Klassloader hilft es sonst auch die Datei in den Classpath aufzunehmen und nur über den Namen zu referenzieren.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben