# YAML + Java: Simpler Code funktioniert nur unter Windows



## jollyroger (22. Feb 2008)

Moin moin,

ich hab hier ein fast schon absurdes Problem:

Ich beschäftige mich gerade etwas mit yaml und der (einzigsten brauchbaren) Java-Implementierung die ich dazu gefunden habe, nämlich jyaml: http://jyaml.sourceforge.net/

Ich gehe nach diesem kurzen Tutorial vor : http://jyaml.sourceforge.net/tutorial.html

Folgendes klappt unter Windows hervorragend:

-> minimales yaml-file erstellt

```
cat /tmp/person.yml
```



```
--- !Person
name: John Smith
age: 37
```

-> Ein simple, entsprechende Klasse namens Person gemacht:


```
public class Person {

	private String name;
	private int age;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}
```

-> Und folgende Test-Main gemacht:


```
public class Yamltest {

	public static void main(String[] args) throws FileNotFoundException {

		// klappt unter windows!
		Person person = Yaml.loadType(new File("K:\\tmp\\person.yml"), 
                					  Person.class);
		System.out.println("name: " + person.getName());
		System.out.println("age: " + person.getAge());
	}
}
```

Funktioniert unter Windows wunderbar!


```
name: John Smith
age: 37
```

Unter Linux (Ubuntu Gutsy) krieg ich hingegen folgende Fehlermeldung (Pfad zum yaml-file natürlich entsprechend angepasst, also statt "K:\\tmp\\person.yml" halt "/tmp/person.yml) :


```
Exception in thread "main" java.lang.ClassCastException: java.util.HashMap cannot be cast to com.meinladen.test.Person
	at com.meinladen.test.Yamltest.main(Yamltest.java:14)
```

-> Die java-version unter Linux ist:


```
java -version
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing)
```

-> Die unter Windows:


```
PS H:\> java -version
java version "1.6.0_02"
Java(TM) SE Runtime Environment (build 1.6.0_02-b06)
Java HotSpot(TM) Client VM (build 1.6.0_02-b06, mixed mode)
```

-> Ich verwende sowohl unter windows als auch Linux eclipse, beide verwenden auch die oben gezeigten JVMs.
-> Ich verwende sowohl unter windows als auch Linux den gleichen workspace, an anderen Bibliotheken usw. kann es also *nicht *liegen.

Ich bin völlig ratlos?

Woran kann das liegen?

Wie kann ich das weiter eingrenzen?


----------



## jollyroger (22. Feb 2008)

Hey ho, 

ich hab mal etwas weitergeforscht und es wird noch komischer:

Ich kann - wie ja schon erwähnt - obiges Beispiel  *nur* unter Windows erfolgreich ausführen und dann aber auch *nur* mit eclipse.

Noch merkwürdiger finde ich folgendes:

Ich möchte mein Yamltest unter Linux über die bash aufrufen mittels:


```
java Yamltest
```

(Yamltest befindet sich zu Testzwecken im Default-package)

Kompilieren lassen hab ich die Klasse von Eclipse.

"Eigentlich" müsste ich jetzt ja erst eine Fehlermeldung kriegen, das er das entsprechende jar-file nicht findet, da dieses *nicht* im Classpath ist und ich ja auch beim Aufruf keinen angegeben habe.

Stattdessen krieg ich aber:


```
java Yamltest
Exception in thread "main" java.lang.ClassCastException: java.util.HashMap cannot be cast to Person
        at Yamltest.main(Yamltest.java:13)
```

Kann sich jemand darauf einen Reim machen?


----------



## jollyroger (27. Mrz 2008)

Ok, 

jyaml Implementierung ist völlig für den Arsch. 
Der Typ sollte sein Projekt am besten aus der Geschichte löschen.

Sorry, aber hier geht gar nichts.

Wenn ich mir ein weiteres einfaches Beispiel aus dem Tutorial nehme und folgendes mache:

Person-Klasse:


```
public class Person {

	   private String name;
	   private int age;
	   
	   public String getName() {
	      return name;
	   }
	   public void setName(String name) {
	      this.name = name;
	   }
	   public int getAge() {
	      return age;
	   }
	   public void setAge(int age) {
	      this.age = age;
	   }
}
```

main:


```
import java.io.File;
import java.io.FileNotFoundException;

import org.ho.yaml.Yaml;

public class YamlTest {

   public static void main(String[] args) throws FileNotFoundException {

	   Person person = new Person();
	   person.setAge(22);
	   person.setName("mofo");
	   Yaml.dump(person, new File("/tmp/object.yml")); 

   }
}
```

Ausführung gibt mir folgenden Fehler:


```
Exception in thread "main" java.lang.NullPointerException
	at org.ho.yaml.YamlConfig.getWrapper(Unknown Source)
	at org.ho.yaml.YamlEncoder.traverseAndCount(Unknown Source)
	at org.ho.yaml.YamlEncoder.writeObject(Unknown Source)
	at org.ho.yaml.YamlConfig.dump(Unknown Source)
	at org.ho.yaml.Yaml.dump(Unknown Source)
	at YamlTest.main(YamlTest.java:13)
```

Da hier nicht mal ein einziges der Tutorial-Beispiele funktioniert, hake ich jYaml als "Müll" ab und gehe in Ermangelung von Alternativen wieder zu XML zurück.

Kurze Anmerkung noch:

Ich habe Respekt vor jedem der umsonst für andere codet. Aber so ein verbuggtes Ding als stable zu markieren, finde ich eine Frechheit, die mich einige Stunden gekostet hat.


----------

