<?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>knallisworld &#187; Java</title> <atom:link href="http://www.knallisworld.de/blog/tag/java/feed/" rel="self" type="application/rss+xml" /><link>http://www.knallisworld.de/blog</link> <description>Where is the beef?</description> <lastBuildDate>Thu, 02 Feb 2012 23:10:07 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <item><title>[Howto] Maven: Wie man eine ausfÃ¼hrbare Jar in eine Java-Webanwendung (War) via Webstart integriert.</title><link>http://www.knallisworld.de/blog/2010/09/04/howto-maven-wie-man-eine-ausfuhrbare-jar-in-eine-java-webanwendung-war-via-webstart-integriert/</link> <comments>http://www.knallisworld.de/blog/2010/09/04/howto-maven-wie-man-eine-ausfuhrbare-jar-in-eine-java-webanwendung-war-via-webstart-integriert/#comments</comments> <pubDate>Sat, 04 Sep 2010 17:06:20 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Allgemeines]]></category> <category><![CDATA[Empfehlungen]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[Technologie/IT]]></category> <category><![CDATA[Tipps]]></category> <category><![CDATA[jar]]></category> <category><![CDATA[maven]]></category> <category><![CDATA[war]]></category> <category><![CDATA[webstart]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1225</guid> <description><![CDATA[Die Situation Es bestehen zwei lauffÃ¤hige, fertige Projekte in Maven, welche beide auch vollwertige Artefakte bilden kÃ¶nnen. Zum einen die Webanwendung &#8212; nennen wir sie hier mal webportal &#8212; mit einem WAR-Artefakt, etwa fÃ¼r einen Tomcat. Ob das Artefakt als Snapshot oder Release gemacht wird, ob es nur generiert oder auch in ein Repository deployt [...]]]></description> <content:encoded><![CDATA[<h3>Die Situation</h3><p>Es bestehen zwei lauffÃ¤hige, fertige Projekte in Maven, welche beide auch vollwertige Artefakte bilden kÃ¶nnen.</p><p><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/Bildschirmfoto-2010-09-04-um-18.52.33.png"></a>Zum einen die Webanwendung &#8212; nennen wir sie hier mal <em>webportal</em> &#8212; mit einem WAR-Artefakt, etwa fÃ¼r einen Tomcat. Ob das Artefakt als Snapshot oder Release gemacht wird, ob es nur generiert oder auch in ein Repository deployt wird, ist hierbei nicht von weiterer Bedeutung.<a
href="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/Nuvola_mimetypes_java_jar.png"><img
class="size-full wp-image-1232 alignright" title="Nuvola_mimetypes_java_jar" src="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/Nuvola_mimetypes_java_jar.png" alt="" width="128" height="128" /></a></p><p>Zum anderen die normale Clientanwendung &#8212; nennen wir sie doch einfach <em>userclient</em> &#8212; mit einem JAR-Artefakt. Wichtig ist natÃ¼rlich, dass hier eine startfÃ¤hige Main-Klasse vorhanden ist. Dies sollte jedoch der Regelfall sein, daher nur der formale Hinweis.</p><p>Zusammengefasst, und der Auftrag an dieses Howto ist also: Wie konfiguriert und erweitert man den Buildzyklus in welchem Projekt an welcher Stelle am geschicktesten, um auf einfachem Wege die JAR-Datei <em>userclient</em> in die Webanwendung <em>webportal</em> als Java Webstart zu integrieren. Dabei ist es hilfreich, wenn man via <em>pom.xml</em> (und natÃ¼rlich der Macht der Properties) die Versionen spezifizieren kann. Der gesamte Prozess von auswÃ¤hlen, signieren und ausliefern soll dabei automatisch und ohne weiteres Eingreifen des Entwicklers geschehen kÃ¶nnen. Idealerweise sollte das ganze auch optional sein &#8212; dazu gibt es dann mehr unter &#8220;Optimierungen und Verbesserungen&#8221;.</p><p><span
id="more-1225"></span></p><h3>Die Grundlagen</h3><p><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/Bildschirmfoto-2010-09-04-um-18.54.54.png"><img
class="alignleft size-full wp-image-1234" title="Java 6 Webstart" src="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/Bildschirmfoto-2010-09-04-um-18.54.54.png" alt="" width="327" height="145" /></a>Ich mÃ¶chte jetzt nicht viel Ã¼ber die Grundlagen verlieren, nur so viel sei gesagt. Aus Sicht von Maven ist die Konfiguration &#8220;nur&#8221; ein weiteres Plugin von vielen. Daraus ergibt sich natÃ¼rlich auch die MÃ¶glichkeit, via Properties oder Profilen die Konfiguration sehr dynamisch zu halten. Webstart ist eine Technik, die an sich nichts mit Maven zu tun hat. Man kann auch &#8220;hÃ¤ndisch&#8221; seine Jar-Datei Ã¼ber eine URL verfÃ¼gbar machen. Man muss dann jedoch alles selber und richtig machen: Versionisierung, Signierung und Deployment. Die Signierung ist gerade dann wichtig, wenn die Applikation erweiterte/volle Rechte benÃ¶tigt.</p><h3>Die MÃ¶glichkeiten</h3><p>Es gibt eine Reihe von Maven-Plugins, die einen unterschiedliche AnsÃ¤tze und LÃ¶sungen bieten.</p><p>Das <a
href="http://maven.apache.org/plugins/maven-jar-plugin/">Maven Jar Plugin</a> bietet etwa unter anderem die MÃ¶glichkeit, die Jar-Dateien zu signieren. Dies wÃ¤re jedoch nur die halbe Miete, da weder die Jar-Dateien bekannt noch auslieferbar sind. Auch das <a
href="http://mojo.codehaus.org/keytool-maven-plugin/">Keytool plugin</a> ist nicht vollstÃ¤ndig, denn es unterstÃ¼tzt zwar das Keystore gestÃ¼tzte signieren, aber auch nicht mehr. Wohl aber kÃ¶nnen diese Plugin als Basis fÃ¼r andere dienen.</p><p>Weitaus mehr Funktionen kann das <a
href="http://mojo.codehaus.org/webstart/webstart-maven-plugin/">Webstart Maven Plugin</a> bieten. Es gibt verschiedene Arten der Erzeugung der Jnlp-Datei und dem damit verbundenen Sammeln, Bestimmen und Signieren der AbhÃ¤ngigkeiten in Form weiterer Jars oder Classfiles. Es ist auch ein hilfreiches Plugin, wenn man aus einem Projekt heraus direkt Jnlp &amp; Ressourcen erzeugen will.</p><p>In diesem Howto ist aber vor allem ein Ziel von Relevanz:Â Die Variante mit dem Jnlp-Download-Servlet: das Goal <a
href="http://mojo.codehaus.org/webstart/webstart-maven-plugin/jnlp-download-servlet-mojo.html">webstart:jnlp-download-servlet</a>.<a
href="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/jnlp.gif"><img
class="alignright size-full wp-image-1235" title="jnlp" src="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/jnlp.gif" alt="" width="128" height="128" /></a></p><p>Dieses Goal erzeugt im Buildprozess ein weiteres Verzeichnis mit den Ressourcen des <em>userclients</em> und der dazugehÃ¶renden Jnlps. Ein spezielles Servlet Ã¼bernimmt die Auslieferungen.</p><h3>Die Konfiguration im Projekt <em>userclient</em></h3><p>Das Projekt muss und sollte nicht &#8220;wissen&#8221;, dass es Ã¼ber Webstart irgendwo eingebunden wird. Daher sind keine Ã„nderungen nÃ¶tig. Wohl aber muss bekannt sein, wie die aktuelle bzw. die gewÃ¼nschte Version ist und ggf. das Maven-Repository der Deploys.</p><h3>Die Konfiguration im Projekt <em>webportal</em></h3><p><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/Bildschirmfoto-2010-09-04-um-18.52.33.png"><img
title="Maven" src="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/Bildschirmfoto-2010-09-04-um-18.52.33.png" alt="" width="170" height="50" /></a>Das <em>webportal</em> muss hingegen durchaus von der Existenz des <em>userclients</em> wissen, denn jenes es soll ja in diese Webanwendung integriert werden. Die Konfiguration besteht im Wesentlichen aus drei Schritten: JnlpDownloadServlet-AbhÃ¤ngigkeit einfÃ¼gen, Servlet in der web.xml registrieren und Build-Plugin in der pom.xml konfigurieren.</p><h4>JnlpDownloadservlet (pom.xml)</h4><p>Das Maven-Paket findet sich unter dem Namen <em>com.sun.java.jnlp</em> bzw.Â <em>jnlp-servlet</em> wieder. Als einfache AbhÃ¤ngigkeit ist es damit im Classpath und beispielsweise in der web.xml verwendbar. <a
href="http://coffeebreaks.org/tmp/maven-staging/webstart/site/jnlp101.html">Weitere Informationen.</a></p><pre class="brush: xml; title: ; notranslate">
&lt;dependency&gt;
    &lt;groupId&gt;com.sun.java.jnlp&lt;/groupId&gt;
    &lt;artifactId&gt;jnlp-servlet&lt;/artifactId&gt;
    &lt;version&gt;5.0&lt;/version&gt;
