externe Properties datei aus Jar File heraus lesen

Dieses Thema im Forum "Allgemeine Java-Themen" wurde erstellt von Guest, 9. Feb. 2009.

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. Guest

    Guest Guest

    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
     
  2. diggaa1984

    diggaa1984 Aktives Mitglied

  3. Gast

    Gast Guest

    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 ?
     
  4. diggaa1984

    diggaa1984 Aktives Mitglied

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

    Gast Guest

    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.
     
  6. diggaa1984

    diggaa1984 Aktives Mitglied

    mit dem einbinden is immer sone sache, da stolper ich auch nochmanchmal über diverse steine :D
     
  7. Gast2

    Gast2 Guest

    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
     
  8. diggaa1984

    diggaa1984 Aktives Mitglied

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

    Gast Guest

    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?
     
  10. Gast2

    Gast2 Guest

    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 (Text):
    BufferedReader br = new BufferedReader(new FileReader("data/" + name + ".txt"));
    hier befindet sich die Datei (relativ) in einem Unterverzeichnis von der JAR-Datei

    Code (Text):
    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
     
  11. Guest

    Guest Guest

    Hier einmal meine Fehlermeldung:

    Code (Text):


    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 (Text):


    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...
     
  12. Gast

    Gast Guest

    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 ...
     
  13. mvitz

    mvitz Neues Mitglied

    Über den Klassloader hilft es sonst auch die Datei in den Classpath aufzunehmen und nur über den Namen zu referenzieren.
     
Die Seite wird geladen...
Status des Themas:
Es sind keine weiteren Antworten möglich.