<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Communardo Techblog &#187; maven2</title>
	<atom:link href="http://www.communardo.de/home/techblog/tag/maven2/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.communardo.de/home/techblog</link>
	<description></description>
	<lastBuildDate>Tue, 21 May 2013 15:37:27 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>HyperJAXB3</title>
		<link>http://www.communardo.de/home/techblog/2010/02/10/hyperjaxb3/</link>
		<comments>http://www.communardo.de/home/techblog/2010/02/10/hyperjaxb3/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 18:24:14 +0000</pubDate>
		<dc:creator>Alexander Stephan</dc:creator>
				<category><![CDATA[JEE]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[ejb3]]></category>
		<category><![CDATA[hyperjaxb3]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jaxb]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[maven2]]></category>

		<guid isPermaLink="false">http://www.communardo.de/home/techblog/?p=3014</guid>
		<description><![CDATA[<p>Im Rahmen eines Projektes sollten XML Mockup Dateien in einer Datenbank gehalten und über eine Webservice-Schnittstelle ausgelesen werden. Für gewöhnlich habe ich aus der XSD per JAXB Java Klassen generiert und in Entity Beans gemappt, die anschließend in die Datenbank geschrieben werden. Um dieses, aus meiner Sicht recht aufwendige und fehleranfällige Mapping in die Entity Beans zu umgehen, habe ich mich nach einem alternativen Framework umgesehen und bin mit Hyperjaxb3 fündig geworden. Hyperjaxb3 geht einen Schritt weiter als JAXB, in dem es die generierten Klassen per Annotation zu vollständigen JPA Entitybeans macht. Aktuell steht Hyperjaxb3 in der Version 0.5.4 unter <a title="https://hyperjaxb3.dev.java.net/" href="https://hyperjaxb3.dev.java.net/" target="_blank">https://hyperjaxb3.dev.java.net</a> zum Download bereit. Unterstützt werden Hibernate und Oracle TopLink, wobei es mit einigen Anpassungen auch mit OpenJPA und EclipseLink funktioniert. Aus meiner Sicht ist aber der Einsatz von OpenJPA (1.2.2) mit Hyperjaxb3 nicht zu empfehlen, da es zu Problemen mit den Relations kam (Es werden keine bidirektionalen Beziehungen unterstützt). Ein weiteres Problem sind die unterschiedlichen Datentypen, da JAXB und JPA nicht vollständig kompatibel sind. Beispiele kann man auf der z.Z. noch etwas lückenhaften Wiki Seite von Hyperjaxb3 finden. <a title="http://confluence.highsource.org/display/HJ3/Home" href="http://confluence.highsource.org/display/HJ3/Home" target="_blank">http://confluence.highsource.org/display/HJ3/Home</a></p>
<p><span id="more-3014"></span></p>
<p>Der große Vorteil dieses Frameworks  ist, dass die Erzeugung der Klassen sehr leicht ins Maven eingebunden werden kann und das das Persistieren nur wenige Zeilen Code nötig macht.</p>
<h3>Einbindung in Maven</h3>
<p>Zum erzeugen der Beans ist eigentlich nur die Dependency für Hyperjaxb3 der bestehenden pom.xml hinzuzufügen:</p>
<p style="padding-left: 30px;text-align: left"><a href="http://www.communardo.de/home/techblog/files/2010/02/maven11.jpg"><img class="alignnone size-full wp-image-3046" src="http://www.communardo.de/home/techblog/files/2010/02/maven11.jpg" alt="" width="432" height="94" /></a></p>
<p style="padding-left: 30px">
<p style="padding-left: 30px">
<p style="padding-left: 30px">
<p>Der Aufruf der Codegenerierung sollte sinnvollerweise in einem Profile-Zweig erfolgen, damit nicht bei jedem Compile die Klassengenerierung neu angestoßen wird.</p>
<p><a href="http://www.communardo.de/home/techblog/files/2010/02/maven21.jpg"><img class="alignnone size-full wp-image-3040" src="http://www.communardo.de/home/techblog/files/2010/02/maven21.jpg" alt="" width="532" height="429" /></a></p>
<p>Die Generierung kann dann per Aufruf des Profiles erfolgen: <em>mvn install -P<code>hyperjaxb</code></em></p>
<p><em><br />
</em></p>
<h3>Objekt erzeugen und persistieren</h3>
<p>In der Anwendung kann dann das Objekt aus dem XML mithilfe des Unmarshallers erzeugt &#8230;</p>
<p><a href="http://www.communardo.de/home/techblog/files/2010/02/unmarshall.jpg"><img class="alignnone size-full wp-image-3041" src="http://www.communardo.de/home/techblog/files/2010/02/unmarshall.jpg" alt="" width="551" height="78" /></a></p>
<p>und vom Entitymanager persistiert werden:</p>
<p><a href="http://www.communardo.de/home/techblog/files/2010/02/persistKunde.jpg"><img class="alignnone size-full wp-image-3042" src="http://www.communardo.de/home/techblog/files/2010/02/persistKunde.jpg" alt="" width="459" height="49" /></a></p>
<p>Optional kann am Unmarshaller noch die Validierung eingeschaltet werden:</p>
<p><a href="http://www.communardo.de/home/techblog/files/2010/02/validierung.jpg"><img class="alignnone size-full wp-image-3043" src="http://www.communardo.de/home/techblog/files/2010/02/validierung.jpg" alt="" width="666" height="104" /></a></p>
<p>Hyperjaxb3 kann bei der Erzeugung von komplexen Datenmodellen aus einer vogegebenen XSD sehr hilfreich sein. Es werden alle Relations, die persistence.xml mit allen nötigen Konfigurationen und die ObjectFactory erzeugt.</p>
 ]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2010/02/10/hyperjaxb3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Standalone Java Applikationen mit Maven</title>
		<link>http://www.communardo.de/home/techblog/2010/01/29/standalone-java-applikationen-mit-maven/</link>
		<comments>http://www.communardo.de/home/techblog/2010/01/29/standalone-java-applikationen-mit-maven/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 11:59:13 +0000</pubDate>
		<dc:creator>Stefan Dieringer</dc:creator>
				<category><![CDATA[JEE]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[appassembler]]></category>
		<category><![CDATA[maven2]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://www.communardo.de/home/techblog/?p=2939</guid>
		<description><![CDATA[<p>Das Bauen und Ausliefern von normalen und eigenständigen Java Anwendungen die nicht in einem Webcontainer oder Applikationserver laufen sollen kann sich als schwierig erweisen. Die größten Probleme beim Erzeugen der Releases sind dabei die folgenden Punkte:</p>
<ul>
<li>es müssen die benötigten Bibliotheken aufgelöst und mit in des Release gepackt werden</li>
<li>die Java Applikation muss in den meisten Fällen auf dem Zielsystem als Dienst laufen (Deamon)</li>
<li>das Erstellen und Packen des Releases sollte automatisiert erfolgen</li>
</ul>
<p>Das Maven 2 Plugin appassembler zielt auf diesen Anwendungsfall ab und ermöglicht</p>
<ul>
<li>das automatisierte Erstellen von Skripten zur einfachen Ausführung der Applikation</li>
<li>das Erzeugen von Releases die es ermöglichen, die Java Anwendung als Dienst zu betreiben</li>
<li>die Erzeugung von Repositories die alle nötigen Bibliotheken für die Anwendung enthalten.</li>
</ul>
<p>Die Konfiguration des Plugins ist aber leider nicht ganz so einfach da  die Dokumentation eher schlecht ist und ich auch auf Bugs im Plugin  selber gestoßen bin. <span id="more-2939"></span></p>
<p>Im Folgenden ist  eine Konfiguration als Beispiel aufgelistet die eine  Deamonapplikation erzeugt.  Um die Applikation als Dienst betreiben zu können wird vom Plugin  der weit  verbreitete Java Service Wrapper eingesetzt.</p>
<h2>Beispielkonfiguration</h2>
<pre>&lt;plugin&gt;
 &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
 &lt;artifactId&gt;appassembler-maven-plugin&lt;/artifactId&gt;
 &lt;configuration&gt;
   &lt;repositoryLayout&gt;flat&lt;/repositoryLayout&gt;
   &lt;includeConfigurationDirectoryInClasspath&gt;true&lt;/includeConfigurationDirectoryInClasspath&gt;
   &lt;target&gt;${project.build.directory}/appassembler&lt;/target&gt;
     &lt;daemons&gt;
       &lt;daemon&gt;
         &lt;id&gt;daemon-app&lt;/id&gt;
         &lt;mainClass&gt;de.communardo.appassembler.Launcher&lt;/mainClass&gt;
         &lt;commandLineArguments&gt;
           &lt;commandLineArgument&gt;start&lt;/commandLineArgument&gt;
         &lt;/commandLineArguments&gt;
         &lt;platforms&gt;
           &lt;platform&gt;jsw&lt;/platform&gt;
         &lt;/platforms&gt;
         &lt;jvmSettings&gt;
           &lt;extraArguments&gt;
             &lt;extraArgument&gt;-server&lt;/extraArgument&gt;
           &lt;/extraArguments&gt;
           &lt;initialMemorySize&gt;64M&lt;/initialMemorySize&gt;
           &lt;maxMemorySize&gt;512M&lt;/maxMemorySize&gt;
           &lt;systemProperties&gt;
             &lt;systemProperty&gt;property=value&lt;/systemProperty&gt;
           &lt;/systemProperties&gt;
         &lt;/jvmSettings&gt;
         &lt;generatorConfigurations&gt;
           &lt;generatorConfiguration&gt;
             &lt;generator&gt;jsw&lt;/generator&gt;
             &lt;includes&gt;
               &lt;include&gt;linux-x86-32&lt;/include&gt;
               &lt;include&gt;linux-x86-64&lt;/include&gt;
             &lt;/includes&gt;
             &lt;configuration&gt;
               &lt;property&gt;
                 &lt;name&gt;configuration.directory.in.classpath.first&lt;/name&gt;
                 &lt;value&gt;conf&lt;/value&gt;
               &lt;/property&gt;
               &lt;property&gt;
                 &lt;name&gt;set.default.REPO_DIR&lt;/name&gt;
                 &lt;value&gt;lib&lt;/value&gt;
               &lt;/property&gt;
               &lt;property&gt;
                 &lt;name&gt;wrapper.logfile&lt;/name&gt;
                 &lt;value&gt;logs/wrapper.log&lt;/value&gt;
               &lt;/property&gt;
               &lt;property&gt;
                 &lt;name&gt;wrapper.logfile.maxsize&lt;/name&gt;
                 &lt;value&gt;10m&lt;/value&gt;
               &lt;/property&gt;
               &lt;property&gt;
                 &lt;name&gt;wrapper.logfile.maxfiles&lt;/name&gt;
                 &lt;value&gt;5&lt;/value&gt;
               &lt;/property&gt;
               &lt;property&gt;
                 &lt;name&gt;wrapper.console.title&lt;/name&gt;
                 &lt;value&gt;appassembler application&lt;/value&gt;
               &lt;/property&gt;
               &lt;property&gt;
                 &lt;name&gt;run.as.user.envvar&lt;/name&gt;
                 &lt;value&gt;root&lt;/value&gt;
               &lt;/property&gt;
               &lt;property&gt;
                 &lt;name&gt;wrapper.working.dir&lt;/name&gt;
                 &lt;value&gt;d:\&lt;/value&gt;
               &lt;/property&gt;
               &lt;property&gt;
                 &lt;name&gt;set.default.APP_BASE&lt;/name&gt;
                 &lt;value&gt;d:\&lt;/value&gt;
               &lt;/property&gt;
             &lt;/configuration&gt;
           &lt;/generatorConfiguration&gt;
         &lt;/generatorConfigurations&gt;
       &lt;/daemon&gt;
     &lt;/daemons&gt;
   &lt;/configuration&gt;
   &lt;executions&gt;
     &lt;execution&gt;
       &lt;id&gt;create-release&lt;/id&gt;
       &lt;goals&gt;
         &lt;goal&gt;create-repository&lt;/goal&gt;
         &lt;goal&gt;generate-daemons&lt;/goal&gt;
       &lt;/goals&gt;
       &lt;configuration&gt;
         &lt;assembleDirectory&gt;${project.build.directory}/appassembler/jsw/daemon-app&lt;/assembleDirectory&gt;
         &lt;repoPath&gt;lib&lt;/repoPath&gt;
       &lt;/configuration&gt;
       &lt;phase&gt;package&lt;/phase&gt;
     &lt;/execution&gt;
   &lt;/executions&gt;
&lt;/plugin&gt;
</pre>
<h2>Parameter</h2>
<table>
<tbody>
<tr>
<td>mainClass</td>
<td>Die auszuführende Klasse.</td>
</tr>
<tr>
<td>commandLineArguments</td>
<td>Parameter die beim Aufruf mit übergeben werden  sollen.</td>
</tr>
<tr>
<td>platforms</td>
<td>Die Liste der Plattformen für die ein Release  erzeugt werden soll, hier &#8220;jsw&#8221; (Java Service Wrapper).</td>
</tr>
<tr>
<td>jvmSettings</td>
<td>Faßt Konfigurationsparameter für die Java VM  zusammen wie z.B. Speichereinstellungen, zusätzliche System Properties  die gesetzt werden sollen oder Parameter für den Aufruf der VM</td>
</tr>
<tr>
<td>includes</td>
<td>Ermöglicht die optionale Definition der  Zielumgebungen, hier linux 32 und 64 bit, kann auch weggelassen werden.</td>
</tr>
<tr>
<td>configuration.directory.in.classpath.first</td>
<td>Legt fest, dass ein bestimmtes Verzeichnis mit  in den Classpath der VM aufgenommen wird. Darin lassen sich gut  Konfigurationsdateien ablegen die von der Applikation beim Betrieb  gebraucht werden.</td>
</tr>
<tr>
<td>set.default.REPO_DIR</td>
<td>Das Verzeichnis in denen sich die Bibliotheken  befinden.</td>
</tr>
<tr>
<td>run.as.user.envvar</td>
<td>Der Nutzer mit dem die Applikation ausgeführt  werden soll, wichtig beim Betrieb in Linuxumgebungen.</td>
</tr>
<tr>
<td>wrapper.xxx</td>
<td>Einstellungen für den Java Service Wrapper wie  z.b. das Arbeitsverzeichnis, Anzahl der Logfiles usw.</td>
</tr>
<tr>
<td>assembleDirectory, repoPath</td>
<td>Diese Parameter konfigurieren das  Zielverzeichnis für das zu erstellende Repository. Leider wird bei den  Standardwerten das Repository in einem anderen Verzeichnis erzeugt als  der Java Service Wrapper, daher ist eine Anpassung nötig.</td>
</tr>
<tr>
<td>&lt;goals&gt;<br />
&lt;goal&gt;create-repository&lt;/goal&gt;<br />
&lt;goal&gt;generate-daemons&lt;/goal&gt;<br />
&lt;/goals&gt;</td>
<td>Erzeugt die definierten Deamons und ein  Library Repository mit allen Abhängigkeiten des Projekts.</td>
</tr>
</tbody>
</table>
 ]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2010/01/29/standalone-java-applikationen-mit-maven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSGI- und Spring-DM-Bundles über Eclipse und maven2 erstellen</title>
		<link>http://www.communardo.de/home/techblog/2009/08/31/osgi-und-spring-dm-bundles-ueber-eclipse-und-maven2-erstellen/</link>
		<comments>http://www.communardo.de/home/techblog/2009/08/31/osgi-und-spring-dm-bundles-ueber-eclipse-und-maven2-erstellen/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 09:32:32 +0000</pubDate>
		<dc:creator>tfl</dc:creator>
				<category><![CDATA[JEE]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[maven2]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://www.communardo.de/home/techblog/?p=1866</guid>
		<description><![CDATA[<p>Unter <a href="http://springosgi.googlepages.com/">http://springosgi.googlepages.com/ </a>befindet sich ein hervorragendes Tutorial zu Spring-DM, welches nebenbei auch die Verwendung der Plugin-Development-Unterstützung von Eclipse erklärt. Wer einmal deren Vorzüge genossen hat, wird wahrscheinlich nie mehr Manifest-Dateien per Texteditor bearbeiten wollen. Außerdem ist es bei der Entwicklung angenehmer, entwickelte Bundles über einen einzigen Knopfdruck im Eclipse zu starten, anstatt sie z.B. über Maven zu bauen und den Container extern zu starten.</p>
<p>Trotzdem kann es wichtig sein, dass die Bundles unabhängig von Eclipse in Maven gebaut werden können, z.B. um komplette Releases mit Tokenersetzung für verschiedene Umgebungen zu bauen. Für Maven2 existiert das Felix Bundle Plugin (<a href="http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html">http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html</a>), welches fertige Bundles generieren kann.</p>
<p>Da sich die Verszeichnisstrukturen des Eclipse-Plugin-Development-Tools und eines Standard-Maven2-Projektes sehr unterscheiden, wird hier ein Weg beschrieben, wie beide Welten vereinigt werden können.</p>
<p>Als Verzeichnisstruktur des Maven-Projektes wird folgendes vorausgesetzt:</p>
<p><span style="color: #999999">- src</span></p>
<p style="padding-left: 30px"><span style="color: #999999">- main</span></p>
<p style="padding-left: 60px"><span style="color: #999999">- bundle</span></p>
<p style="padding-left: 90px"><span style="color: #999999">- META-INF</span></p>
<p style="padding-left: 120px"><span style="color: #999999">- Manifest.MF</span></p>
<p style="padding-left: 60px"><span style="color: #999999">- java</span></p>
<p>Innerhalb von Eclipse muss aber das META-INF-Verzeichnis im Wurzelverzeichnis des Projektes liegen, damit es als Bundle gebaut wird. Deshalb legen wir das Plugin-Projekt innerhalb des Bundle-Ordners an und importieren alle benötigten Resourcen (in diesem Fall nur den java-Ordner) über Verlinkung in das Projekt. Dafür erstellt man einen neuen Ordner und selektiert unter <strong>Advanced</strong> die Checkbox <strong>Link to Folder in file system</strong>. Dann wählt man den Java-Ordner und fügt ihn zum Projekt hinzu. Über das Kontext-Menü -&gt; <strong>Build Path</strong> -&gt; <strong>Use as source folder</strong> kann dieser Ordner  als Quellordner markiert werden.</p>
<p>Die Verzeichnisstruktur im Eclipse-Projekt sieht jetzt folgendermaßen aus:</p>
<p><span style="color: #999999">- META-INF</span></p>
<p style="padding-left: 30px"><span style="color: #999999">- Manifest.MF</span></p>
<p><span style="color: #999999">- java (Verlinkt)</span></p>
<p>Jetzt muss nur noch das Maven-Plugin so eingerichtet werden, daß es die Bundle-Konfiguration aus der vom Eclipse erzeugten Manifest-Datei übernimmt. Das kann z.B. so aussehen:</p>
<p><span style="color: #999999">&lt;plugin&gt;</span></p>
<p style="padding-left: 30px"><span style="color: #999999">&lt;groupId&gt;org.apache.felix&lt;/groupId&gt;</span></p>
<p style="padding-left: 30px"><span style="color: #999999">&lt;artifactId&gt;maven-bundle-plugin&lt;/artifactId&gt;</span></p>
<p style="padding-left: 30px"><span style="color: #999999">&lt;extensions&gt;true&lt;/extensions&gt;</span></p>
<p style="padding-left: 30px"><span style="color: #999999">&lt;executions&gt;</span></p>
<p style="padding-left: 60px"><span style="color: #999999">&lt;execution&gt;</span></p>
<p style="padding-left: 90px"><span style="color: #999999">&lt;id&gt;bundle&lt;/id&gt;</span></p>
<p style="padding-left: 90px"><span style="color: #999999">&lt;phase&gt;package&lt;/phase&gt;</span></p>
<p style="padding-left: 90px"><span style="color: #999999">&lt;goals&gt;</span></p>
<p style="padding-left: 120px"><span style="color: #999999">&lt;goal&gt;bundle&lt;/goal&gt;</span></p>
<p style="padding-left: 120px"><span style="color: #999999">&lt;goal&gt;install&lt;/goal&gt;</span></p>
<p style="padding-left: 90px"><span style="color: #999999">&lt;/goals&gt;</span></p>
<p style="padding-left: 60px"><span style="color: #999999">&lt;/execution&gt;</span></p>
<p style="padding-left: 30px"><span style="color: #999999">&lt;/executions&gt;</span></p>
<p style="padding-left: 30px"><span style="color: #999999">&lt;configuration&gt;</span></p>
<p style="padding-left: 60px"><span style="color: #999999">&lt;instructions&gt;</span></p>
<p style="padding-left: 90px"><span style="color: #999999">&lt;_failok&gt;true&lt;/_failok&gt;</span></p>
<p style="padding-left: 90px"><span style="color: #999999">&lt;_include&gt;src/main/bundle/META-INF/MANIFEST.MF&lt;/_include&gt;</span></p>
<p style="padding-left: 90px"><span style="color: #999999">&lt;Include-Resource&gt;{maven-resources},META-INF/spring=src/main/bundle/META-INF/spring&lt;/Include-Resource&gt;</span></p>
<p style="padding-left: 60px"><span style="color: #999999">&lt;/instructions&gt;</span></p>
<p style="padding-left: 30px"><span style="color: #999999">&lt;/configuration&gt;</span></p>
<p><span style="color: #999999">&lt;/plugin&gt;</span></p>
<p>Das <strong>_include</strong> -Tag bewirkt, dass für die Bundle-Generierung die von Eclipse erzeugte Manifest-Datei verwendet wird. Leider wird in Dieser der Klassenpfad Einträge enthalten, die im erzeugten Bundle nicht mehr vorhanden sind, z.B. der bin-Ordner, in welchem die kompilierten Klassen liegen. Das Bundle-Plugin bricht an dieser Stelle ab, obwohl ungültige Klassenpfad-Einträge in Equinox nicht zu Fehlern führen. Der einfachste Weg, dieses Problem zu umgehen, ist <strong>_failok </strong>auf true zu setzen. Eleganter wäre es, den Klassenpfad-Eintrag vorher zu manipulieren. Wichtig ist nur, dass der Klassenpfad-Eintrag <strong>./ </strong>existiert, weil das Bundle-Plugin alle Klassen im Wurzel-Verzeichnis des Bundles ablegt.</p>
<p>Allerdings kann nicht davon ausgegangen werden, dass sich das Bundle auf Anhieb in einem extern gestarteten equinox genauso verhält, wie in Eclipse, da Eclipse zahlreiche Umgebungsvariablen setzt, die von den Default-Werten abweichen. Sollten also <strong>ClassNotFoundExceptions</strong> bei Klassen auftreten, welche normalerweise zur JRE gehören (z.B. org.w3c.dom.Node) und innerhalb von Eclipse nicht als Dependency eingebunden werden müssen, dann lohnt sich ein Blick in die System-Properties.</p>
<p><span style="color: #999999">Properties prop = System.getProperties();<br />
for (Object k : prop.keySet()) {<br />
System.out.println(k + &#8221; &#8211; &#8221; + prop.getProperty(k.toString()));<br />
}</span></p>
<p>Gibt alle Properties aus. Eine Beschreibung der einzelnen Parameter befindet sich <a href="http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/misc/runtime-options.html">hier</a></p>
<p>Wichtig sind vor allem die Parameter <strong>osgi.compatibility.bootdelegation </strong>und <strong>org.osgi.framework.system.packages</strong>.</p>
 ]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2009/08/31/osgi-und-spring-dm-bundles-ueber-eclipse-und-maven2-erstellen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven und das Trigger-Plugin in Confluence</title>
		<link>http://www.communardo.de/home/techblog/2008/09/26/maven-und-das-trigger-plugin/</link>
		<comments>http://www.communardo.de/home/techblog/2008/09/26/maven-und-das-trigger-plugin/#comments</comments>
		<pubDate>Fri, 26 Sep 2008 09:41:19 +0000</pubDate>
		<dc:creator>Sebastian Höhne</dc:creator>
				<category><![CDATA[Confluence]]></category>
		<category><![CDATA[Atlassian]]></category>
		<category><![CDATA[maven2]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Trigger]]></category>

		<guid isPermaLink="false">http://www.communardo.de/home/techblog/?p=420</guid>
		<description><![CDATA[<p>Bei der Entwicklung von Confluence Plugins kommt häufig die auf Java basierende Buildmanagement-Software <a title="Maven" href="http://maven.apache.org/" target="_blank">Maven</a> zum Einsatz. Ziel dabei ist es, die Entwickler vom Anlegen des Projektes bis hin zum Kompilieren und Testen zu unterstützen und möglichst viele Schritte des Softwaremanagements automatisiert ablaufen zu lassen. Ein Tutorial für die Entwicklung von Confluence Plugins mit Hilfe von Maven findet sich auf den Seiten der <a title="Confluence Community" href="http://confluence.atlassian.com/display/DISC/Developing+Confluence+Plugins+with+Maven+2" target="_blank">Confluence Community</a>.</p>
<p>Wenn eine solche Entwicklungsumgebung eingerichtet wurde, kann der Buildprozess eines Plugins noch weiter vereinfacht werden. Dafür stellt Atlassian das <a title="Plugin Developer Kit for Maven 2" href="http://confluence.atlassian.com/display/DEVNET/Atlassian+Maven+PDK" target="_blank">Plugin Developer Kit for Maven2</a> (kurz PDK) zur Verfügung. Dabei handelt es sich um ein Maven-Plugin, welches einfach in der POM des eigenen Projektes eingebunden werden muss und dann automatisch beim Buildprozess heruntergeladen und installiert wird. Ein solcher Aufruf kann z.B. so aussehen:</p>
<pre>
&lt;plugin&gt;
   &lt;groupId&gt;com.atlassian.maven.plugins&lt;/groupId&gt;
   &lt;artifactId&gt;atlassian-pdk&lt;/artifactId&gt;
   &lt;executions&gt;
      &lt;execution&gt;
         &lt;phase&gt;package&lt;/phase&gt;
         &lt;goals&gt;
            &lt;goal&gt;uninstall&lt;/goal&gt;
            &lt;goal&gt;install&lt;/goal&gt;
            &lt;goal&gt;rescan&lt;/goal&gt;
         &lt;/goals&gt;
      &lt;/execution&gt;
   &lt;/executions&gt;
&lt;/plugin&gt;
</pre>
<p>Dabei können verschiedene Goals angegeben werden, welche hintereinander ausgeführt werden und z.B. das Plugin direkt nach dem kompilieren in einem laufenden Confluence deinstallieren und die neue Version installieren. Eine sinnvolle Reihenfolge wäre z.B. <em>Uninstall</em> &#8211; <em>Install</em> &#8211; <em>Rescan</em>.</p>
<p>Vorsicht ist allerdings bei der Benutzung des <a title="Confluence Trigger Plugin Modul" href="http://confluence.atlassian.com/display/DOC/Trigger+Plugins" target="_blank">Confluence Trigger Plugin Moduls</a> geboten. Hat man einen Trigger in seiner atlassian-config.xml eingebunden und installiert das Plugin über das PDK direkt in ein laufendes Confluence, sollte nach einem <em>Install</em> kein explizites <em>Enable</em> des Plugins ausgeführt werden. Der Grund dafür ist: der Job wird bereits beim <em>Install</em> angelegt. Bei einem folgenden <em>Enable</em> wird dann erneut versucht, dieser Job anzulegen &#8211; was natürlich fehlschlägt und mit einer <code>ObjectAlreadyExistsException</code> quittiert wird. Ein <em>Install</em> und ggf. <em>Rescan</em> ist in diesem Fall also ausreichend.</p>
 ]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2008/09/26/maven-und-das-trigger-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Verwendung von Java2 5.0 Klassen mit Java2 1.4 mit Retrotranslator</title>
		<link>http://www.communardo.de/home/techblog/2008/01/07/verwendung-von-java2-50-klassen-mit-java2-14-mit-retrotranslator/</link>
		<comments>http://www.communardo.de/home/techblog/2008/01/07/verwendung-von-java2-50-klassen-mit-java2-14-mit-retrotranslator/#comments</comments>
		<pubDate>Mon, 07 Jan 2008 16:23:11 +0000</pubDate>
		<dc:creator>Jan Dittberner</dc:creator>
				<category><![CDATA[JEE]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jaxb]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[maven2]]></category>
		<category><![CDATA[retrotranslator]]></category>
		<category><![CDATA[webservice]]></category>
		<category><![CDATA[xfire]]></category>

		<guid isPermaLink="false">http://www.communardo.de/home/techblog/2008/01/07/verwendung-von-java2-50-klassen-mit-java2-14-mit-retrotranslator/</guid>
		<description><![CDATA[<p>In einem existierenden Java2 1.4 Projekt sollen generierte XFire-Clientklassen verwendet werden. Der XFire-Codegenerator verwendet JAXB2 und ist damit auf einige Java2 5.0-Features wie Annotations angewiesen. Der Umstieg auf Java2 5.0 ist in dem Projekt keine Option und deshalb habe ich eine Möglichkeit gebraucht, die generierten Klassen mit Java2 1.4 zu verwenden.</p>
<p>Nach ein paar Recherchen habe ich mich für die Verwendung des freien <a href="http://retrotranslator.sourceforge.net/" title="Retrotranslator Java2 5.0 Bytecode zu Java2 1.4 Bytecode Translator">Retrotranslator</a>-Tools entschieden und eine Proof-Of-Concept-Implementierung realisiert. Retrotranslator kann sowohl zur Compile-Zeit als auch zur Laufzeit den Java2 5.0 Bytecode in Java2 1.4 Bytecode umwandeln. Für den eigenen Code habe ich mich für die Umwandlung zur Compilezeit entschieden und für verwendeten Code Dritter für die Umwandlung zur Laufzeit (Just in Time Compilierung).<br />
<span id="more-230"></span><br />
Nun zur praktischen Umsetzung mit Maven2:</p>
<p>Das POM des Codegenerierungsprojektes sieht folgendermaßen aus:</p>
<pre>&lt;project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;de.communardo.techblog&lt;/groupId&gt;
  &lt;artifactId&gt;demoxfiregen&lt;/artifactId&gt;
  &lt;packaging&gt;jar&lt;/packaging&gt;
  &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
  &lt;name&gt;Generierter XFire-Code fuer Communardo Techblog&lt;/name&gt;

  &lt;build&gt;
    &lt;plugins&gt;
      &lt;plugin&gt;
        &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
        &lt;configuration&gt;
          &lt;source&gt;1.5&lt;/source&gt;
          &lt;target&gt;1.5&lt;/target&gt;
        &lt;/configuration&gt;
      &lt;/plugin&gt;
      &lt;plugin&gt;
        &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
        &lt;artifactId&gt;xfire-maven-plugin&lt;/artifactId&gt;
        &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
        &lt;executions&gt;
          &lt;execution&gt;
            &lt;goals&gt;
              &lt;goal&gt;wsgen&lt;/goal&gt;
            &lt;/goals&gt;
          &lt;/execution&gt;
        &lt;/executions&gt;
        &lt;configuration&gt;
          &lt;package&gt;
            de.communardo.techblog.services
          &lt;/package&gt;
          &lt;profile /&gt;
          &lt;binding /&gt;
          &lt;outputDirectory&gt;
            ${project.build.directory}/generated-sources/xfire
          &lt;/outputDirectory&gt;
          &lt;wsdls&gt;
            &lt;wsdl&gt;
              ${basedir}/src/main/resources/TechblogDemoService.wsdl
            &lt;/wsdl&gt;
          &lt;/wsdls&gt;
        &lt;/configuration&gt;
      &lt;/plugin&gt;
      &lt;plugin&gt;
        &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
        &lt;artifactId&gt;retrotranslator-maven-plugin&lt;/artifactId&gt;
        &lt;executions&gt;
          &lt;execution&gt;
            &lt;phase&gt;package&lt;/phase&gt;
            &lt;goals&gt;
              &lt;goal&gt;translate-project&lt;/goal&gt;
            &lt;/goals&gt;
            &lt;configuration&gt;
              &lt;classifier&gt;jdk14&lt;/classifier&gt;
              &lt;attach&gt;true&lt;/attach&gt;
              &lt;embed&gt;net.sf.retrotranslator&lt;/embed&gt;
            &lt;/configuration&gt;
          &lt;/execution&gt;
        &lt;/executions&gt;
      &lt;/plugin&gt;
    &lt;/plugins&gt;
  &lt;/build&gt;

  &lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.codehaus.xfire&lt;/groupId&gt;
      &lt;artifactId&gt;xfire-jaxb2&lt;/artifactId&gt;
      &lt;version&gt;1.2.5&lt;/version&gt;
    &lt;/dependency&gt;
  &lt;/dependencies&gt;
&lt;/project&gt;</pre>
<p>Der erste Plugin-Aufruf setzt die Java-Version auf 1.5, der Zweite generiert den Java-Code aus einer WSDL und der dritte generiert in der package-Phase von Maven ein Java2 1.4 kompatibles JAR-Archiv mit dem Classifier jdk14. Mit</p>
<p><code>mvn install</code></p>
<p>wird alles gebaut und ins lokale Maven-Repository installiert.</p>
<p>Im Java2 1.4-Projekt wird das generierte JAR in den Dependencies so referenziert:</p>
<pre>    &lt;dependency&gt;
      &lt;groupId&gt;de.communardo.techblog&lt;/groupId&gt;
      &lt;artifactId&gt;demoxfiregen&lt;/artifactId&gt;
      &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
      &lt;classifier&gt;jdk14&lt;/classifier&gt;
    &lt;/dependency&gt;</pre>
<p>Um alle Abhängigkeiten, die von XFire und den JAXB2-Klassen benötigt werden zu erfüllen und den Retrotranslator Just-In-Time-Compiler (JIT) vefügbar zu machen, wurden noch folgende Dependencies in das Ziel-POM eingetragen:</p>
<pre>    &lt;dependency&gt;
      &lt;groupId&gt;net.sf.retrotranslator&lt;/groupId&gt;
      &lt;artifactId&gt;retrotranslator-transformer&lt;/artifactId&gt;
      &lt;version&gt;1.2.1&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;javax.xml.parsers&lt;/groupId&gt;
      &lt;artifactId&gt;jaxp-api&lt;/artifactId&gt;
      &lt;version&gt;1.4&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;com.sun.org.apache&lt;/groupId&gt;
      &lt;artifactId&gt;jaxp-ri&lt;/artifactId&gt;
      &lt;version&gt;1.4&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;xerces&lt;/groupId&gt;
      &lt;artifactId&gt;xercesImpl&lt;/artifactId&gt;
      &lt;version&gt;2.8.1&lt;/version&gt;
    &lt;/dependency&gt;</pre>
<p>Damit das Ganze dann zur Laufzeit funktioniert muss beim Start der Applikation der Retrotranslator JIT genutzt werden, das geschieht in dem man die JVM-Kommandozeile folgendermaßen aufbaut:</p>
<p><code>java &lt;JVM-Parameter&gt; net.sf.retrotranslator.transformer.JITRetrotranslator &lt;Main-Klasse&gt; &lt;Anwendungsparameter&gt;</code></p>
 ]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2008/01/07/verwendung-von-java2-50-klassen-mit-java2-14-mit-retrotranslator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven 2 Multi-Modules Project Site</title>
		<link>http://www.communardo.de/home/techblog/2007/12/05/maven-2-multi-modules-project-site/</link>
		<comments>http://www.communardo.de/home/techblog/2007/12/05/maven-2-multi-modules-project-site/#comments</comments>
		<pubDate>Wed, 05 Dec 2007 13:10:22 +0000</pubDate>
		<dc:creator>Alexander Buder</dc:creator>
				<category><![CDATA[JEE]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[maven2]]></category>

		<guid isPermaLink="false">http://www.communardo.de/home/techblog/2007/12/05/maven-2-multi-modules-project-site/</guid>
		<description><![CDATA[<p>Mithilfe des Site-Plugins ist es möglich ohne großen Aufwand eine Projekt Homepage mit allen wichtigen Informationen zu erstellen. Neben generierten Code Audits, Unit-Test Reports oder SourceCode Reviews können auch eigene Inhalte problemlos mit eingebunden werden, was die Projektsite zu einer universellen Informationsplattform für Entwickler macht.</p>
<p>Leider gibt es bei Projekten mit mehrenen Modulen häufig Probleme in der Verlinkung der generierten Html-Seiten. Da die Super-Pom zwar alle Sub-Modules kennt aber nicht umgekehrt, sind die Module auf der Projekt-Page auch nur in eine Richtung verlinkt. Möchte man nun zu einem Parent-Modul navigieren, muss man entweder die Browser-Hierarchie bemühen oder die Startseite erneut aufrufen.</p>
<h5>Direkte Modulverlinkung</h5>
<p>Die Lösung für dieses Problem ist die site.xml. In dieser Datei kann das Aussehen und die Navigation der Projektseite individuell angepasst werden. Den generellen Aufbau der site.xml findet man <a href="http://maven.apache.org/plugins/maven-site-plugin/index.html" title="Maven 2 Site">hier</a>. Damit nun die Verlinkung funktioniert muss in jedem Modul im Verzeichnis <em>src/</em> ein Ordner <em>site</em>, zusammen mit der Datei <em>site.xml</em> angelegt werden. Eine leere site.xml erzeugt eine blank-page, daher muss für die Standardfunktionalität folgender Content eingebunden werden:</p>
<blockquote><p><code>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />
&lt;project name="Maven"&gt;<br />
  &lt;body&gt;<br />
    &lt;menu ref="parent"/&gt; &lt;!-- Erzeugt Link zum Parent-Modul--&gt;<br />
    &lt;menu ref="modules"/&gt;<br />
    &lt;menu ref="reports"/&gt;<br />
  &lt;/body&gt;<br />
&lt;/project&gt;</code></p></blockquote>
<p>Mit <code>mvn site-deploy</code> werden nun die zugehörigen Projektseiten erzeugt. Ein Aufruf der Startseite überrascht noch nicht, es werden wie gewohnt alle Module angezeigt.</p>
<p align="left">                       <img border="1" src="http://www.communardo.de/home/techblog/files/2007/12/startpage_parent1.gif" />
<p>Auf den Seiten der Sub-Modules hingegen, erscheint nun ein Link zum jeweiligen Parent-Modul oben in der Navigationsleiste.</p>
<p>                       <img border="1" src="http://www.communardo.de/home/techblog/files/2007/12/modul_1_parent1.gif" />
<h5> Krümelpfad Verlinkung</h5>
<p>Die direkte Verlinkung erfüllt zwar ihren Zweck, ist aber gerade bei mehreren Hierarchiestufen nicht gerade praktisch. Besser wäre da doch ein Krümelpfad mit dem man beliebig zwischen den Seiten wechseln kann. Wieder hilft dabei die site.xml</p>
<blockquote><p><code>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />
&lt;project name="Maven"&gt;<br />
  &lt;body&gt;<br />
    &lt;breadcrumbs&gt;<br />
      &lt;item name="&lt;ModulName&gt;" href="index.html" mce_href="index.html"/&gt;<br />
    &lt;/breadcrumbs&gt;</code><code><br />
    &lt;menu ref="modules"/&gt;<br />
    &lt;menu ref="reports"/&gt;<br />
  &lt;/body&gt;<br />
&lt;/project&gt;</code></p></blockquote>
<p>In dem Item-Tag wird dabei nur der Name des aktuellen Moduls eingetragen und als href die index.html. Maven baut dann automatisch den Pfad synchron zur Modulhierarchie zusammen. Die nachfolgenden Abbildungen zeigen eine Projektseite mit drei Hierarchieebenen.</p>
<p align="left">                       <img border="1" src="http://www.communardo.de/home/techblog/files/2007/12/startpage_all1.gif" />
<p align="left">                       <img border="1" src="http://www.communardo.de/home/techblog/files/2007/12/modul_1_all1.gif" />
<p align="left">                       <img border="1" src="http://www.communardo.de/home/techblog/files/2007/12/modul_2_all1.gif" />
 ]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2007/12/05/maven-2-multi-modules-project-site/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Properties und Spring</title>
		<link>http://www.communardo.de/home/techblog/2007/11/15/properties-und-spring/</link>
		<comments>http://www.communardo.de/home/techblog/2007/11/15/properties-und-spring/#comments</comments>
		<pubDate>Thu, 15 Nov 2007 18:59:16 +0000</pubDate>
		<dc:creator>Torsten Lunze</dc:creator>
				<category><![CDATA[JEE]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[build management]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[maven2]]></category>
		<category><![CDATA[properties]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://www.communardo.de/home/techblog/2007/11/15/properties-und-spring/</guid>
		<description><![CDATA[<p>Bei der Verwendung von Spring stellt sich im Buildmanagement die Frage wie mit Properties umgegangen wird. So hat jeder Test-, Live- und Entwicklungsserver seine eigene Datenbank oder andere unterschiedliche Einstellungen. Eine oft gewählte Variante ist die Ersetzung der Properties durch den Buildprozess. Dies hat allerdings den Nachteil, dass für eine Änderung der Properties der Buildprozess neu ausgeführt werden muss.</p>
<p>Mit Spring bietet sich dabei eine Alternative: Hier kann ein Propertyfile welches z. B. im Classpath liegt eingebunden werden:</p>
<p><code>&lt;bean id="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;<br />
&lt;property name="location" value="classpath:hibernate.properties" /&gt;<br />
&lt;/bean&gt;</code></p>
<p>Die Properties, die dann in dem File &#8216;hibernate.properties&#8217; definiert sind, können innerhalb der Springkonfiguration genutzt werden:<br />
<code><br />
...<br />
&lt;property name="hibernateProperties"&gt;<br />
&lt;props&gt;<br />
&lt;prop key="hibernate.show_sql"&gt;${hibernate.show_sql}&lt;/prop&gt;<br />
&lt;prop key="hibernate.dialect"&gt;${hibernate.dialect}&lt;/prop&gt;<br />
&lt;prop key="hibernate.hbm2ddl.auto"&gt;${hibernate.hbm2ddl.auto}&lt;/prop&gt;<br />
...<br />
&lt;/props&gt;<br />
&lt;/property&gt;<br />
...<br />
</code></p>
<p>Das Property File selbst ist dabei einfach wie erwartet:<br />
<code><br />
hibernate.show_sql=true<br />
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect<br />
hibernate.hbm2ddl.auto=update </code></p>
 ]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2007/11/15/properties-und-spring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JAXB2-Bindings aus einer DTD mit Typmapping mit Maven2 generieren</title>
		<link>http://www.communardo.de/home/techblog/2007/08/24/jaxb2-bindings-aus-einer-dtd-mit-typmapping-mit-maven2-generieren/</link>
		<comments>http://www.communardo.de/home/techblog/2007/08/24/jaxb2-bindings-aus-einer-dtd-mit-typmapping-mit-maven2-generieren/#comments</comments>
		<pubDate>Fri, 24 Aug 2007 14:16:16 +0000</pubDate>
		<dc:creator>Jan Dittberner</dc:creator>
				<category><![CDATA[JEE]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[dtd]]></category>
		<category><![CDATA[jaxb]]></category>
		<category><![CDATA[maven2]]></category>
		<category><![CDATA[XML-Schema]]></category>

		<guid isPermaLink="false">http://www.communardo.de/home/techblog/2007/08/24/jaxb2-bindings-aus-einer-dtd-mit-typmapping-mit-maven2-generieren/</guid>
		<description><![CDATA[<p>Nach dem gestrigen <a href="http://www.communardo.de/home/techblog/2007/08/22/generierung-von-jaxb2-bindings-aus-einer-dtd-mit-maven2/">Erfolg</a> folgte heute eine Anforderung, die den Wechsel zu einem anderen Maven2-Plugin und einer neuen Mapping-Datei führte.</p>
<p>Die neue Anforderung war, dass Attribute aus der DTD auf andere Typen als String gemappt werden sollen. Da DTDs keine Typisierung wie XML-Schema kennen, muss dies mit einem Mapping-File geschehen. Das Maven2-Plugin aus dem gestrigen Artikel war leider mit dem Mapping der Attribute überfordert.</p>
<p>Jetzt wurde das <a href="https://maven-jaxb2-plugin.dev.java.net/">Maven2-JAXB-Plugin</a> von java.net verwendet, damit ändert sich die pom.xml folgendermaßen:</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</pre>
<pre>&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;de.mms-dresden&lt;/groupId&gt;
  &lt;artifactId&gt;hsp-search-gen&lt;/artifactId&gt;
  &lt;name&gt;Hilfe- und Support-Portal generierter Code fuer die Suche&lt;/name&gt;
  &lt;version&gt;0.1-SNAPSHOT&lt;/version&gt;
  &lt;parent&gt;
    &lt;groupId&gt;de.mms-dresden&lt;/groupId&gt;
    &lt;artifactId&gt;hsp&lt;/artifactId&gt;
    &lt;version&gt;0.1-SNAPSHOT&lt;/version&gt;
  &lt;/parent&gt;
  &lt;description&gt;Generierter Code fuer die Suche im Hilfeportal&lt;/description&gt;
  &lt;build&gt;
    &lt;plugins&gt;
      &lt;plugin&gt;
        &lt;groupId&gt;org.jvnet.jaxb2.maven2&lt;/groupId&gt;
        &lt;artifactId&gt;maven-jaxb2-plugin&lt;/artifactId&gt;
        &lt;executions&gt;
          &lt;execution&gt;
            &lt;goals&gt;
              &lt;goal&gt;generate&lt;/goal&gt;
            &lt;/goals&gt;
            &lt;configuration&gt;
              &lt;generateDirectory&gt;${project.build.directory}/generated-sources/jaxb&lt;/generateDirectory&gt;
              &lt;extension&gt;true&lt;/extension&gt;
              &lt;schemaLanguage&gt;DTD&lt;/schemaLanguage&gt;
              &lt;schemaIncludes&gt;
                &lt;schemaInclude&gt;*.dtd&lt;/schemaInclude&gt;
              &lt;/schemaIncludes&gt;
              &lt;bindingIncludes&gt;
                &lt;bindingInclude&gt;*.jaxb&lt;/bindingInclude&gt;
              &lt;/bindingIncludes&gt;
              &lt;verbose&gt;true&lt;/verbose&gt;
              &lt;args&gt;
                &lt;arg&gt;-Xinject-listener-code&lt;/arg&gt;
              &lt;/args&gt;
            &lt;/configuration&gt;
          &lt;/execution&gt;
        &lt;/executions&gt;
        &lt;dependencies&gt;
          &lt;dependency&gt;
            &lt;groupId&gt;org.jvnet.jaxb2-commons&lt;/groupId&gt;
            &lt;artifactId&gt;property-listener-injector&lt;/artifactId&gt;
            &lt;version&gt;1.0&lt;/version&gt;
          &lt;/dependency&gt;
        &lt;/dependencies&gt;
      &lt;/plugin&gt;
    &lt;/plugins&gt;
  &lt;/build&gt;

  &lt;repositories&gt;
    &lt;repository&gt;
      &lt;id&gt;maven2-repository.dev.java.net&lt;/id&gt;
      &lt;url&gt;http://download.java.net/maven/2/&lt;/url&gt;
    &lt;/repository&gt;
  &lt;/repositories&gt;

  &lt;pluginRepositories&gt;
    &lt;pluginRepository&gt;
      &lt;id&gt;maven2-repository.dev.java.net&lt;/id&gt;
      &lt;url&gt;http://download.java.net/maven/2/&lt;/url&gt;
    &lt;/pluginRepository&gt;
  &lt;/pluginRepositories&gt;

  &lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;javax.xml.bind&lt;/groupId&gt;
      &lt;artifactId&gt;jaxb-api&lt;/artifactId&gt;
    &lt;/dependency&gt;
  &lt;/dependencies&gt;
&lt;/project&gt;</pre>
<p>Bei der Angabe der Repository-Pfade muss man aufpassen, weil die Angaben auf der <a href="https://maven-jaxb2-plugin.dev.java.net/docs/guide.html">Projektseite</a> des Plugins inzwischen nicht mehr stimmen. Stattdessen mussten die Pfade aus der <a href="https://maven2-repository.dev.java.net/">Repositoryseite</a> von java.net verwendet werden.</p>
<p>Die Dependency-Versionen sind jetzt im Parent-POM definiert, entsprechen aber den Versionen aus dem gestrigen Beitrag.</p>
<p>Das Mapping mappt jetzt das Attribut HITCOUNT des Elements NAVIGATIONENTRY auf den Java-Typ int (genauer gesagt den Wrapper Integer um auch null-Werte darstellen zu können) und sieht jetzt folgendermaßen aus:</p>
<pre>&lt;?xml version="1.0" ?&gt;
&lt;!--
	The syntax of the binding file for DTD is defined in the JAXB EA.
	See vendorSchemaLangs.html for details.
--&gt;
&lt;xml-java-binding-schema xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  xmlns:ci="http://jaxb.dev.java.net/plugin/listener-injector"&gt;

  &lt;!-- specify the package name for the generated code --&gt;
  &lt;options package="de.mms_dresden.mip.hsp.base.services.search" /&gt;
  &lt;xjc:serializable/&gt;

  &lt;element name="NAVIGATIONENTRY" type="class"&gt;
    &lt;attribute name="HITCOUNT" convert="int" /&gt;
  &lt;/element&gt;
&lt;/xml-java-binding-schema&gt;</pre>
 ]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2007/08/24/jaxb2-bindings-aus-einer-dtd-mit-typmapping-mit-maven2-generieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generierung von JAXB2-Bindings aus einer DTD mit Maven2</title>
		<link>http://www.communardo.de/home/techblog/2007/08/22/generierung-von-jaxb2-bindings-aus-einer-dtd-mit-maven2/</link>
		<comments>http://www.communardo.de/home/techblog/2007/08/22/generierung-von-jaxb2-bindings-aus-einer-dtd-mit-maven2/#comments</comments>
		<pubDate>Wed, 22 Aug 2007 14:34:13 +0000</pubDate>
		<dc:creator>Jan Dittberner</dc:creator>
				<category><![CDATA[JEE]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[dtd]]></category>
		<category><![CDATA[jaxb]]></category>
		<category><![CDATA[maven2]]></category>

		<guid isPermaLink="false">http://www.communardo.de/home/techblog/2007/08/22/generierung-von-jaxb2-bindings-aus-einer-dtd-mit-maven2/</guid>
		<description><![CDATA[<p>Heute mussten aus einer existierenden DTD ein paar JAXB2-Binding-Klassen generiert werden. Nach einigem probieren ist dies mit folgender pom.xml und einem passenden Binding-File gelungen.</p>
<p>Hier die pom.xml:</p>
<p><code> </code></p>
<pre>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;de.mms-dresden&lt;/groupId&gt;
  &lt;artifactId&gt;hsp-search-gen&lt;/artifactId&gt;
  &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;
  &lt;description&gt;Generierter Code fuer die Suche im Hilfeportal&lt;/description&gt;
  &lt;build&gt;
    &lt;plugins&gt;
      &lt;plugin&gt;
        &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
        &lt;artifactId&gt;jaxb2-maven-plugin&lt;/artifactId&gt;
        &lt;executions&gt;
          &lt;execution&gt;
            &lt;goals&gt;
              &lt;goal&gt;xjc&lt;/goal&gt;
            &lt;/goals&gt;
          &lt;/execution&gt;
        &lt;/executions&gt;
        &lt;configuration&gt;
          &lt;schemaDirectory&gt;${basedir}/src/main/dtd&lt;/schemaDirectory&gt;
          &lt;dtd&gt;true&lt;/dtd&gt;
          &lt;xmlschema&gt;false&lt;/xmlschema&gt;
          &lt;schemaFiles&gt;FastSearchResult.dtd&lt;/schemaFiles&gt;
          &lt;strict&gt;false&lt;/strict&gt;
          &lt;verbose&gt;true&lt;/verbose&gt;
          &lt;explicitAnnotation&gt;true&lt;/explicitAnnotation&gt;
          &lt;packageName&gt;de.mms_dresden.mip.hsp.base.services.search&lt;/packageName&gt;
        &lt;/configuration&gt;
      &lt;/plugin&gt;
      &lt;plugin&gt;
        &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
        &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
        &lt;configuration&gt;
          &lt;source&gt;1.5&lt;/source&gt;
          &lt;target&gt;1.5&lt;/target&gt;
        &lt;/configuration&gt;
      &lt;/plugin&gt;
    &lt;/plugins&gt;
  &lt;/build&gt;
  &lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;javax.xml.bind&lt;/groupId&gt;
      &lt;artifactId&gt;jaxb-api&lt;/artifactId&gt;
      &lt;version&gt;2.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;com.sun.xml.bind&lt;/groupId&gt;
      &lt;artifactId&gt;jaxb-impl&lt;/artifactId&gt;
      &lt;version&gt;2.0.3&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;com.sun.xml.bind&lt;/groupId&gt;
      &lt;artifactId&gt;jaxb-xjc&lt;/artifactId&gt;
      &lt;version&gt;2.0.3&lt;/version&gt;
    &lt;/dependency&gt;
  &lt;/dependencies&gt;
&lt;/project&gt;</pre>
<p>und hier noch das passende File FastSearchResult.xjb:</p>
<p><code> </code></p>
<pre>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;xml-java-binding-schema&gt;
&lt;options package="de.mms_dresden.mip.hsp.base.services.search" /&gt;
&lt;element name="SEGMENTS" type="class" root="true" /&gt;
&lt;/xml-java-binding-schema&gt;</pre>
<p>Die generierten Klassen landen damit in target/generated-sources/jaxb</p>
 ]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2007/08/22/generierung-von-jaxb2-bindings-aus-einer-dtd-mit-maven2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>XFire-WebService-Client mit Maven2 generieren</title>
		<link>http://www.communardo.de/home/techblog/2007/07/02/xfire-webservice-client-mit-maven2-generieren/</link>
		<comments>http://www.communardo.de/home/techblog/2007/07/02/xfire-webservice-client-mit-maven2-generieren/#comments</comments>
		<pubDate>Mon, 02 Jul 2007 13:33:26 +0000</pubDate>
		<dc:creator>Jan Dittberner</dc:creator>
				<category><![CDATA[JEE]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[maven2]]></category>
		<category><![CDATA[webservice]]></category>
		<category><![CDATA[wsdl]]></category>
		<category><![CDATA[xfire]]></category>

		<guid isPermaLink="false">http://www.communardo.de/home/techblog/2007/07/02/xfire-webservice-client-mit-maven2-generieren/</guid>
		<description><![CDATA[<p>In einem aktuellen Projekt gab es die Erforderniss mehrere WebServices für ein Portal bereitzustellen. Da das <a href="http://www.springframework.org/" title="Webseite des Spring-Framework-Projektes">Spring</a>-Framework und <a href="http://maven.apache.org/" title="Apache Maven Webseite">Maven 2</a> zur Verfügung standen und ich mich etwas tiefergehend mit den Möglichkeiten des WebService-Frameworks <a href="http://xfire.codehaus.org/" title="XFire-Webseite">XFire</a> beschäftigen wollte, habe ich mich für eine Realisierung damit entschieden.</p>
<p>Heute stelle ich kurz vor, wie man mit Maven 2 und dem XFire-Plugin aus einer WSDL-Datei einen WebService-Client generieren und dann z.B. in einer Testklasse nutzen kann.</p>
<p>Zuerst benötigt man einmal eine WSDL-Beschreibung eines WebService, dafür stelle ich ein kleines Beispiel (xfirefun.wsdl)  bereit, es kann aber prinzipiell eine beliebige valide WSDL-Datei genutzt werden.</p>
<p>Alle Dateien die zum Nachvollziehen dieser kurzen Anleitung benötigt werden, liegen in der Zip-Datei <a href="http://www.communardo.de/home/techblog/wp-content/uploads/2007/07/xfirefun.zip" title="xfirefun.zip">xfirefun.zip</a><code></code>.</p>
<p>Für den Build mit Maven 2 das <a href="http://mojo.codehaus.org/xfire-maven-plugin/" title="XFire-Maven-Plugin">XFire-Maven-Plugin</a> benötigt und konfiguriert. Der entsprechende Abschnitt in der <code>pom.xml</code> sieht folgendermaßen aus:</p>
<pre>  ...
  &lt;build&gt;
    ...
    &lt;plugins&gt;
      ...
      &lt;plugin&gt;
        &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
        &lt;artifactId&gt;xfire-maven-plugin&lt;/artifactId&gt;
        &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
        &lt;executions&gt;
          &lt;execution&gt;
            &lt;goals&gt;
              &lt;goal&gt;wsgen&lt;/goal&gt;
            &lt;/goals&gt;
          &lt;/execution&gt;
        &lt;/executions&gt;
        &lt;configuration&gt;
          &lt;package&gt;de.communardo.ws.xfirefun&lt;/package&gt;
          &lt;profile&gt;&lt;/profile&gt;
          &lt;binding&gt;&lt;/binding&gt;
          &lt;outputDirectory&gt;${project.build.directory}/generated-sources/client&lt;/outputDirectory&gt;
          &lt;wsdls&gt;
            &lt;wsdl&gt;${basedir}/src/main/wsdl/xfirefun.wsdl&lt;/wsdl&gt;
          &lt;/wsdls&gt;
        &lt;/configuration&gt;
      &lt;plugin&gt;
      ...
    &lt;/plugins&gt;
    ...
  &lt;/build&gt;
  ...</pre>
<p>Wenn man nun <code>mvn install</code> aufruft, generiert Maven im Verzeichnis <code>target/client</code> die Webservice-Endpoint- und Datentypklassen. Die eine eigene Clientklasse (XfireFunClientTest.java) dann einfach folgendermaßen nutzen kann:</p>
<pre>...
// Client erzeugen
FunClient client = new FunClient();
// Endpoint festlegen und SOAP-Proxy holen
Fun fun = client.getFun(endpoint);
// Request-Objekt erzeugen und befuellen
FunRequest request = new FunRequest();
request.setFileName(filename);
// Remotezugriff absetzen
try {
  FunResponse response = fun.getFile(request);
  FileOutputStream fos = new FileOutputStream(response.getFileName());
  fos.write(response.getData());
} catch (Exception e) {
  e.printStackTrace(System.err);
}
...</pre>
 ]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2007/07/02/xfire-webservice-client-mit-maven2-generieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