&lt;/dependency&gt;
</pre><h4>web.xml</h4><p>Zur Basiskonfiguration muss nur das Servlet registriert und mit einem URL-Pattern verknÃ¼pft werden. Das klingt trivial, und das ist es auch.</p><pre class="brush: xml; title: ; notranslate">
&lt;servlet&gt;
  &lt;servlet-name&gt;JnlpDownloadServlet&lt;/servlet-name&gt;
  &lt;servlet-class&gt;jnlp.sample.servlet.JnlpDownloadServlet&lt;/servlet-class&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
  &lt;servlet-name&gt;JnlpDownloadServlet&lt;/servlet-name&gt;
  &lt;url-pattern&gt;/webstart/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;</pre><p>Damit wird die URL domain.tld/context/webstart an das Servlet gemappt. Dadurch kann das Servlet auch auf &#8220;virtuelle Dateianfragen&#8221; reagieren, etwa nach Jar-Dateien ohne Versions-Qualifkation (obwohl sie als versionierte Artefakte vorliegen).</p><p>Die Konfiguration lÃ¤sst noch einige Dinge erweitern, verÃ¤ndern und tweaken (siehe Absatz Optimierungen und Verbesserungen). FÃ¼r den Haupteinsatzzweck &#8211; das Bereitstellen einer oder mehrerer Jars via Webstart ist das jedoch vÃ¶llig ausreichend.</p><p><a
href="http://download.oracle.com/javase/6/docs/technotes/guides/javaws/developersguide/downloadservletguide.html">Weitere Informationen bei Oracle/Java</a>.Â Und <a
href="http://mojo.codehaus.org/webstart/webstart-maven-plugin/examples/advanced_jnlp_download_servlet.html">weitere Informationen bei Codehaus</a>.</p><h4>pom.xml</h4><p>Neben der AbhÃ¤ngigkeit des <em>JnlpDownloadServlet</em> muss das eigentlichen <em>Maven Webstart Plugin</em> fÃ¼r seinen Einsatz konfiguriert werden. Das Build-Plugin benÃ¶tigt zudem noch ein Template (fÃ¼r die Generierung der Jnlp), die wird weiter unten beschrieben.</p><p>Zur Grundkonfiguration gehÃ¶rt:</p><ol><li>Wo liegt das Jnlp-Template?</li><li>Wie heiÃŸt der Ausgabename der Jnlp?</li><li>Welche AbhÃ¤ngigkeiten gibt es fÃ¼r das Paket &#8212; hier wÃ¤re das der <em>userclient</em>?</li></ol><p>Des Weiteren lÃ¤sst sich bestimmen, ob etwa weitere (transitive) AbhÃ¤ngigkeiten mitausgeliefert werden sollen (bei Webstart ist das wohl meist sinnvoll), ob die Ressourcen signiert werden sollen und ob alles nochmals komprimiert deployt werden soll. <a
href="http://mojo.codehaus.org/webstart/webstart-maven-plugin/examples/advanced_jnlp_download_servlet.html">Weitere Informationen</a>.</p><p>Prinzipiell ist man weder auf eine AbhÃ¤ngigkeit pro Paket/JNLP beschrÃ¤nkt noch auf eine JNLP pro Plugin-Call geschweige denn des gesamten Projekts. Ãœber das KonfigurationsschlÃ¼sselwort <em>commonJarResources</em> kÃ¶nnen sogar gemeinsam verwendete AbhÃ¤ngigkeiten definiert werden.</p><p>Da der userclient erweiterte Rechte benÃ¶tigt, mÃ¼ssen alle Classfiles und Jars signiert werden. Wahlweise verwendet dafÃ¼r einen vorhandenen Keystore oder erstellt einen neuen. FÃ¼r diese Zwecke wird pro Buildvorgang ein neuer Keystore angelegt, damit signiert und danach wieder gelÃ¶scht.</p><p>Die Execution ist sinnigerweise <em>process-resources</em> mit dem Goal <em>jnlp-download-servlet</em>, denn streng genommen sind es ja nur weitere Ressourcen.</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
  &lt;groupId&gt;org.codehaus.mojo.webstart&lt;/groupId&gt;
  &lt;artifactId&gt;webstart-maven-plugin&lt;/artifactId&gt;
  &lt;executions&gt;
    &lt;execution&gt;
      &lt;phase&gt;process-resources&lt;/phase&gt;
      &lt;goals&gt;
        &lt;goal&gt;jnlp-download-servlet&lt;/goal&gt;
      &lt;/goals&gt;
    &lt;/execution&gt;
  &lt;/executions&gt;
  &lt;configuration&gt;
    &lt;outputDirectoryName&gt;webstart&lt;/outputDirectoryName&gt;
    &lt;excludeTransitive&gt;false&lt;/excludeTransitive&gt;
    &lt;jnlpFiles&gt;
      &lt;jnlpFile&gt;
        &lt;templateFilename&gt;template.vm&lt;/templateFilename&gt;
        &lt;outputFilename&gt;UserClient.jnlp&lt;/outputFilename&gt;
        &lt;jarResources&gt;
          &lt;jarResource&gt;
            &lt;groupId&gt;org.example.userclient&lt;/groupId&gt;
            &lt;artifactId&gt;example-userclient&lt;/artifactId&gt;
            &lt;version&gt;1.0.0&lt;/version&gt;
            &lt;mainClass&gt;org.example.userclient.Main&lt;/mainClass&gt;
          &lt;/jarResource&gt;
        &lt;/jarResources&gt;
      &lt;/jnlpFile&gt;
    &lt;/jnlpFiles&gt;
    &lt;outputJarVersions&gt;true&lt;/outputJarVersions&gt;
    &lt;verbose&gt;false&lt;/verbose&gt;
  &lt;/configuration&gt;
