# XML-Datei durch Ausführen des JAR-Reciepe bearbeiten



## Gonisch (19. Mrz 2007)

Hallo Leute!

Mein Problem ist folgendes:

Das Programm:
Ich habe ein Programm geschrieben mit dem es möglich ist, Fragen zu irgend einem Thema zu prüfen. Die Fragen werden aus einer XML-Datei gelesen und danach im Programm dargestellt. Es gibt 5 Karteien in meinem Programm, in denen sich die Fragen befinden können (ganz nach dem Fahrschul-Programm von Hotter oder Piccadilly), Ziel ist es so viele Fragen wie möglich in der Kartei 5 zu bringen. Jede Frage kennt die Kartei, in der sie sich befindet. 

Mein Problem nun:
Nach dem Ende der Prüfung soll die XML Datei, in der die Fragen gespeichert sind, aktualisiert werden. Jedoch funktioniert dies nur, wenn ich das Programm unter der Entwicklungssoftware von SUN Microsystems (also Java) starte. Versuche ich ein JAR-Reciepe zu erstellen und führe das Programm vom Reciepe aus, erstellt mir das Programm lediglich eine neue XML-Datei die dann leer ist. Es steht lediglich der Definitionsstring am Anfang der Datei (<?xml = UTF8...) und "[Fragen=null]". Aber wenn ich den Quellcode über Java ausführe aktualisiert er das Dokument reibungslos. :x 

Meine Frage lautet nun: Muss ich ins JAR-Reciepe irgend einen Treiber mit einpacken, damit das XML-Dokument richtig aktualisiert wird? Was kann der Grund für dieses eigenartige, *quellcode-unabhängige* Problem sein?

Vielen Dank im Voraus!


----------



## Wildcard (19. Mrz 2007)

Welche Exception bekommst du?


----------



## Gonisch (19. Mrz 2007)

Leider gar keine. Der Quellcode funktioniert einwandfrei, wenn ich mit der Entwicklungsumgebung von Java (ich hab das NetBeans 3.5) das Programm ausführe. Aber wenn ich es in ein JAR-File auslagern möchte, sodass ich quasi eine EXE-Datei habe, löscht mir das Programm zwar den ganzen Inhalt des XML-Files aber es schreibt keine Daten rein. Es steht nur ein leeres Feld (eben [Fragen=null]).

Warum bloss? Wenn ich das JAR-File mit NetBeans öffne (rechter Mausklick aufs JAR-File und dann "execute") funktioniert wieder alles. Quasi kommts mir vor, als ob NetBeans irgendwelche Pfade oder Treiber kennt, die nicht im JAR-Reciepe enthalten sind.

Das bittere an meinem Problem ist, dass der Quellcode zwar stimmt, aber das Programm als ausgelagerte JAR-Datei trotzdem nicht funzt.

Achja, danke für deinen Beitrag!


----------



## Wildcard (19. Mrz 2007)

Ich denke  schon das du eine Exception bekommst (sofern du keine leeren catch Blöcke hast  :noe: ).
Starte das jar von einer Shell mit java -jar deinejar


----------



## Gonisch (19. Mrz 2007)

Gut, ich muss mal sehen, ob ich wirklich keine leeren catch-blöcke habe. Und wenn meine datei xyz heisst, muss ich sie mit xyz.jar -jar starten?


----------



## Wildcard (19. Mrz 2007)

nein, mit 
java -jar xyz


----------



## Gonisch (19. Mrz 2007)

Du hast recht, er gibt mir eine Exception aus. Aber die e.getMessage() ist leer. Wenn ich mit System.out.println die exception ausgebe, sollte doch in der shell was zu sehen sein oder? bei mir zeigt er aber nichts an. gibs ne andere möglichkeit, fehlermeldungen anzuzeigen?


----------



## Gonisch (19. Mrz 2007)

Mist, die Exception sagt: Null, d.h. es bestätigt nur, was ich schon vermutete, dass im doc-Element bzw. im Root-Element der XML-Struktur nix drinsteht. Aber warum nur wenn ich es im JAR-File ausführe? ich bin ratlos. Der Quellcode ist doch der selbe.... ??? Aber danke für den Tipp mit der shell


----------



## Wildcard (19. Mrz 2007)