&lt;/plugin&gt;
</pre><p>Mit dieser Konfiguration werden die Jar-Dateien inkl. AbhÃ¤ngigkeiten in das Verzeichnis <em>webstart</em> gepackt &#8212; remember? wie in der <em>web.xml</em>. Das Template heiÃŸt <em>template.vm</em> und ist per default unter <em>src/main/jnlp</em> zu finden. Dies lieÃŸe sich mit <em>templateDirectory</em> Ã¼berrschreiben. Der Name der Jnlp lautet <em>UserClient.jnlp</em>, damit ergibt sich die spÃ¤tere Web-Url: <em>http://example.org/context/webstart/UserClient.jnlp</em>. Die eigentlichen Ressourcen und AbhÃ¤ngigkeiten werden in <em>jarResources/jarResource</em> definiert. Bei einfachen Projekten wird dies nur eine Ressource sein, theoretisch wÃ¤ren auch mehrere mÃ¶glich. Die Konfiguration Ã¤hnelt der der <em>dependencies</em>.</p><h4>template.vm</h4><p>Im Prinzip ist das Template eine unfertige Jnlp. Sie wird durch das Maven Plugin mit den endgÃ¼ltigen Daten befÃ¼llt. Da bereits die pom.xml Ã¼ber einige Informationen wie Projektnamen, -beschreibung oder -url verfÃ¼gt, kÃ¶nnen so sehr einfach die Daten mit Ã¼bernommen werden. Man kann jedoch auch die Platzhalter entfernen &#8212; es ist eben nur ein Template.</p><p>Ein Beispiel kÃ¶nnte so aussehen:</p><pre class="brush: xml; title: ; notranslate">
&lt;jnlp spec=&quot;$jnlpspec&quot; codebase=&quot;$$codebase&quot;&gt;
  &lt;information&gt;
    &lt;title&gt;$project.Name&lt;/title&gt;
    &lt;vendor&gt;$project.Organization.Name&lt;/vendor&gt;
    &lt;homepage href=&quot;$project.Url&quot;/&gt;
    &lt;description&gt;$project.Description&lt;/description&gt;
    &lt;icon href=&quot;../resources/images/logo.png&quot;/&gt;
    &lt;icon href=&quot;../resources/images/logo.png&quot; kind=&quot;splash&quot;/&gt;
#if($offlineAllowed)
&lt;offline-allowed/&gt;
#end
  &lt;/information&gt;
#if($allPermissions)
&lt;security&gt;
&lt;all-permissions/&gt;
&lt;/security&gt;
#end
  &lt;resources&gt;
    &lt;j2se version=&quot;$j2seVersion&quot;/&gt;
$dependencies
  &lt;/resources&gt;
  &lt;application-desc main-class=&quot;$mainClass&quot;&gt;&lt;/application-desc&gt;
&lt;/jnlp&gt;
</pre><p>Mehr oder weniger simpel, oder? Eventuell sollte man die Adressen zum Logo anpassen (oder entfernen); gerade die letzte Zeile erzeugt einen netten Splashscreen (Ladebild) wÃ¤hrend dem Starten und Laden der Anwendung. Das ist immer gerne willkommen.</p><p>Wichtig: Im Gegensatz zu dem einen oder anderen Beispiel ist es hierbei wichtig, dass die Variable $$codebase heiÃŸt. Nicht etwa ${codebase}. Insgesamt sind in der JNLP &#8212; sofern man sie Ã¼ber das Servlet ausliefert &#8212; folgende Variablen verfÃ¼gbar: codebase, name, context und site.</p><h3>Optimierungen und Verbesserungen</h3><p
style="text-align: center;"><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/IMG_0095.jpg"><img
class="aligncenter size-large wp-image-1236" title="IMG_0095" src="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/IMG_0095-1024x475.jpg" alt="" width="768" height="356" /></a></p><h4>&#8220;Einmal signiert, bitte!&#8221;</h4><p>Um <em>all-permissions</em> nutzen zu kÃ¶nnen, mÃ¼ssen die Jars und Classfiles signiert werden. Das erreicht man, indem man unter dem XML-Knoten <em>configuration</em> einen Knoten <em>sign</em> anlegt, etwa:</p><pre class="brush: xml; title: ; notranslate">
&lt;sign&gt;
	&lt;keystore&gt;keystore.ks&lt;/keystore&gt;
	&lt;keypass&gt;pass&lt;/keypass&gt;
	&lt;storepass&gt;pass&lt;/storepass&gt;
	&lt;alias&gt;userclient&lt;/alias&gt;
	&lt;validity&gt;36500&lt;/validity&gt;
	&lt;dnameCn&gt;UserClient&lt;/dnameCn&gt;
	&lt;dnameOu&gt;Software Development&lt;/dnameOu&gt;
	&lt;dnameO&gt;The Example Networks&lt;/dnameO&gt;
	&lt;dnameL&gt;Cologne&lt;/dnameL&gt;
	&lt;dnameSt&gt;NRW&lt;/dnameSt&gt;
	&lt;dnameC&gt;DE&lt;/dnameC&gt;
	&lt;verify&gt;false&lt;/verify&gt;
	&lt;keystoreConfig&gt;
		&lt;delete&gt;true&lt;/delete&gt;
		&lt;gen&gt;true&lt;/gen&gt;
	&lt;/keystoreConfig&gt;