Mach stattdessen e.printStackTrace.
Ich vermute jetzt einfach mal:
Du versuchst eine XML die im jar enthalten ist zu lesen und verwendest nicht getResource?


----------



## Gonisch (19. Mrz 2007)

Genial. Auf den Printstack hatte ich schon total vergessen. Hier sehe ich aufgelistet was er fürn problem hat. Ich denke mit deiner vermutung hast du recht. Die shell schreibt nullpointerexception und FileOutputStream.<init> Unknown Source. Ich habe nie ein "getResource" in meinem Programm verwendet. Statt welchen befehl sollte ich das denn benutzen?


----------



## Gonisch (19. Mrz 2007)

Wart mal kurz: Lesen kann ich die XML Datei eh, ich kann die fragen einlesen und sollten dann im RAM enthalten sein. Ich kann die Fragen abrufen, beantworten, aber wenn ich sie dann in die XML Datei zurückspeichern möchte, schreibt er mir nichts rein (eben wegen der Nullpointer Exception)


----------



## Gonisch (19. Mrz 2007)

Schau mal die Stack-Meldung an: http://www.geocities.com/gorinbrecht/Stack.JPG


----------



## Wildcard (19. Mrz 2007)

Ein paar infos deinerseits wären nicht schlecht.
Wo liegt die XML Datei, wie liest du sie ein, wie schreibst du sie raus?


----------



## Gonisch (19. Mrz 2007)

Ja, sorry. Sag mir was du brauchst. Die XML Datei liegt in einem Ordner auf dem Destkop, einlesen per JFileChooser, und diesen Pfad samt Datei speichere ich in einen String damit ich beim speichern nicht extra wieder die gleiche Datei auswählen muss. Rausschreiben tu ich sie mit 

BufferedWriter bw = new BufferedWriter(new FileWriter(f));

Brauchst du noch was?


----------



## Gonisch (19. Mrz 2007)

Erzählt noch mal, wo soll ich das "getRessource" verwenden? Wofür ist das gut?


----------



## Gonisch (19. Mrz 2007)

kannst mi net über icq anschreiben? 296524308


----------



## Wildcard (19. Mrz 2007)

getResource ist nur relevant wenn du versuchst auf Dateien innerhalb des jars zuzugreifen.
Gibt mal etwas Code.


----------



## Gonisch (19. Mrz 2007)

Main-Programm:
JFileChooser jfc = new JFileChooser();
        jfc.showSaveDialog(this);
        XMLSpeichern xmls = new XMLSpeichern();
        xmls.statistikXMLSpeichern(jfc.getSelectedFile());
-----------------------------------------------------------------
XMLSpeichern:
public void statistikXMLSpeichern(File f)
    {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      try
      {
          DocumentBuilder builder = factory.newDocumentBuilder();
          Document doc = builder.newDocument();
          Element root = doc.createElement("Fragen");
          doc.appendChild(root);
          Element eWissensstand = doc.createElement("Wissensstand");
          Text t = doc.createTextNode(Double.toString(Statistik.getInstance().getWissensstand()));
          eWissensstand.appendChild(t);
          root.appendChild(eWissensstand);
          Vector fragen = Fragen.getInstance().getAlleFragen();

          Enumeration enum = fragen.elements();

          int i = 1;

          while (enum.hasMoreElements())
          {
              Frage frage = (Frage) enum.nextElement();
              Element astEbene1 = doc.createElement("Frage"+i);
              frage.frageXMLSpeichern(doc, astEbene1);
              root.appendChild(astEbene1);
              i++;
          }
          System.out.println(i);

          BufferedWriter bw = new BufferedWriter(new FileWriter(f));
          bw.write("<?xml version='1.0' encoding='UTF-8' ?>\n");
          bw.write(doc.getDocumentElement().toString());
          bw.close();
      }
      catch(Exception e)
      {
          e.printStackTrace();
          JOptionPane.showMessageDialog(null,e.getMessage());
      } 
    }
-----------------------------------------------------------------


----------



## Wildcard (19. Mrz 2007)

Es scheint als wäre f null  ???:L 
Prüf das mal.


----------



## Gonisch (23. Mrz 2007)

Hey! Sorry dass ich mich nicht mehr hier gemeldet habe! Aber wenn f null wäre, dann könnte ich doch keine neues File erzeugen dass dann den String <?xml version=.... und [Fragen=null] reinschreibt. oder??


----------