&lt;/sign&gt;
</pre><p>Hierbei wird der Keystore lokal erzeugt (keystoreConfig/gen ist true) und nach Gebrauch wieder gelÃ¶scht (keystoreConfig/delete ist true). SelbstverstÃ¤ndlich kann man hier auch a) noch einen Keystore-Generator (s.o.) nutzen oder einen fest konfigurierten, dauerhaften. Dann sollte man natÃ¼rlich die Konfiguration entsprechend anpassen.</p><h4>&#8220;Bitte Optional&#8221; &#8212; alles in ein Profil</h4><p>Die Profile in der <em>pom.xml</em> sind ein mÃ¤chtiges Werkzeug, um bestimmte Features zusammenzufassen. So kÃ¶nnte man das gesamte Build-Plugin in ein Profil &#8212; etwa mit dem Namen <em>with-webstart</em> &#8212; ablegen.</p><p>Selbst die AbhÃ¤ngigkeit zum JnlpDownloadServlet kann man dorthin verlagern &#8212; wenn man daran denkt, dass in diesem Falle auch die web.xml dynamisch erstellt werden soll.</p><h4>Macht der Properties</h4><p>Man kann die Gesamtkonfiguration um einiges komfortabler machen, indem man Properties einfÃ¼hrt und deren Standardwerte &#8220;oben&#8221; in der <em>pom.xml</em> definiert. Gute Kandidaten hierbei wÃ¤ren: userclient.version, keystore.file, keystore.keypass, keystore.storepass und keystore.alias.</p><h4>Noch mehr in Sachen Jnlp</h4><p>In der <em>web.xml</em> kann des Weiteren das verhalten des JnpDownloadServlet verÃ¤ndert werden. Ein Ãœberblick Ã¼ber einige MÃ¶glichkeiten: Â Mimetypen Ã¤ndern, Dateiendungen Ã¤ndern, weitere Mappings anlegen, spezielles Debugging.</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2010/09/04/howto-maven-wie-man-eine-ausfuhrbare-jar-in-eine-java-webanwendung-war-via-webstart-integriert/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Featurities meets Fallstrick: Die Spring Security 3.0 Konfigurationsodyssey</title><link>http://www.knallisworld.de/blog/2010/01/25/featurities-meets-fallstrick-die-spring-security-3-0-konfigurationsodyssey/</link> <comments>http://www.knallisworld.de/blog/2010/01/25/featurities-meets-fallstrick-die-spring-security-3-0-konfigurationsodyssey/#comments</comments> <pubDate>Mon, 25 Jan 2010 08:56:43 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Java]]></category> <category><![CDATA[Konfiguration]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Technik]]></category> <category><![CDATA[Technologie/IT]]></category> <category><![CDATA[Tipps]]></category> <category><![CDATA[security]]></category> <category><![CDATA[tomcat]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=944</guid> <description><![CDATA[Mit dem Majorrelease 3.0 wurde dem Modul Spring Security eine Menge von neuen Features angeignet. Spring Security ist die Modulkomposition, welches fÃ¼r das Java Framework Spring quasi die gesamte Authentifizierung, Autorisierung, Legitimierung jedwegiger Art ermÃ¶glicht. Leider wurden mit dem Release 2.x auf 3.0 eine Reihe von API-Changes vollzogen. Zugegeben, die waren auch sicher alle sinnvoll, [...]]]></description> <content:encoded><![CDATA[<p>Mit dem Majorrelease 3.0 wurde dem Modul Spring Security eine Menge von neuen Features angeignet. Spring Security ist die Modulkomposition, welches fÃ¼r das Java Framework Spring quasi die gesamte Authentifizierung, Autorisierung, Legitimierung jedwegiger Art ermÃ¶glicht.<img
class="alignright" src="http://www.springsource.com/sites/all/themes/spring09/logo.png" alt="" width="264" height="46" /></p><p>Leider wurden mit dem Release 2.x auf 3.0 eine Reihe von API-Changes vollzogen. Zugegeben, die waren auch sicher alle sinnvoll, weil Komponenten wie die Authentifizierung weiterÂ geteilt wurden und man somit wesentlich flexibler ist, neue Anforderungen zu ermÃ¶glichen (Baukastenprinzip). Aber die Dokumentation ist &#8211; gesamtheitlich betrachtet &#8211; irgendwie immer noch mies und oft nicht aktualisiert. Oder man findet im Internet einfach nur (alte) Beispiele.</p><p><img
class="alignleft" src="http://www.smileygarden.de/smilie/Crazy/65.gif" alt="" width="95" height="50" /></p><h3>Die http-Direktive</h3><p>Im Namespace von Spring Security existiert das Tagelement http, mit welchem man kurze, knappe und verstÃ¤ndliche Konfigurationen anlegen kann. Der Vorteil liegt klar auf der Hand: Man muss nicht alle Beans, Listener und Provider anlegen, denn das geschieht automatisch. Tja, wÃ¤ren da nicht ein paar EinschrÃ¤nkungen in der Funktionsvielfalt.</p><h3>Konkretes Beispiel: Remember Me</h3><p>Just wurde das <a
href="http://www.springsource.org/node/2280">Minor-Release 3.0.1 verÃ¶ffentlicht</a>, und nur wenige Tage spÃ¤ter zu erfahren, dass <a
href="http://forum.springsource.org/showthread.php?p=278747#post278747">Remember Me kaputt sei</a>. Egal, fahren wir erstmal weiter mit 3.0.0.</p><p>Laut Dokumentation ist es am einfachsten, wenn man die Direktive remember-me (Security Namespace) innerhalb der http-Direktive (Security Namespace) verwendet. Ohne irgendeine Angabe wird ein stinknormales, Cookie basiertes Tokenverfahren ohne (echten) privaten SchlÃ¼ssel verwendet. Reicht fÃ¼r den ersten Einsatz erstmal auf, soll ja erstmal funktionieren.</p><p><strong>FehlermÃ¶glichkeit 1a: Man loggt sich ein, und es passiert nichts (kein &#8220;RememberMe&#8221;-Cookie).</strong><br
/> LÃ¶sung: Wenn man einen eigenen Auth-Filter einsetzt, muss man diesem auch den RememberMe-Service &#8220;setten&#8221;. AuÃŸerdem muss der SecurityChainFilter (web.xml!) auch auf die login-Seite verweisen. Es dÃ¼rfen auch keine Filter bei der Konfigurierung von intercepted Urls (speziell hier: login, logout) gemacht werden.</p><p><strong>FehlermÃ¶glichkeit 1b: Es passiert noch immer nichts?</strong><br
/> LÃ¶sung: Vielleicht wurde vergessen, einen Parameternamen fÃ¼r den Request zu setzen. Der Standardname ist ein typischer Springname, der natÃ¼rlich unschÃ¶n ist. Und den kann man nicht Ã¼ber die RememberMe-Direktive setzen, also muss man eh einen eigenen Service definieren. BÃ¤m. Referenzierung geht dann zwar noch, aber fÃ¼r mehr ist die RememberMe-Direktive dann nicht mehr zu gebrauchen.</p><p><strong>FehlermÃ¶glichkeit 2a: Man besucht die Seite ohne Login, aber mit Cookie &#8211; und die Loginseite kommt (Log sagt kein gÃ¼ltiger Auth).</strong><br
/> LÃ¶sung: Man kann der Log trauen, wenn sie zwar beim Einloggen nun einen Token ablegt (kann man zum Beispiel sehr einfach mit <a
href="https://addons.mozilla.org/de/firefox/addon/573">diesem Firefox-Addon</a> inkl. Editor(!) verifizieren), dieses aber beim erneuten Besuchen der Seite (bzw. ohne JSPSESSION-Cookie) nicht verwendet bzw. wird nicht erkannt. Schlussendlich half u.a. das Umbenennen der Userservices-Bean in &#8220;userService&#8221;. AuÃŸerdem sollte die Loginseite keinen Filter/Access haben (s.o.) Lieber 2x prÃ¼fen!</p><p><strong>FehlermÃ¶glichkeit 2b: Es erscheint eine Ausnahme, dass der Key falsch sei.</strong><br
/> LÃ¶sung: Dazu muss man wissen: Sobald Â man eine individualisierte RememberMe-Konfiguration nutzt, wird auch der Key nicht mehr vernÃ¼nftig auf alle Komponenten (Provider, Filter, Manager) gesetzt. Beim Anlegen wird also der eigene Key verwendet, beim Auslesen der Standardkey. Yes! (s.o.)</p><p><strong>FehlermÃ¶glichkeit 3: Man besucht die Seite ohne Login, aber mit Cookie &#8211; aber wie in 2 nur die Loginseite.</strong><br
/> LÃ¶sung: Im Logger/Debugger kann man nun feststellen, dass zwar das Cookie gefunden wurde, das Token gefunden und validiert wurde aber dann keine Rechte existieren &#8211; aha? Wahrscheinlich fehlt im Provider noch ein zusÃ¤tzliches Setting der Komponenten. Am besten von RememberMe Service/Filter/Provider jeweils alle mÃ¶glichen Properties durchgehen. Jaja, wie gesagt.. <img
src='http://www.knallisworld.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p><p><strong>FehlermÃ¶glichkeit 4: Das Ausloggen (beispielsweise logout.html) hat nach Aktivierung von Rememberme plÃ¶tzlich keine Auswirkungen mehr.</strong><br
/> LÃ¶sung: Zwar wird die Seite gefunden, aber es wird kein &#8220;Logout&#8221; gemacht. Auch hier sollte man prÃ¼fen, ob ein SecurityChainFilter (web.xml) auch fÃ¼r die logout-Seite greift.</p><p><strong>FehlermÃ¶glichkeit 5: Das Besuchen der Seite wirft einen Fehler (ggf. &#8220;mit weiÃŸer Seite&#8221;), dass keine neue Session erstellt werden kann.</strong><br
/> LÃ¶sung: Richtig, nach einem Request ist ja dann auch zu spÃ¤t. Das Attribut create-session in der Direktive http sollte daher auf &#8220;ifRequeried&#8221; gestellt sein.</p><h3>Fazit:</h3><ul><li>SecurityChainFilter immer prÃ¼fen</li><li>Intercepted Urls prÃ¼fen</li><li>RememberMe-Direktive innerhalb der http-Direktive ist quasi abgesehen von der services-ref unbrauchbar.</li></ul><h3>Anmerkung:</h3><p>NatÃ¼rlich kann man sich das Problem mit den SecurityChains vom Hals schaffen, indem man stupide ein /* filtert. Das hat jedoch zur Auswirkung, das Spring Security auch jeden verdammten Request anguckt; bei zusÃ¤tzlichen (statischen) Inhalten wie Javascript, Stylesheets, Bildern, Flash u.Ã¤. ist das ein Overhead, der unnÃ¶tig ist.</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2010/01/25/featurities-meets-fallstrick-die-spring-security-3-0-konfigurationsodyssey/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Java-Swing-Komponenten als Bild / Snapshot</title><link>http://www.knallisworld.de/blog/2009/05/29/java-swing-komponenten-als-bild-snapshot/</link> <comments>http://www.knallisworld.de/blog/2009/05/29/java-swing-komponenten-als-bild-snapshot/#comments</comments> <pubDate>Fri, 29 May 2009 18:08:02 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Diplomarbeit.. ftw!]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[Technologie/IT]]></category> <category><![CDATA[Tipps]]></category> <category><![CDATA[export]]></category> <category><![CDATA[image]]></category> <category><![CDATA[snapshot]]></category> <category><![CDATA[swing]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=722</guid> <description><![CDATA[FÃ¼r unsere Anwendung (Ã¤hm, halt Diplomarbeit ftw!) wollte ich eine Export-als-Bild-Funktion fÃ¼r die Anzeige des aktuellen Graphen einbauen. Dabei handelt es sich um eine JComponent, die Ã¼ber das JUNG-Framework dargestellt wird. WÃ¤hrend jetzt Apple-Benutzer leichtfertig Ã¼ber dieses Feature lachen kÃ¶nnen, ist dies fÃ¼r Hauptzielgruppe der Anwendung (also Windowsbenutzer) eine sinnvolle Funktion. Es hat sicherlich wenig [...]]]></description> <content:encoded><![CDATA[<p>FÃ¼r unsere Anwendung (Ã¤hm, halt Diplomarbeit ftw!) wollte ich eine Export-als-Bild-Funktion fÃ¼r die Anzeige des aktuellen Graphen einbauen. Dabei handelt es sich um eine JComponent, die Ã¼ber das JUNG-Framework dargestellt wird.</p><p>WÃ¤hrend jetzt Apple-Benutzer leichtfertig Ã¼ber dieses Feature lachen kÃ¶nnen, ist dies fÃ¼r Hauptzielgruppe der Anwendung (also Windowsbenutzer) eine sinnvolle Funktion. Es hat sicherlich wenig Sinn, umstÃ¤ndlich einen Komplett-Screenshot anfertigen zu mÃ¼ssen.. viel einfacher kann das Programm das ja selbst machen.<br
/> Es gibt eine Reihe von Suchtreffern in Google, die durchaus lesenswert sind.</p><p>Die Grundidee ist, dass man sich selbst ein Graphics-Objekt erstellt und dann die JComponent darauf arbeiten lÃ¤sst. Im Falle von Swing ist dies idR vom Framework vorgegeben (nÃ¤mlich fÃ¼r den Bildschirm), hier aber wollen wir ja ein eigenes Bild haben. Die HÃ¶he und Breite ist in den meisten FÃ¤llen von der Komponente zu erfragen.<br
/> <code>BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);</code></p><p>AnschlieÃŸend brauchen wir das zugehÃ¶rige Graphics-Objekt, denn damit arbeiten die Paint-Methoden. Clue Nummer 1: Man kÃ¶nnte in Versuchung kommen, und einfach getGraphics() zu nehmen &#8211; ist ja auch naheliegend. TatsÃ¤chlich erstellt das aber auch nur ein Graphics-Objekt, wÃ¤hrend <code>createGraphics()</code> ein Graphics2D-Objekt erstellt. Und in den meisten FÃ¤llen braucht man das auch.<br
/> <code>Graphics2D g = bi.createGraphics();</code></p><p>AnschlieÃŸend muss man sich entscheiden, welche Zeichenroutine man anstoÃŸen will. Es gibt prinzipiell folgende MÃ¶glichkeiten: p<code>aint(Graphics)</code>, <code>paintComponent(Graphics)</code> und <code>paintAll(Graphics)</code>. Sofern <code>paintComponent()</code> ausreicht, diese nutzen. Im Falle des JUNG-Graphen mit verschiedenen Subelementen und eigenem Renderer funktioniert jedoch nur <code>paintAll(Graphics)</code> auf allen System zuverlÃ¤ssig. WÃ¤hrend <code>paint(Graphics)</code> unter MacOS und Linux noch funktioniert, produziert es unter Windows unschÃ¶ne Ergebnisse.</p><p>AnschlieÃŸend kann man mit dem statischen Aufruf <code>ImageIO.write(bi, "png", file);</code> das gesamte Bild als &#8212; hier PNG &#8212; speichern. Achtung: Dies ist eine JavaSE6-Klasse, in den VorgÃ¤ngern benÃ¶tigt man dann den Umweg Ã¼ber FileStream &amp; Co.</p><p>[1] <a
href="http://jung.sourceforge.net/doc/JUNGVisualizationGuide.html">jung.sourceforge.net</a><br
/> [2] <a
href="http://java.sun.com/docs/books/tutorial/2d/images/saveimage.html">java.sun.com</a></p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2009/05/29/java-swing-komponenten-als-bild-snapshot/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Code-Coverage, Eclipse, jUnit</title><link>http://www.knallisworld.de/blog/2009/05/14/code-coverage-eclipse-junit/</link> <comments>http://www.knallisworld.de/blog/2009/05/14/code-coverage-eclipse-junit/#comments</comments> <pubDate>Wed, 13 May 2009 22:27:38 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Diplomarbeit.. ftw!]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[Technologie/IT]]></category> <category><![CDATA[Testing]]></category> <category><![CDATA[c0]]></category> <category><![CDATA[code coverage]]></category> <category><![CDATA[junit]]></category> <category><![CDATA[test]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=707</guid> <description><![CDATA[Joa, es ist wieder Zeit fÃ¼r einen Artikel in der Java/DA-Reihe. Als erstes und sehr einfach zu testendes Kriterium gilt beim Testen die Code Coverage. Eigentlich sehr simpel, denn es quantifiziert nur die Code-Coverage, also von wie vielen Zeilen Code (Instructions) tatsÃ¤chlich wie viele (bzw. welche) auch ausgefÃ¼hrt werden. Da man dies natÃ¼rlich gerne automatisiert [...]]]></description> <content:encoded><![CDATA[<p><img
class="size-thumbnail wp-image-709 alignleft" title="eclemma-1" src="http://www.knallisworld.de/blog/wp-content/uploads/2009/05/eclemma-1-150x150.png" alt="eclemma-1" width="150" height="150" /></p><p>Joa, es ist wieder Zeit fÃ¼r einen Artikel in der <a
href="http://www.knallisworld.de/blog/category/diplomarbeit-ftw/">Java/DA-Reihe</a>.</p><p>Als erstes und sehr einfach zu testendes Kriterium gilt beim Testen die Code Coverage. Eigentlich sehr simpel, denn es quantifiziert nur die Code-Coverage, also von wie vielen Zeilen Code (Instructions) tatsÃ¤chlich wie viele (bzw. welche) auch ausgefÃ¼hrt werden. Da man dies natÃ¼rlich gerne automatisiert machen mÃ¶chte, sind Tests wie mit jUnit ideal. Aber, auch normale Anwendungen sind mitzutracen und den Codecoverage ist zu ermitteln.</p><p><img
class="size-thumbnail wp-image-710 alignright" title="eclemma-2" src="http://www.knallisworld.de/blog/wp-content/uploads/2009/05/eclemma-2-150x150.png" alt="eclemma-2" width="150" height="150" /></p><p>FÃ¼r Eclipse gibt es dazu ein prima Plugin namens <a
href="http://www.eclemma.org/">EclEmma</a>. Und auch schnell Ã¼ber die Update-URL im Manager installiert. EclEmma dient dabei als eine Art Wrapper fÃ¼r verschiedene Launchtypen &#8211; also beispielsweise als normale Applikation oder einen jUnit-Test bzw eine ganze Suite (Plugins). Das Ergebnis wird nach Beendigung des Programms/Tests innerhalb von Eclipse in einer Baumstruktur dargestellt; sehr schÃ¶n ist auch die grafische Hervorhebung direkt im Sourcecode. Alternativ kann man sich das Ergebnis auch als HTML exportieren lassen.</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2009/05/14/code-coverage-eclipse-junit/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Yaml, Yuml, ja was denn?</title><link>http://www.knallisworld.de/blog/2009/05/09/yaml-yuml-ja-was-denn/</link> <comments>http://www.knallisworld.de/blog/2009/05/09/yaml-yuml-ja-was-denn/#comments</comments> <pubDate>Sat, 09 May 2009 18:27:46 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Allgemeines]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[Technologie/IT]]></category> <category><![CDATA[datenbank]]></category> <category><![CDATA[uml]]></category> <category><![CDATA[yaml]]></category> <category><![CDATA[yuml]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=702</guid> <description><![CDATA[FÃ¼r groÃŸe Datenbanklayouts braucht man irgendwann Diagramme; die werden entweder mittels &#8220;ER-Syntax&#8221; oder im &#8220;modernen&#8221; UML entwickelt. Bei kleineren Projekten oder Veranschaulichungen kann so ein UML-Editor aber schnell zum exponentiellen Overhead werden, weil es sich einfach weder lohnt noch in der &#8220;Projektlage&#8221; jeder damit genug auskennt. In diese Richtung stoÃŸt yuml.me, die mit Hilfe einer [...]]]></description> <content:encoded><![CDATA[<p>FÃ¼r groÃŸe Datenbanklayouts braucht man irgendwann Diagramme; die werden entweder mittels &#8220;ER-Syntax&#8221; oder im &#8220;modernen&#8221; UML entwickelt. Bei kleineren Projekten oder Veranschaulichungen kann so ein UML-Editor aber schnell zum exponentiellen Overhead werden, weil es sich einfach weder lohnt noch in der &#8220;Projektlage&#8221; jeder damit genug auskennt. In diese Richtung stoÃŸt <a
href="http://yuml.me">yuml.me</a>, die mit Hilfe einer wirklich einfachen Syntax wunderschÃ¶ne UML-Diagramme zaubern. Die sind zwar ggf. nicht 100% UML2-tauglich (bzw. haben nicht alle Funktionen des Standards), aber das Ergebnis ist durchaus sehenswert und fÃ¼r die meisten kleinen Dinge mehr als ausreichend.</p><p>Auf Seite der Konfiguration ist es natÃ¼rlich blÃ¶d, dauernd mit diesen URLs zu hantieren. Aber, es gibt fÃ¼r alles eine LÃ¶sung: MMan nehme <a
href="http://yaml.org">YAML</a>. Sehr hÃ¼bscher Syntax, fast ohne Overhead und damit viel Platz fÃ¼r das eigentlich Wesentliche: Informationen und Daten. Das <a
href="http://www.doctrine-project.org">Doctine Project</a>, ein PHP Object Relational Mapper, nutzt zur Definition von Datenbankschemata auch eine YAML-Struktur (<a
href="http://www.doctrine-project.org/documentation/cookbook/1_0/en/code-igniter-and-doctrine#start-using-doctrine">Beispiel</a>).</p><p>Da ich weder Lust auf PHP coden noch das Aufsetzen eines Java-Servers hatte, habe ich eine kleine, feine Java-Anwendung geschrieben. Sie konvertiert ein DB-Schema in YAML in ein Bild (zeigt dieses an) und lÃ¤sst auf Wunsch dieses Speichern.</p><p>Downloads (benÃ¶tigt Java 1.6):</p><ol><li>AusfÃ¼hrbare Jar <a
href="http://www.knallisworld.de/java/kAml.jar">kAml.jar</a></li><li><a
href="http://www.knallisworld.de/java/kAml.dmg">Dmg Imagefile</a> alsAnwendung fÃ¼r Mac OS X</li></ol> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2009/05/09/yaml-yuml-ja-was-denn/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Nullpointer-Exceptions verhindern</title><link>http://www.knallisworld.de/blog/2009/05/08/nullpointer-exceptions-verhindern/</link> <comments>http://www.knallisworld.de/blog/2009/05/08/nullpointer-exceptions-verhindern/#comments</comments> <pubDate>Fri, 08 May 2009 19:58:13 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Diplomarbeit.. ftw!]]></category> <category><![CDATA[Empfehlungen]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[exception]]></category> <category><![CDATA[nullpointer]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=698</guid> <description><![CDATA[DZone.com sei Dank: Gestern &#8216;mal wieder einen lesenswerten Artikel gefunden. Diesmal: How to Avoid NullPointerExceptions (NPE)?. Vor allem der letzte Absatz Common Practices ist zu empfehlen.]]></description> <content:encoded><![CDATA[<p><a
href="http://www.dzone.com/links/index.html">DZone</a>.com sei Dank: Gestern &#8216;mal wieder einen lesenswerten Artikel gefunden. Diesmal: <a
href="http://isagoksu.com/2009/development/java/how-to-avoid-nullpointerexceptions-npe/">How to Avoid NullPointerExceptions (NPE)?</a>. Vor allem der letzte Absatz Common Practices ist zu empfehlen.</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2009/05/08/nullpointer-exceptions-verhindern/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Starten einer JAR unter Mac OSX &#8211; Bad version number?</title><link>http://www.knallisworld.de/blog/2009/05/08/starten-einer-jar-unter-mac-osx-bad-version-number/</link> <comments>http://www.knallisworld.de/blog/2009/05/08/starten-einer-jar-unter-mac-osx-bad-version-number/#comments</comments> <pubDate>Fri, 08 May 2009 11:26:58 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Diplomarbeit.. ftw!]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[MacOS X]]></category> <category><![CDATA[Technik]]></category> <category><![CDATA[Tipps]]></category> <category><![CDATA[macosx]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=696</guid> <description><![CDATA[Wir hatten dieses Thema bereits indirekt durch den ApplicationBundler im Beitrag vorletzter Woche besprochen.. aber hier nochmal zum eigentlichen Problem und dessen LÃ¶sung. Der Fehler verursacht die aktuell ausgewÃ¤hlte Java-Version (und das ist bei den meisten Leuten der Standard Java 1.5.0). Wenn jedoch die Jar mit Java 1.6 kompiliert wurde, kann der 1.5-Loader damit nichts [...]]]></description> <content:encoded><![CDATA[<p>Wir hatten dieses Thema bereits indirekt durch den ApplicationBundler im Beitrag vorletzter Woche besprochen.. aber hier nochmal zum eigentlichen Problem und dessen LÃ¶sung.</p><p>Der Fehler verursacht die aktuell ausgewÃ¤hlte Java-Version (und das ist bei den meisten Leuten der Standard Java 1.5.0). Wenn jedoch die Jar mit Java 1.6 kompiliert wurde, kann der 1.5-Loader damit nichts anfangen bzw. schÃ¼tzt aus naheliegenden GrÃ¼nden vor der AusfÃ¼hrung. Zwar ist auf Mac OS X System der Version 10.5 auch Java 1.6 installiert, dieses ist jedoch kein Standard.</p><p>Es gibt dafÃ¼r nun drei MÃ¶glichkeiten:</p><ol><li>Der Benutzer startet die JAR nicht mit Doppelklick bzw. dem Kommando &#8220;java -jar JarFile.jar&#8221; sondern mit der direkten Angabe im Frameworkverzeichnis.. diese LÃ¶sung ist inakzeptabel.</li><li>Der Benutzer stellt seine Default-JVM auf 1.6 um.. das machen die Entwickler eh, aber der Benutzer wird auch damit Ã¼berfordert sein. Auch keine akzeptable LÃ¶sung.</li><li>Man erstellt eine Mac-Application mit entsprechenden Application-Bootloader und einer Art Manifest, wo eingestellt wird, welche Java-Version verwendet werden muss. Damit findet sich Java 1.6 sogar dann, wenn man als Default 1.4 eingestellt hat. AuÃŸerdem hat es den positiven Nebeneffekt, dass die &#8220;technische&#8221; Jar vor dem Benutzer durch ein Anwendungsymbol kaschiert wird.</li></ol> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2009/05/08/starten-einer-jar-unter-mac-osx-bad-version-number/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Non-Java exception raised, not handled (Error creating CGSWindow)</title><link>http://www.knallisworld.de/blog/2009/05/07/non-java-exception-raised-not-handled-error-creating-cgswindow/</link> <comments>http://www.knallisworld.de/blog/2009/05/07/non-java-exception-raised-not-handled-error-creating-cgswindow/#comments</comments> <pubDate>Thu, 07 May 2009 15:18:14 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Aktuelles]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[MacOS X]]></category> <category><![CDATA[cgswindow]]></category> <category><![CDATA[jung]]></category> <category><![CDATA[macosx]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=687</guid> <description><![CDATA[Update: It seems that MacWidgets causes this problem. In the applications main frame I added the line If I disable (comment out) this line there will no exceptions. What a.. The structure of components: One Mainframe with BorderLayout (Toolbar, Sidebar and MainContent). The MainContent contains eventually the graph, the corresponding satellite component is in the [...]]]></description> <content:encoded><![CDATA[<p><strong>Update: It seems that <a
href="http://code.google.com/p/macwidgets/">MacWidgets</a> causes this problem.</strong> In the applications main frame I added the line</p><pre class="brush: java; title: ; notranslate">MacUtils.makeWindowLeopardStyle(getRootPane());</pre><p>If I disable (comment out) this line there will no exceptions. What a..</p><p>The structure of components: One Mainframe with BorderLayout (Toolbar, Sidebar and MainContent). The MainContent contains eventually the graph, the corresponding satellite component is in the sidebar.</p><p>Original post:</p><p>I had already posted about it <a
href="http://www.knallisworld.de/blog/2009/05/01/mac-os-x-non-java-exception-raised/#content">last week</a>. But now it seems that is was not a reasonable solution.</p><p>I have a java swing application which uses standard java swing elements and the jung2 graph framework visualizing graphs. The application is developed under java 1.6 and mac os x 10.5.6.</p><p>The actual problem is that since yesterday the AWT-Eventthread crashed, for example like this:</p><pre class="brush: plain; title: ; notranslate">Thu May 7 15:04:28 X.localdomain java[2002]Â : CGSResolveShmemReference : reference offset (65232) exceeds bounds (32768) on shmem obj 0x257e
Exception in thread &quot;AWT-EventQueue-0&quot; java.lang.RuntimeException: Non-Java exception raised, not handled! (Original problem: Error (1000) creating CGSWindow)
at apple.awt.CRenderer.doRect(Native Method)
at apple.awt.OSXSurfaceData.doRect(OSXSurfaceData.java:1247)
at apple.awt.CRenderer.fillRect(CRenderer.java:157)
at apple.awt.CRenderer.fillRect(CRenderer.java:145)
at sun.java2d.pipe.ValidatePipe.fillRect(ValidatePipe.java:58)
at sun.java2d.SunGraphics2D.fillRect(SunGraphics2D.java:2501)
at edu.uci.ics.jung.visualization.BasicVisualizationServer.renderGraph(BasicVisualizationServer.java:341)
at edu.uci.ics.jung.visualization.BasicVisualizationServer.paintComponent(BasicVisualizationServer.java:321)
at javax.swing.JComponent.paint(JComponent.java:1027)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1036)
at javax.swing.JComponent._paintImmediately(JComponent.java:5096)
at javax.swing.JComponent.paintImmediately(JComponent.java:4880)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:749)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:679)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:659)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:300)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:210)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:200)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:195)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:187)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)</pre><p>This happens in the event thread, so the application is &#8220;still&#8221; useable. Well, of course, the graph painting is a mess.</p><p>After googling, I found some solutions:</p><ol><li>Execute the file access rights (permissions)-fix via disk utilities &amp; reboot the maschine. Yes, this will fix the problem for some starts, but then.. what a dejavu.</li><li>Assure that the paint-process is not outside of the awt-thread.. yes it is. See trace. (Link <a
href="http://developer.apple.com/samplecode/simpleJavaLauncher/index.html#//apple_ref/doc/uid/DTS10000688">developer.apple.com</a>)</li><li>Exclude the SWT jar.. well, I do not use this and I have not include it. (Link <a
href="http://publicobject.com/2005/12/java-5-on-mac-crashing-burning-blame.html">publicobject.com</a>)</li><li>Use not the apple ui manager.. well, i replace the manager for the components of jung, i disabled my own selfwritten graph vertex renderer.. no changes. No less exceptions, nothing.</li></ol><p>Perhaps this could be an issue by jung, but..</p><ul><li>why only on this mac &#8211; but no error/exception on others systems like windows and linux? Also I have a 2 years older macbookpro.. no problem there.</li><li>why, or some time,  is there no problem after fixing the file access rights (permissions) and rebooting the machine?</li></ul><p>Currently, I have no solution.. the exeptions raises while painting the graph (which uses many paint()/Graphs objects ofc) moving/zooming it. I was able to catch some of the strange exceptions overriding the default visualizerviewer (by jung) and put in a small try-catch-wrapper of the corresponding method (here renderGraph). But other exceptions raised within javax.swing.Component and so on&#8230;</p><p>And.. how strange: the line</p><p>Thu May Â 7 15:04:28 X.localdomain java[2002] &lt;Warning&gt;: CGSResolveShmemReference : reference offset (65232) exceeds bounds (32768) on shmem obj 0x257e</p><div>is not an output by the java exception but from the failed native method. The numbers: 32768 (=2^15) and 65232 (2^16 -4). 64bit-problem?</div><p>I&#8217;m very appreciate if someone has an idea or solution.</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2009/05/07/non-java-exception-raised-not-handled-error-creating-cgswindow/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Mac OS X: Non-Java exception raised.</title><link>http://www.knallisworld.de/blog/2009/05/01/mac-os-x-non-java-exception-raised/</link> <comments>http://www.knallisworld.de/blog/2009/05/01/mac-os-x-non-java-exception-raised/#comments</comments> <pubDate>Fri, 01 May 2009 18:07:32 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Allgemeines]]></category> <category><![CDATA[exception]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[mac os x]]></category> <category><![CDATA[zugriffsrechte]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=682</guid> <description><![CDATA[BÃ¶ses Erwachen nach einem Reboot: Auf einmal funktionierte Swing nicht mehr richtig, Components mit eigener paint()-Methode funktionierten gar nicht oder verursachten die abenteuerlichsten Zeichnungen. SchÃ¤tzungsweise nach dem Installieren des Developerpacks habe ich irgendwann letzte Woche (&#62; 9 Tage) nicht den Mac nicht neu gestartet.. dann wÃ¤re mir das frÃ¼her aufgefallen. Der genaue Wortlaut der Meldung: [...]]]></description> <content:encoded><![CDATA[<p>BÃ¶ses Erwachen nach einem Reboot: Auf einmal funktionierte Swing nicht mehr richtig, Components mit eigener paint()-Methode funktionierten gar nicht oder verursachten die abenteuerlichsten Zeichnungen. SchÃ¤tzungsweise nach dem Installieren des Developerpacks habe ich irgendwann letzte Woche (&gt; 9 Tage) nicht den Mac nicht neu gestartet.. dann wÃ¤re mir das frÃ¼her aufgefallen.</p><p>Der genaue Wortlaut der Meldung: exception: java.lang.RuntimeException: Non-Java exception raised, not handled! (Original problem: Error (10000) creating CGSWindow)</p><p>Nach ein bisschen Recherche mit dieser Meldung stieÃŸ ich dann auf diesen <a
href="http://help.ravensoundsoftware.com/forum/showthread.php?p=290">Thread</a>, in welchem auch die LÃ¶sung parat steht: Zugriffsrechte reparieren lassen und rebooten. Warum man rebooten muss (man muss es, habe es ausprobiert), entzieht sich meiner Kenntnisse; vielleicht werden manche Ressourcen nur einmal geÃ¶ffnet?</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2009/05/01/mac-os-x-non-java-exception-raised/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>TestSuites in Eclipse mit jUnit 4 (Nachtrag)</title><link>http://www.knallisworld.de/blog/2009/04/23/testsuites-in-eclipse-mit-junit-4/</link> <comments>http://www.knallisworld.de/blog/2009/04/23/testsuites-in-eclipse-mit-junit-4/#comments</comments> <pubDate>Thu, 23 Apr 2009 14:57:13 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Diplomarbeit.. ftw!]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[Testing]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[tests]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=676</guid> <description><![CDATA[Das Problem: Wenn man in einem Projekt eine Reihe von Testcases gemacht hat, dann sind diese meist (natÃ¼rlich) auf verschiedene Packages verteilt. AuÃŸerdem gibt es ja reine Komponententests als auch Usecasetests (soweit mÃ¶glich), oder das Testen zweier oder mehrere Komponenten im Verbund. Schlussendlich also eine groÃŸe Anzahl von &#8220;TestCase&#8221;-Klassen, die jeweils mehrere Tests haben. Ideal [...]]]></description> <content:encoded><![CDATA[<p>Das Problem: Wenn man in einem Projekt eine Reihe von Testcases gemacht hat, dann sind diese meist (natÃ¼rlich) auf verschiedene Packages verteilt. AuÃŸerdem gibt es ja reine Komponententests als auch Usecasetests (soweit mÃ¶glich), oder das Testen zweier oder mehrere Komponenten im Verbund. Schlussendlich also eine groÃŸe Anzahl von &#8220;TestCase&#8221;-Klassen, die jeweils mehrere Tests haben. Ideal wÃ¤re also, wenn man diese ganzen Testcases zusammenpacken kÃ¶nnte.. und dann auch ausfÃ¼hren kÃ¶nnte.</p><p>jUnit bietet (in Eclipse) dafÃ¼r die Option TestSuite an. Eine TestSuite ist ja auch genau das, was wir brauchen. Leider zeigt der Wizard keine unserer TestCases an.. warum? Nach einigem Recherchieren (viele Suchergebnisse zeigen indirekt noch auf jUNit 3.8) ist die Frage eigentlich simpel gelÃ¶st.. wenn man denn weiÃŸ, wie <img
src='http://www.knallisworld.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p><p>Als erstes mÃ¼ssen alle TestCase-Klassen (d.h. hier die Klasse MyTests, die @Test-Methoden enthÃ¤lt) eine neue Methode erhalten:</p><p><code><span> </span><span>public</span> <span>static</span> junit.framework.Test suite() {<br
/> <span> return</span> <span>new</span> JUnit4TestAdapter(MyTests.<span>class</span>);<br
/> }</code></p><p>Damit erkennt der Wizard fÃ¼r eine TestSuite nun auch jene Klassen.</p><p>Falls man es lieber manuell machen mÃ¶chte (Beispiel):Â <code>suite.addTest(MyTests.suite());</code>f</p><p>Es ist Ã¼brigens kein Problem, TestSuites zu verschachteln &#8211; dafÃ¼r einfach das Prozedere &#8220;wiederholen&#8221; bzw. <code>suite.addTest(MyOtherSuite.suite())</code> schreiben. Tipp: Es gibt die Ã¤uÃŸerst hilfreiche Methode <code>suite.setName(string)</code> &#8211; damit man sich in der jUnit-Baumansicht nicht verwirrt.</p><p><strong>Nachtrag:</strong></p><p>Wesentlich eleganter ist natÃ¼rlich der Annotation-Weg. Die &#8220;SuperTestSuite&#8221; braucht &#8220;nur&#8221; so auszusehen:</p><p><code><span>@RunWith</span>(Suite.<span>class</span>)<br
/> <span>@SuiteClasses</span>( { MySuite1.<span>class</span>, MySuite2.<span>class</span>,Â MySuite3.<span>class</span> })</code></p><p><code><span>public</span> <span>class</span> AllTests {<br
/> }</p><p></code></p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2009/04/23/testsuites-in-eclipse-mit-junit-4/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> </channel> </rss>
