<?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>everflux &#187; Java</title>
	<atom:link href="http://everflux.de/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://everflux.de</link>
	<description>Java, Ubuntu - und das Leben.</description>
	<lastBuildDate>Sun, 05 Feb 2012 12:28:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
	<atom:link rel="hub" href="http://superfeedr.com/hubbub" />
			<item>
		<title>Confluence 4 mit JDK 7</title>
		<link>http://everflux.de/confluence-4-mit-jdk-7-1901/</link>
		<comments>http://everflux.de/confluence-4-mit-jdk-7-1901/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 21:41:09 +0000</pubDate>
		<dc:creator>everflux</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://everflux.de/?p=1901</guid>
		<description><![CDATA[Atlassian ist mit Confluence der Marktführer was Enterprise-Wiki-Software angeht. Bisher wird jedoch lediglich Java 6 offiziell supported, was schade ist, denn mit Java 7 hat die JVM eine Menge Updates bekommen und benötigt erheblich weniger Speicher im Betrieb und Last und auch im Bereitschaftszustand. Mit dem offiziellen Release von Confluence 4 und Java 7 ist [...]<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/confluence-4-mit-jdk-7-1901/">Confluence 4 mit JDK 7</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Atlassian ist mit Confluence der Marktführer was Enterprise-Wiki-Software angeht. Bisher wird jedoch lediglich Java 6 offiziell supported, was schade ist, denn mit Java 7 hat die JVM eine Menge Updates bekommen und benötigt erheblich weniger Speicher im Betrieb und Last und auch im Bereitschaftszustand.<br />
Mit dem offiziellen Release von Confluence 4 und Java 7 ist es nunmehr auch an der Zeit beides zu vereinigen. Leider lief das ganze nicht so ganz problemlos, nach dem Umstellen des JDK gab es eine Menge Fehlermeldungen im Confluence Logfile und auch die Darstellung war offensichtlich defekt.<br />
Die Loesung sah schliesslich so aus:</p>
<ul>
<li>Zum einen der OSGi Laufzeitumgebung von Confluence mitteilen, welche Klassen ueber den Tomcat Classloader geladen werden sollen <code>-Datlassian.org.osgi.framework.bootdelegation=META-INF.services,com.yourkit,com.yourkit.*,com.jprofiler,com.jprofiler.*,org.apache.xerces,org.apache.xerces.*,org.apache.xalan,org.apache.xalan.*,sun.*,com.sun.jndi.,com.icl.saxon,com.icl.saxon.*,javax.servlet,javax.servlet.*,com.sun.xml.bind.*</code></li>
<li>Zum anderen einmal im Confluence Homeverzeichnis den OSGi Cache leeren <code>cd $confluence-home/plugins-osgi-cache<br />
rm -r *<br />
</code></li>
</ul>
<p>Beim nächsten Start funktioniert Confluence sogar mit dem aktuellen Tomcat 7 &#8211; verbraucht weniger RAM und ist subjektiv auch noch schneller.</p>
<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/confluence-4-mit-jdk-7-1901/">Confluence 4 mit JDK 7</a></p>
<p>Ähnliche Beiträge:<ol>
<li><a href='http://everflux.de/confluence-inhalte-aus-pdf-und-druckansicht-verbergen-1443/' rel='bookmark' title='Confluence: Inhalte aus PDF und Druckansicht verbergen'>Confluence: Inhalte aus PDF und Druckansicht verbergen</a></li>
<li><a href='http://everflux.de/java-networking-probleme-mit-debian-testing-1468/' rel='bookmark' title='Java Networking Probleme mit Debian (testing)'>Java Networking Probleme mit Debian (testing)</a></li>
<li><a href='http://everflux.de/web-xml-tag-reihenfolge-relevant-1717/' rel='bookmark' title='web.xml Tag Reihenfolge: Relevant!'>web.xml Tag Reihenfolge: Relevant!</a></li>
<li><a href='http://everflux.de/netbeans-package-javax-servlet-jsp-does-not-exist-cannot-find-symbol-1751/' rel='bookmark' title='Netbeans: &#8220;package javax.servlet.jsp does not exist&#8221; (cannot find symbol)'>Netbeans: &#8220;package javax.servlet.jsp does not exist&#8221; (cannot find symbol)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://everflux.de/confluence-4-mit-jdk-7-1901/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu Oneiric: Netbeans Master-Passwort / Keyring Integration</title>
		<link>http://everflux.de/ubuntu-oneiric-netbeans-master-passwort-keyring-integration-1896/</link>
		<comments>http://everflux.de/ubuntu-oneiric-netbeans-master-passwort-keyring-integration-1896/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 08:40:31 +0000</pubDate>
		<dc:creator>everflux</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux/OpenSource]]></category>
		<category><![CDATA[ubuntuusers.de]]></category>
		<category><![CDATA[gnome]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[oneiric]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://everflux.de/?p=1896</guid>
		<description><![CDATA[Schon in frühen Beta Versionen von Ubuntu 11.04 / Oneiric hat Netbeans mich ständig nach einem &#8220;Master Password&#8221; gefragt, mit dem gespeicherte Passwörter von Netbeans gegen unbefugten Zugriff verschlüsselt werden. Das ist nervig, denn bisher ging es auch ohne &#8211; dabei nutzt Netbeans die von modernen Betriebssystemen bereitgestellte native Infrastruktur um Passwörter zu speichern. (z.B. [...]<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/ubuntu-oneiric-netbeans-master-passwort-keyring-integration-1896/">Ubuntu Oneiric: Netbeans Master-Passwort / Keyring Integration</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Schon in frühen Beta Versionen von Ubuntu 11.04 / Oneiric hat Netbeans mich ständig nach einem &#8220;Master Password&#8221; gefragt, mit dem gespeicherte Passwörter von Netbeans gegen unbefugten Zugriff verschlüsselt werden.</p>
<p>Das ist nervig, denn bisher ging es auch ohne &#8211; dabei nutzt Netbeans die von modernen Betriebssystemen bereitgestellte native Infrastruktur um Passwörter zu speichern. (z.B. Keychain auf dem Mac, Gnome-Keyring o.ä.) Normalerweise funktioniert das auch &#8211; aber seit Gnome 3 hat sich da offenbar etwas geändert.</p>
<p>Debuggen kann man die Netbeans Keyring Integration indem man folgende Option in der <strong>etc/netbeans.conf</strong> zu den <strong>netbeans_default_options</strong> ergaenzt:<br />
<code><br />
-J-Dorg.netbeans.modules.keyring.level=0</code></p>
<p>Anschließend sieht man in <strong>~/.netbeans/7.0/var/log/messages</strong><br />
<code><br />
FINE [org.netbeans.modules.keyring.kde.KWalletProvider]: application exit with code 2 for commandString: [qdbus, org.kde.kwalletd, /modules/kwalletd, org.kde.KWallet.isEnabled]; errVal: Service 'org.kde.kwalletd' does not exist.<br />
FINE [org.netbeans.modules.keyring.gnome.GnomeProvider]<br />
java.lang.UnsatisfiedLinkError: Unable to load library 'gnome-keyring': libgnome-keyring.so: cannot open shared object file: No such file or directory<br />
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:163)<br />
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:236)<br />
at com.sun.jna.Library$Handler.&lt;init&gt;(Library.java:140)<br />
at com.sun.jna.Native.loadLibrary(Native.java:379)<br />
at org.netbeans.modules.keyring.gnome.GnomeKeyringLibrary.&lt;clinit&gt;(GnomeKeyringLibrary.java:62)<br />
[catch] at org.netbeans.modules.keyring.gnome.GnomeProvider.enabled(GnomeProvider.java:88)<br />
at org.netbeans.api.keyring.Keyring.provider(Keyring.java:72)<br />
at org.netbeans.api.keyring.Keyring.save(Keyring.java:109)<br />
at org.netbeans.modules.j2ee.deployment.impl.ServerRegistry$5.run(ServerRegistry.java:731)<br />
at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1424)<br />
at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:1968)<br />
</code><br />
Nachdem ich sichergestellt habe, dass die Library installiert ist:<br />
<code><br />
sudo apt-get install libgnome-keyring0<br />
Reading package lists... Done<br />
Building dependency tree<br />
Reading state information... Done<br />
libgnome-keyring0 is already the newest version.<br />
</code><br />
bleibt die Frage: Wieso findet Netbeans die gesuchte Library nicht? Die Lösung: Die Gnome Keyring Library ist nur noch mit einem anderen Dateinamen verfügbar, mit angehängter &#8220;0&#8243;. Das gab es zwar früher schon immer, dass die Libraries ohne Versionsnummer (oder was das ist) lediglich ein Symlink auf die &#8220;echte&#8221; Library waren, aber immerhin gab es die. (Da gibt es bestimmt einen guten Grund und viel Logik für, dass das abgeschafft wurde &#8211; mir erschließt sich das jedoch nicht.)<br />
Der simple Work-Around ist daher:<br />
<code><br />
sudo ln -s /usr/lib/libgnome-keyring.so.0 /usr/lib/libgnome-keyring.so<br />
</code><br />
und danach funktioniert Netbeans wieder tadellos. Also gab es offenbar keine inkompatiblen API Änderungen, sondern &#8220;lediglich&#8221; eine Änderung des Library-Namens. Ob das ein Ubuntu/Debian Paketierungsproblem ist, oder ab Gnome 3 einfach die neue Marschrichtung, kann ich nicht sagen.</p>
<p>Update: Ich hab dazu ein Bug im Netbeans Issuetracker aufgemacht. Wer voten möchte &#8211; gerne: <a href="http://netbeans.org/bugzilla/show_bug.cgi?id=203735">http://netbeans.org/bugzilla/show_bug.cgi?id=203735</a></p>
<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/ubuntu-oneiric-netbeans-master-passwort-keyring-integration-1896/">Ubuntu Oneiric: Netbeans Master-Passwort / Keyring Integration</a></p>
<p>Ähnliche Beiträge:<ol>
<li><a href='http://everflux.de/ubuntu-oneiric-latex-papierformat-1882/' rel='bookmark' title='Ubuntu Oneiric: Latex Papierformat'>Ubuntu Oneiric: Latex Papierformat</a></li>
<li><a href='http://everflux.de/ubuntu-lucid-lts-server-auf-oneiric-updaten-1904/' rel='bookmark' title='Ubuntu Lucid LTS Server auf Oneiric Updaten'>Ubuntu Lucid LTS Server auf Oneiric Updaten</a></li>
<li><a href='http://everflux.de/netbeans-65-released-751/' rel='bookmark' title='Netbeans 6.5 released'>Netbeans 6.5 released</a></li>
<li><a href='http://everflux.de/oneiric-update-auf-vm-gast-bricht-ab-1894/' rel='bookmark' title='Oneiric update auf VM Gast bricht ab'>Oneiric update auf VM Gast bricht ab</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://everflux.de/ubuntu-oneiric-netbeans-master-passwort-keyring-integration-1896/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Benchmarking mit Caliper, Maven und Java 7</title>
		<link>http://everflux.de/java-benchmarking-mit-caliper-maven-und-java-7-1868/</link>
		<comments>http://everflux.de/java-benchmarking-mit-caliper-maven-und-java-7-1868/#comments</comments>
		<pubDate>Tue, 23 Aug 2011 11:12:49 +0000</pubDate>
		<dc:creator>everflux</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[caliper]]></category>
		<category><![CDATA[java 7]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://everflux.de/?p=1868</guid>
		<description><![CDATA[Bei Caliper handelt es sich um ein Framework um Mikrobenchmarks für Java Programme durchzuführen. Caliper ist bei Google code gehostet &#8211; http://code.google.com/p/caliper/ &#8211; und steht unter der Apache 2 Lizenz, kann somit sehr frei verwendet werden. Caliper verfolgt einen ähnlichen Ansatz wie JUnit, Methoden müssen mit &#8220;time&#8221; als Prefix benannt werden, und einen Parameter vom [...]<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/java-benchmarking-mit-caliper-maven-und-java-7-1868/">Java Benchmarking mit Caliper, Maven und Java 7</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Bei Caliper handelt es sich um ein Framework um Mikrobenchmarks für Java Programme durchzuführen. Caliper ist bei Google code gehostet &#8211; <a href="http://code.google.com/p/caliper/">http://code.google.com/p/caliper/</a> &#8211; und steht unter der Apache 2 Lizenz, kann somit sehr frei verwendet werden.</p>
<p>Caliper verfolgt einen ähnlichen Ansatz wie JUnit, Methoden müssen mit &#8220;time&#8221; als Prefix benannt werden, und einen Parameter vom Typ int entgegennehmen um dann ausgeführt zu werden. Dieser Parameter gibt an, wie viele Iterationen der zu messenden Methode durchzuführen sind.</p>
<p>Leider ist Caliper bisher noch nicht in einer Version 1.0 released worden, daher bleibt nur selber bauen. Derzeit ist das jedoch auch nicht ganz einfach: Caliper haengt von Google Guava ab, nutzt in der svn-trunk Version dazu auch bereits Features von Guava r10, was auch noch nicht released ist. Also auch hier: Selber bauen, und die Abhängigkeit in Caliper korrigieren. Mein favorisiertes Build Tool ist in diesem Fall maven.</p>
<p>Möchte man noch während des Benchmarks die Speichernutzung analysieren, so bietet Caliper dies auch an &#8211; über einen Java Agent der von dem Google Projekt java-allocation-instrumenter (<a href="http://code.google.com/p/java-allocation-instrumenter/">http://code.google.com/p/java-allocation-instrumenter/</a>, Apache 2 Lizenz) bereitgestellt wird. (Leider ist hier derzeit der Maven Build nicht so konfiguriert, dass als Artefakt ein nutzbarer Java Agent erzeugt wird. Dies ist im Ant basierten Build in Ordnung, und kann mit einem kleinen Patch der Maven Konfiguration auch behoben werden.)</p>
<p>Der letzte Wehrmutstropfen bleibt nun, dass Caliper gerne eine Environment Variable, statt bspw. einem System Property, hätte, um den zu nutzenden Java-Agent zu spezifizieren &#8211; diese lässt sich bei Ausführung als Script zwar einfach setzten, jedoch aus einer Java Anwendung heraus eigentlich nicht. Dazu später mehr.)<span id="more-1868"></span></p>
<p>Nach dem groben Überblick nun die Schritte im einzelnen:<br />
Caliper per SVN auschecken:<br />
<code><br />
svn checkout http://caliper.googlecode.com/svn/trunk/ caliper<br />
</code><br />
Danach ändert man die pom.xml folgendermassen ab:</p>
<pre>--- caliper/pom.xml    (revision 330)
+++ caliper/pom.xml    (working copy)
@@ -46,13 +46,13 @@
    &lt;dependency&gt;
       &lt;groupId&gt;com.google.guava&lt;/groupId&gt;
       &lt;artifactId&gt;guava&lt;/artifactId&gt;
-      &lt;version&gt;r08&lt;/version&gt;
+      &lt;version&gt;r10-SNAPSHOT&lt;/version&gt;
       &lt;scope&gt;compile&lt;/scope&gt;
     &lt;/dependency&gt;
     &lt;dependency&gt;
       &lt;groupId&gt;com.google.code.java-allocation-instrumenter&lt;/groupId&gt;
       &lt;artifactId&gt;java-allocation-instrumenter&lt;/artifactId&gt;
-      &lt;version&gt;2.0&lt;/version&gt;
+      &lt;version&gt;2.1-SNAPSHOT&lt;/version&gt;</pre>
<p>Wie zu sehen ist, werden damit die Abhängigkeiten auf die (gleich ebenfalls noch zu erstellenden) lokalen Bibliotheken umgestellt.</p>
<p>Nun wird Guava lokal gebaut, um die aktuelle Version zur Verfuegung zu stellen. (-SNAPSHOT Artefakte werden nicht vom Maven &#8220;Central&#8221; Repository angeboten, darum erstellen wir diese lokale selber.)<br />
<code><br />
git clone https://code.google.com/p/guava-libraries/<br />
cd guava-libraries<br />
mvn clean install<br />
</code><br />
Das war schmerzlos.<br />
Nun kommen wir noch zu dem java-allocation-instrumenter. Dieser ist in Version 2.0 released und auch über Maven Central verfügbar. Möchte man dies nicht selber bauen, kann man auch das Manifest in der Jar Datei patchen, ich hab mich jedoch für einen Patch der Maven Konfiguration und anschließendes neubauen entschieden.<code><br />
svn checkout http://java-allocation-instrumenter.googlecode.com/svn/trunk/ java-allocation-instrumenter<br />
</code><br />
Danach wird die pom.xml folgendermassen geaendert:</p>
<pre>--- java-allocation-instrumenter/pom.xml    (revision 17)
+++ java-allocation-instrumenter/pom.xml    (working copy)
@@ -83,6 +83,24 @@
&lt;build&gt;
&lt;defaultGoal&gt;package&lt;/defaultGoal&gt;
&lt;plugins&gt;
+        &lt;plugin&gt;
+            &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
+            &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;
+            &lt;version&gt;2.3.1&lt;/version&gt;
+            &lt;configuration&gt;
+                &lt;archive&gt;
+                    &lt;index&gt;true&lt;/index&gt;
+                    &lt;manifest&gt;
+                        &lt;addClasspath&gt;true&lt;/addClasspath&gt;
+                    &lt;/manifest&gt;
+                    &lt;manifestEntries&gt;
+                        &lt;Premain-Class&gt;
com.google.monitoring.runtime.instrumentation.AllocationInstrumenter
&lt;/Premain-Class&gt;
+                        &lt;Can-Redefine-Classes&gt;true&lt;/Can-Redefine-Classes&gt;
+                        &lt;Main-Class&gt;NotSuitableAsMain&lt;/Main-Class&gt;
+                    &lt;/manifestEntries&gt;
+                &lt;/archive&gt;
+            &lt;/configuration&gt;
+        &lt;/plugin&gt;</pre>
<p>Fehlt dieser Eintrag, so schlaegt die Nutzung als Java-Agent fehlt, und man erhaelt so eine Meldung:<code><br />
Failed to find Premain-Class manifest attribute from ...<br />
Error occurred during initialization of VM<br />
agent library failed to init: instrument<br />
</code><br />
und das Programm bricht ab.<br />
Nach dem Patchen wird nun das java-allocation-instrument auch übersetzt: &#8220;<code>mvn clean install</code>&#8220;. Nun kann auch caliper uebersetzt werden, auch hier kommt der bekannte Maven Aufruf zum Einsatz.<br />
Nun gilt es noch eine kleine Hürde im Zusammenhang mit Java 7 zu umschiffen: Nutzt man die Instrumentierung um Informationen über die Speichernutzung während des Benchmarks zu sammeln, so bricht die JVM die Ausführung mit der Meldung<br />
<code><br />
Exception in thread "main" java.lang.VerifyError: Expecting a stackmap frame at branch target 32 in method com.google.caliper.InProcessRunner.main([Ljava/lang/String;)V at offset 0<br />
</code><br />
ab. Der Fehler ist im Zusammenhang mit Java 7 und der verwendeten ASM Library zur Instrumentierung bekannt und sollte eigentlich bereits mit ASM 3.3.1 behoben sein. Als Workaround kann die Verifizierung der JVM deaktiviert werden, "-XX:-UseSplitVerifier" ist die dazu nötige JVM Option.<br />
Im Folgenden habe zwei Mini-Klassen, die die Verwendung von Caliper demonstrieren.<br />
Zuerst die Benchmark Klasse, hier werden verschiedene Sortieralgorithmen gegeneinander getestet. (Die Implementierung überlasse ich dem geneigten Leser, lediglich Arrays.sort kommt direkt aus der Java Klassenbibliothek)</p>
<pre>public class BenchmarkDemo extends SimpleBenchmark
{
    @Param int size; //injected by caliper with -Dsize=1,2
    private int[] values;

    @Override
    protected void setUp() throws Exception
    {
        values = new int[size];
        Random generator = new Random();
        for (int i = 0; i &lt; values.length; i++)
        {
            values[i] = generator.nextInt(Integer.MAX_VALUE);
        }
    }

    public void timeHeapSort(int reps)
    {
        for (int i = 0; i &lt; reps; i++)
        {
            HeapSort.sort(values);
        }
    }

    public void timeMergeSort(int reps)
    {
        for (int i = 0; i &lt; reps; i++)
        {
            MergeSort.sort(values);
        }
    }

    public void timeQuickSort(int reps)
    {
        for (int i = 0; i &lt; reps; i++)
        {
            QuickSort.sort(values);
        }
    }

    public void timeArraysSort(int reps)
    {
        for (int i = 0; i &lt; reps; i++)
        {
            Arrays.sort(values);
        }
    }
}</pre>
<p>Da ich gerne aus der IDE (Netbeans in meinem Fall) heraus Caliper programmatisch starten möchte, habe ich eine Klasse erstellt, die sich darum kümmert.<br />
Etwas kompliziert war an der Stelle, dass der Java-Agent nicht über ein System Property gesetzt werden kann, sondern lediglich per Environment-Variable. Diese sind in Java eigentlich nicht änderbar, mit etwas Reflection klappte es jedoch bei mir. (Robust ist das sicherlich nicht.) Auch verlasse ich mich an der Stelle darauf, dass der Agent per Maven im Standardpfad für Artefakte im lokalen Repository zur Verfügung steht. (Alternativ kann man per Environment-Variable den richtigen Pfad zum Agent weisen.)</p>
<pre>package de.trion.caliperdemo;

import java.lang.reflect.Field;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class BenchmarkRunner
{
    public static void main(String[] args) throws Exception
    {
        //runBenchmark();
        runBenchmarkWithMemoryInstrumentation();
    }

    private static void runBenchmark()
    {
        com.google.caliper.Runner.main("-Dsize=100,1000,10000,100000",
                "--trials", "20", "de.trion.caliperdemo.BenchmarkDemo");
    }

    private static void runBenchmarkWithMemoryInstrumentation() throws Exception
    {
        if (System.getenv("ALLOCATION_JAR") == null)
        {
            Map environment = new HashMap(System.getenv());
            //you might want to replace this or setup an environment entry correctly
            String allocationAgent =
             "/.m2/repository/com/google/code/java-allocation-instrumenter"+
             "/java-allocation-instrumenter/2.1-SNAPSHOT/java-allocation-instrumenter-2.1-SNAPSHOT.jar";
            environment.put("ALLOCATION_JAR", System.getProperty("user.home") + allocationAgent);
            setEnvironmentHackOld(environment);
        }

        //JDK 7 instrumentation issue: -XX:-UseSplitVerifier
        com.google.caliper.Runner.main("-JjdkSevenFix=-XX:-UseSplitVerifier",
                "-Dsize=100,1000,10000,100000", "--trials", "20",
                "--measureMemory", "de.trion.caliperdemo.BenchmarkDemo");
    }

    public static void setEnvironmentHackOld(Map newenv) throws Exception
    {
        Class[] classes = Collections.class.getDeclaredClasses();
        Map env = System.getenv();
        for (Class cl : classes)
        {
            if ("java.util.Collections$UnmodifiableMap".equals(cl.getName()))
            {
                Field field = cl.getDeclaredField("m");
                field.setAccessible(true);
                Object obj = field.get(env);

                @SuppressWarnings("unchecked")
                Map map = (Map) obj;
                map.clear();
                map.putAll(newenv);
            }
        }
    }
}
</pre>
<p>Wie man gut sehen kann, kann Caliper System-Properties, wie in diesem Fall "size", verwenden um einen Benchmark zu parametrisieren. Das Pendant dazu findet sich im Quellcode:
<pre>
@Param int size;
</pre>
<p>Auch können mehrere Parameter als Liste definiert werden und damit lässt sich in diesem Fall schön sehen, wie sich die verschiedenen Sortierverfahren bei steigender Größe verhalten.<br />
Die Nummer der Durchführungen (trials) dient dazu, einen gemittelten Wert zu erhalten um temporäre Effekte mit Einfluss auf den Benchmark zu verringern.<br />
Natürlich lässt sich caliper äquivalent auch durch ein Script oder von der Kommandozeile aus aufrufen, weitere Hinweise und Tutorials finden sich auf der Homepage - und einiges lediglich im Caliper Quellcode.</p>
<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/java-benchmarking-mit-caliper-maven-und-java-7-1868/">Java Benchmarking mit Caliper, Maven und Java 7</a></p>
<p>Ähnliche Beiträge:<ol>
<li><a href='http://everflux.de/hudson-maven-java-net-sockettimeoutexception-accept-timed-out-1504/' rel='bookmark' title='Hudson + Maven: java.net.SocketTimeoutException: Accept timed out'>Hudson + Maven: java.net.SocketTimeoutException: Accept timed out</a></li>
<li><a href='http://everflux.de/spring-framework-snapshot-versionen-per-maven-671/' rel='bookmark' title='Spring Framework: SNAPSHOT Versionen per Maven'>Spring Framework: SNAPSHOT Versionen per Maven</a></li>
<li><a href='http://everflux.de/gridgain-und-maven-805/' rel='bookmark' title='GridGain und Maven'>GridGain und Maven</a></li>
<li><a href='http://everflux.de/maven-jetty-und-der-extraclasspath-1780/' rel='bookmark' title='Maven, Jetty und der ExtraClasspath'>Maven, Jetty und der ExtraClasspath</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://everflux.de/java-benchmarking-mit-caliper-maven-und-java-7-1868/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drools und Java 7</title>
		<link>http://everflux.de/drools-und-java-7-1863/</link>
		<comments>http://everflux.de/drools-und-java-7-1863/#comments</comments>
		<pubDate>Sat, 30 Jul 2011 11:46:49 +0000</pubDate>
		<dc:creator>everflux</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[drools]]></category>
		<category><![CDATA[jboss rules]]></category>

		<guid isPermaLink="false">http://everflux.de/?p=1863</guid>
		<description><![CDATA[Drools (und JBoss Rules) funktioniert derzeit (Drools 5.2) nicht out-of-the-box mit Java 7 (OpenJDK bzw. Oracle Java 7). Der Grund ist, dass der von Drools verwendete Compiler lediglich Support bis Java 6 hat. Eine einfache Loesung, die auch mit Java 7 funktioniert, ist die zu verwendende Java Version manuell zu konfigurieren, wenn man die KnowledgeBuilderFactory [...]<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/drools-und-java-7-1863/">Drools und Java 7</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Drools (und JBoss Rules) funktioniert derzeit (Drools 5.2) nicht out-of-the-box mit Java 7 (OpenJDK bzw. Oracle Java 7). Der Grund ist, dass der von Drools verwendete Compiler lediglich Support bis Java 6 hat.</p>
<p>Eine einfache Loesung, die auch mit Java 7 funktioniert, ist die zu verwendende Java Version manuell zu konfigurieren, wenn man die KnowledgeBuilderFactory konfiguriert:<br />
<code><br />
final Properties props = new Properties();<br />
props.setProperty("drools.dialect.java.compiler.lnglevel", "1.6");<br />
final KnowledgeBuilderConfiguration configuration = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(props, getClass().getClassLoader());<br />
</code><br />
Weitere Probleme mit Java 7 und JBoss Drools sind mir bisher nicht aufgefallen.</p>
<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/drools-und-java-7-1863/">Drools und Java 7</a></p>
<p>Ähnliche Beiträge:<ol>
<li><a href='http://everflux.de/jenkins-java-java-net-sockettimeoutexception-accept-timed-out-1830/' rel='bookmark' title='Jenkins, Java: java.net.SocketTimeoutException: Accept timed out'>Jenkins, Java: java.net.SocketTimeoutException: Accept timed out</a></li>
<li><a href='http://everflux.de/java-logging-netbeans-eclipse-und-javautillogging-im-einsatz-1060/' rel='bookmark' title='Java logging: Netbeans, Eclipse und java.util.logging im Einsatz'>Java logging: Netbeans, Eclipse und java.util.logging im Einsatz</a></li>
<li><a href='http://everflux.de/java-benchmarking-mit-caliper-maven-und-java-7-1868/' rel='bookmark' title='Java Benchmarking mit Caliper, Maven und Java 7'>Java Benchmarking mit Caliper, Maven und Java 7</a></li>
<li><a href='http://everflux.de/amd-64-java-6-crahes-workaround-und-losungen-535/' rel='bookmark' title='AMD 64 Java 6 crashes &#8211; Workaround und Lösungen'>AMD 64 Java 6 crashes &#8211; Workaround und Lösungen</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://everflux.de/drools-und-java-7-1863/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jenkins, Java: java.net.SocketTimeoutException: Accept timed out</title>
		<link>http://everflux.de/jenkins-java-java-net-sockettimeoutexception-accept-timed-out-1830/</link>
		<comments>http://everflux.de/jenkins-java-java-net-sockettimeoutexception-accept-timed-out-1830/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 21:05:00 +0000</pubDate>
		<dc:creator>everflux</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux/OpenSource]]></category>
		<category><![CDATA[hudson]]></category>
		<category><![CDATA[ipv6]]></category>
		<category><![CDATA[jenkins]]></category>

		<guid isPermaLink="false">http://everflux.de/?p=1830</guid>
		<description><![CDATA[Lange gesucht, doch gefunden: ERROR: Aborted Maven execution for InterruptedIOException java.net.SocketTimeoutException: Accept timed out Jenkins (bzw. Hudson) bricht dann mit dieser Fehlermeldung den Build Prozess ab: java.net.SocketTimeoutException: Accept timed out at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408) at java.net.ServerSocket.implAccept(ServerSocket.java:462) at java.net.ServerSocket.accept(ServerSocket.java:430) at hudson.maven.AbstractMavenProcessFactory$SocketHandler$AcceptorImpl.accept(AbstractMavenProcessFactory.java:167) at hudson.maven.AbstractMavenProcessFactory.newProcess(AbstractMavenProcessFactory.java:221) at hudson.maven.ProcessCache.get(ProcessCache.java:231) at hudson.maven.MavenModuleSetBuild$RunnerImpl.doRun(MavenModuleSetBuild.java:668) at hudson.model.AbstractBuild$AbstractRunner.run(AbstractBuild.java:429) at hudson.model.Run.run(Run.java:1374) at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:467) at hudson.model.ResourceController.execute(ResourceController.java:88) [...]<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/jenkins-java-java-net-sockettimeoutexception-accept-timed-out-1830/">Jenkins, Java: java.net.SocketTimeoutException: Accept timed out</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Lange gesucht, doch gefunden:<br />
<code><br />
ERROR: Aborted Maven execution for InterruptedIOException<br />
java.net.SocketTimeoutException: Accept timed out<br />
</code></p>
<p>Jenkins (bzw. Hudson) bricht dann mit dieser Fehlermeldung den Build Prozess ab:</p>
<pre>java.net.SocketTimeoutException: Accept timed out
	at java.net.PlainSocketImpl.socketAccept(Native Method)
	at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
	at java.net.ServerSocket.implAccept(ServerSocket.java:462)
	at java.net.ServerSocket.accept(ServerSocket.java:430)
	at hudson.maven.AbstractMavenProcessFactory$SocketHandler$AcceptorImpl.accept(AbstractMavenProcessFactory.java:167)
	at hudson.maven.AbstractMavenProcessFactory.newProcess(AbstractMavenProcessFactory.java:221)
	at hudson.maven.ProcessCache.get(ProcessCache.java:231)
	at hudson.maven.MavenModuleSetBuild$RunnerImpl.doRun(MavenModuleSetBuild.java:668)
	at hudson.model.AbstractBuild$AbstractRunner.run(AbstractBuild.java:429)
	at hudson.model.Run.run(Run.java:1374)
	at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:467)
	at hudson.model.ResourceController.execute(ResourceController.java:88)
	at hudson.model.Executor.run(Executor.java:145)
Finished: ABORTED</pre>
<p>Beheben über advanced und dort in die <strong>MAVEN_OPTS</strong> hinzufügen:<br />
<code><br />
-Djava.net.preferIPv4Stack=true<br />
</code><br />
Anschließend sollte der Build wieder korrekt funktionieren. Alternativ kann man dies auch als globale Environment Variable setzen, das Problem wird mehrere Java Anwendungen betreffen und nicht nur den CI Server.</p>
<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/jenkins-java-java-net-sockettimeoutexception-accept-timed-out-1830/">Jenkins, Java: java.net.SocketTimeoutException: Accept timed out</a></p>
<p>Ähnliche Beiträge:<ol>
<li><a href='http://everflux.de/hudson-maven-java-net-sockettimeoutexception-accept-timed-out-1504/' rel='bookmark' title='Hudson + Maven: java.net.SocketTimeoutException: Accept timed out'>Hudson + Maven: java.net.SocketTimeoutException: Accept timed out</a></li>
<li><a href='http://everflux.de/java-networking-probleme-mit-debian-testing-1468/' rel='bookmark' title='Java Networking Probleme mit Debian (testing)'>Java Networking Probleme mit Debian (testing)</a></li>
<li><a href='http://everflux.de/java-vortraege-testing-und-swing-entwicklung-1387/' rel='bookmark' title='Java Vorträge: Testing und Swing Entwicklung'>Java Vorträge: Testing und Swing Entwicklung</a></li>
<li><a href='http://everflux.de/java-benchmarking-mit-caliper-maven-und-java-7-1868/' rel='bookmark' title='Java Benchmarking mit Caliper, Maven und Java 7'>Java Benchmarking mit Caliper, Maven und Java 7</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://everflux.de/jenkins-java-java-net-sockettimeoutexception-accept-timed-out-1830/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSL Problem mit Java 7</title>
		<link>http://everflux.de/ssl-problem-mit-java-7-1855/</link>
		<comments>http://everflux.de/ssl-problem-mit-java-7-1855/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 18:54:56 +0000</pubDate>
		<dc:creator>everflux</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux/OpenSource]]></category>
		<category><![CDATA[openjdk]]></category>
		<category><![CDATA[ssl]]></category>

		<guid isPermaLink="false">http://everflux.de/?p=1855</guid>
		<description><![CDATA[Nachdem ich (wie im vorherigen Artikel beschrieben) nun OpenJDK / Java 7 selber kompiliert habe, habe ich mich auf die Suche nach dem SSL Problem gemacht, dass ich mit Jameica/Hibiskus habe. (No offense, ich find es leichter OpenJDK zu übersetzen oder anzupassen als Jameica und Hibiskus zu bauen&#8230; praktischerweise bringt OpenJDK auch Netbeans Projektdateien mit, [...]<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/ssl-problem-mit-java-7-1855/">SSL Problem mit Java 7</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Nachdem ich (wie im vorherigen Artikel beschrieben) nun OpenJDK / Java 7 selber kompiliert habe, habe ich mich auf die Suche nach dem SSL Problem gemacht, dass ich mit Jameica/Hibiskus habe. (No offense, ich find es leichter OpenJDK zu übersetzen oder anzupassen als Jameica und Hibiskus zu bauen&#8230; praktischerweise bringt OpenJDK auch Netbeans Projektdateien mit, so dass es ein Klacks ist, das Projekt mit Netbeans zu verwenden.)</p>
<p>Nachdem ich folgenden Patch geschrieben habe habe:</p>
<pre>diff -r 9b8c96f96a0f src/share/classes/sun/security/ssl/SSLContextImpl.java
--- a/src/share/classes/sun/security/ssl/SSLContextImpl.java	Mon Jun 27 13:21:34 2011 -0700
+++ b/src/share/classes/sun/security/ssl/SSLContextImpl.java	Mon Jul 25 19:30:11 2011 +0200
@@ -871,7 +871,7 @@
                 }
             } catch (CertPathValidatorException cpve) {
                 throw new CertificateException(
-                    "Certificates does not conform to algorithm constraints");
+                    "Certificates does not conform to algorithm constraints", cpve);
             }
         }
     }</pre>
<p>ist jetzt auch zu sehen, was die Ursache fuer den SSL Fehler ist:</p>
<pre>Caused by: java.security.cert.CertPathValidatorException: Algorithm constraints check failed: MD2withRSA
	at sun.security.provider.certpath.AlgorithmChecker.check(AlgorithmChecker.java:200)
	at sun.security.ssl.AbstractTrustManagerWrapper.checkAdditionalTrust(SSLContextImpl.java:870)
	... 21 more org.kapott.hbci.manager.HBCIUtils.log(HBCIUtils.java:1052)</pre>
<p>OpenJDK kommt übrigens ohne Root Zertifikate daher, so dass man sich nicht über einen solchen Dialog wundern sollte:</p>
<p><a href="http://everflux.de/wp-content/uploads/2011/07/Screenshot-Sicherheitsabfrage-.png"><img class="alignnone size-medium wp-image-1856" title="Screenshot-Sicherheitsabfrage" src="http://everflux.de/wp-content/uploads/2011/07/Screenshot-Sicherheitsabfrage--289x300.png" alt="" width="289" height="300" /></a></p>
<p>Nachdem man die Exception genauer ansieht, ist man auch etwas schlauer geworden: Irgendein Zertifikat ist mit einem nicht mehr als sicher geltenden Algorithmus signiert. Das der Apobank selbst ist es offensichtlich jedoch nicht, also muss die gesamte Zertifikatskette untersucht werden.<br />
Hier habe ich etwas Shell-Magie und das OpenSSL Kommandozeilentool verwendet:<br />
<code><br />
openssl s_client -showcerts -connect hbcibanking.apobank.de:443 &lt; /dev/null | awk -v c=-1 '/-----BEGIN CERTIFICATE-----/{inc=1;c++} inc {print &gt; ("cert-" c ".pem")}/---END CERTIFICATE-----/{inc=0}'; for i in cert-?.pem; do openssl x509 -noout -serial -subject -issuer -in "$i"; done<br />
</code><br />
Danach finden sich alle Zertifikate in cert-1.pem, cert-2.pem usw., die Ausgabe der Seriennummern, Subject und Issuer sah bei mir so aus:<br />
<code><br />
serial=4FCD4C50631D3BB4C747A319E816AD5D<br />
subject= /C=DE/ST=NRW/L=Duesseldorf/O=Deutsche Apotheker- und Aerztebank/OU=Terms of use at www.verisign.com/rpa (c)05/CN=hbcibanking.apobank.de<br />
issuer= /O=VeriSign Trust Network/OU=VeriSign, Inc./OU=VeriSign International Server CA - Class 3/OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign<br />
serial=254B8A853842CCE358F8C5DDAE226EA4<br />
subject= /O=VeriSign Trust Network/OU=VeriSign, Inc./OU=VeriSign International Server CA - Class 3/OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign<br />
issuer= /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority<br />
serial=70BAE41D10D92934B638CA7B03CCBABF<br />
subject= /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority<br />
issuer= /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority<br />
</code><br />
Nun müssen alle Zertifikate untersucht werden:<br />
<code><br />
openssl x509 -text -in cert-0.pem<br />
</code><br />
Und entsprechend für die anderen Zertifikate in der Kette. Ich wurde dann bei dem dritten Zertifikat fündig:<br />
<code><br />
tkruse@charix:~$ openssl x509 -text -in cert-2.pem<br />
Certificate:<br />
Data:<br />
Version: 1 (0x0)<br />
Serial Number:<br />
70:ba:e4:1d:10:d9:29:34:b6:38:ca:7b:03:cc:ba:bf<br />
Signature Algorithm: md2WithRSAEncryption<br />
Issuer: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority<br />
Validity<br />
Not Before: Jan 29 00:00:00 1996 GMT<br />
Not After : Aug 1 23:59:59 2028 GMT<br />
Subject: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority<br />
</code><br />
Ein &#8220;betagtes&#8221; altes VeriSign Zertifikat das mit MD2 und RSA signiert wurde. Auch wenn der MD2 Signaturalgorithmus noch nicht gebrochen ist, gibt es einige Angriffe, die dazu geführt haben, dass MD2 seit 2009 nicht mehr in OpenSSL verwendet wird.<br />
Was heißt das nun für das konkrete SSL Problem? Die ApoBank wird sich eh um Januar 2012 herum spätestens ein neues SSL Zertifikat besorgen. Dann sollte der Spuk zu ende sein. Besser wäre es allerdings wenn die betroffenen Anbieter ihre SSL Zertifikate jetzt erneuern &#8211; es geht schließlich um Online Banking!<br />
Und wieso fällt das erst seit Java 7 auf? Seit Java 7 ist offenbar die Möglichkeit neu hinzugekommen die Algorithmen zu prüfen oder wurde geändert. Eigentlich sollte seit Java 6u17 bereits MD2 nicht mehr unterstützt werden, zumindest gibt es einen entsprechenden Eintrag in den Release notes: <a href="http://www.oracle.com/technetwork/java/javase/6u17-141447.html" target="_blank">http://www.oracle.com/technetwork/java/javase/6u17-141447.html</a>.</p>
<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/ssl-problem-mit-java-7-1855/">SSL Problem mit Java 7</a></p>
<p>Ähnliche Beiträge:<ol>
<li><a href='http://everflux.de/openjdk-java-7-mit-ubuntu-kompilieren-1842/' rel='bookmark' title='OpenJDK &#8211; Java 7 &#8211; mit Ubuntu kompilieren'>OpenJDK &#8211; Java 7 &#8211; mit Ubuntu kompilieren</a></li>
<li><a href='http://everflux.de/jenkins-java-java-net-sockettimeoutexception-accept-timed-out-1830/' rel='bookmark' title='Jenkins, Java: java.net.SocketTimeoutException: Accept timed out'>Jenkins, Java: java.net.SocketTimeoutException: Accept timed out</a></li>
<li><a href='http://everflux.de/java-logging-netbeans-eclipse-und-javautillogging-im-einsatz-1060/' rel='bookmark' title='Java logging: Netbeans, Eclipse und java.util.logging im Einsatz'>Java logging: Netbeans, Eclipse und java.util.logging im Einsatz</a></li>
<li><a href='http://everflux.de/java-benchmarking-mit-caliper-maven-und-java-7-1868/' rel='bookmark' title='Java Benchmarking mit Caliper, Maven und Java 7'>Java Benchmarking mit Caliper, Maven und Java 7</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://everflux.de/ssl-problem-mit-java-7-1855/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>OpenJDK &#8211; Java 7 &#8211; mit Ubuntu kompilieren</title>
		<link>http://everflux.de/openjdk-java-7-mit-ubuntu-kompilieren-1842/</link>
		<comments>http://everflux.de/openjdk-java-7-mit-ubuntu-kompilieren-1842/#comments</comments>
		<pubDate>Sun, 24 Jul 2011 20:28:36 +0000</pubDate>
		<dc:creator>everflux</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux/OpenSource]]></category>
		<category><![CDATA[ubuntuusers.de]]></category>
		<category><![CDATA[openjdk]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://everflux.de/?p=1842</guid>
		<description><![CDATA[Ich habe ein merkwuerdiges SSL Problem mit Java 7 (Build 147, dem Release Candidate) im Zusammenhang mit Online-Banking und Jameica/Hibiskus: Caused by: java.security.cert.CertificateException: Certificates does not conform to algorithm constraints at sun.security.ssl.AbstractTrustManagerWrapper.checkAdditionalTrust(SSLContextImpl.java:873) at sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(SSLContextImpl.java:804) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1319) ... 19 more Schaut man sich dazu den Source Code an, sieht man schnell, dass leider die verursachende Exception [...]<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/openjdk-java-7-mit-ubuntu-kompilieren-1842/">OpenJDK &#8211; Java 7 &#8211; mit Ubuntu kompilieren</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Ich habe ein merkwuerdiges SSL Problem mit Java 7 (Build 147, dem Release Candidate) im Zusammenhang mit Online-Banking und Jameica/Hibiskus:</p>
<pre>
Caused by: java.security.cert.CertificateException: Certificates does not conform to algorithm constraints
 at sun.security.ssl.AbstractTrustManagerWrapper.checkAdditionalTrust(SSLContextImpl.java:873)
 at sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(SSLContextImpl.java:804)
 at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1319)
 ... 19 more
</pre>
<p>Schaut man sich dazu den Source Code an, sieht man schnell, dass leider die verursachende Exception verschluckt wird. (Das kommt davon, wenn Committer und Reviewer identisch sind&#8230;)<br />
Meine Idee war also, OpenJDK selber zu bauen und da ggf. besseres Logging einzubauen. Die im Internet veröffentlichten Anleitungen sind alle ein paar Jahre alt und nicht mehr ganz korrekt, daher hier meine Ergebnisse zum Nachmachen.<br />
Ich habe Ubuntu als System verwendet, dort ist eine Übersetzung von OpenJDK / Java 7 sehr einfach.<br />
OpenJDK wird mittels Mercurial verwaltet, zur Hierarchiebildung wird die Mercurial Forest extension benötigt (und Mercurial). Ist das &#8220;mercurial&#8221; Paket bereits installiert so kann man die Forest extension einfach herunterladen:</p>
<pre>hg clone http://bitbucket.org/pmezard/hgforest-crew hgforest</pre>
<p>Diese muss nun in die <code>.hgrc</code> eingetragen werden: (das &#8220;&#8230;.&#8221; durch den Pfad zum Download ersetzen)</p>
<pre>[extensions]
forest=......hgforest/forest.py
fetch=</pre>
<p>Danach installiert man die Build Abhängigkeiten:</p>
<pre>sudo apt-get install build-essential gawk libasound2-dev libfreetype6-dev libcups2-dev libxt-dev libx11-dev libxtst-dev libxrender-dev</pre>
<p>Und checkt per mercurial-forest die Sourcen fuer OpenJDK aus:</p>
<pre>hg fclone http://hg.openjdk.java.net/jdk7/jdk7 jdk7</pre>
<p>Da beim späteren Build noch Java Abhängigkeiten heruntergeladen werden müssen, hab ich noch folgendens in die Ant Konfiguration eingesetzt: <code>~/.antrc</code></p>
<pre>
ANT_OPTS=”$ANT_OPTS -Dallow.downloads=true”
</pre>
<p>Für den build benötigt man ein existierendes Java, und setzt folgenden Umgebungsvariablen:</p>
<pre>export ALT_BOOTDIR=/usr/lib/jvm/java-6-sun
unset JAVA_HOME
export LANG="C"
make sanity</pre>
<p>Da sollten keine Fehler zu sehen sein und gibt dann den &#8220;make&#8221; Befehl (dauert bei mir rund 40 Minuten):</p>
<pre>make</pre>
<p>Und kann es dann aus dem aktuellen Verzeichnis testen ob &#8220;java&#8221; vorhanden ist:</p>
<pre>build/linux-amd64/bin/java -version</pre>
<p>Bei mir sieht das dann folgendermassen aus:</p>
<pre>
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-tkruse-b00)
OpenJDK 64-Bit Server VM (build 21.0-b17, mixed mode)
</pre>
<p>Fertig.<br />
(Ja man benötigt wirklich keine &#8220;binary plugs&#8221; o.a&#8221;. mehr!)</p>
<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/openjdk-java-7-mit-ubuntu-kompilieren-1842/">OpenJDK &#8211; Java 7 &#8211; mit Ubuntu kompilieren</a></p>
<p>Ähnliche Beiträge:<ol>
<li><a href='http://everflux.de/openjdk-java-7-und-oracle-1582/' rel='bookmark' title='OpenJDK, Java 7 und Oracle'>OpenJDK, Java 7 und Oracle</a></li>
<li><a href='http://everflux.de/munster-vortrag-zu-openjdk-java-7-1571/' rel='bookmark' title='Münster: Vortrag zu OpenJDK / Java 7'>Münster: Vortrag zu OpenJDK / Java 7</a></li>
<li><a href='http://everflux.de/ubuntulinux-amd-64-java-plugin-172/' rel='bookmark' title='Ubuntu/Linux AMD-64: Java Plugin'>Ubuntu/Linux AMD-64: Java Plugin</a></li>
<li><a href='http://everflux.de/java-jvm-und-eclipse-absturze-mit-ubuntu-hardy-heron-528/' rel='bookmark' title='Java (JVM) und Eclipse Abstürze mit Ubuntu Hardy Heron'>Java (JVM) und Eclipse Abstürze mit Ubuntu Hardy Heron</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://everflux.de/openjdk-java-7-mit-ubuntu-kompilieren-1842/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>DKB Kreditkarte: Kontoabfrage mit Hibiscus/Jameica</title>
		<link>http://everflux.de/dkb-kreditkarte-kontoabfrage-mit-hibiscus-jameica-1821/</link>
		<comments>http://everflux.de/dkb-kreditkarte-kontoabfrage-mit-hibiscus-jameica-1821/#comments</comments>
		<pubDate>Fri, 27 May 2011 13:13:07 +0000</pubDate>
		<dc:creator>everflux</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux/OpenSource]]></category>

		<guid isPermaLink="false">http://everflux.de/?p=1821</guid>
		<description><![CDATA[Hibiscus ist ein Plugin für Jameica &#8211; zusammen ergibt sich daraus ein Homebanking Programm das auf verschiedenen Betriebssystemen läuft (überall wo Java verfügbar ist), die Software kann hier heruntergeladen werden. Die normale Abfrage von Konten erfolgt über HBCI &#8211; dies Protokoll wird jedoch leider nicht von jeder Bank bzw. jedem Finanzdienstleister für alle Produkte unterstützt. [...]<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/dkb-kreditkarte-kontoabfrage-mit-hibiscus-jameica-1821/">DKB Kreditkarte: Kontoabfrage mit Hibiscus/Jameica</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Hibiscus ist ein Plugin für Jameica &#8211; zusammen ergibt sich daraus ein Homebanking Programm das auf verschiedenen Betriebssystemen läuft (überall wo Java verfügbar ist), die Software kann <a href="http://www.willuhn.de/products/jameica/">hier</a> heruntergeladen werden.</p>
<p>Die normale Abfrage von Konten erfolgt über HBCI &#8211; dies Protokoll wird jedoch leider nicht von jeder Bank bzw. jedem Finanzdienstleister für alle Produkte unterstützt. So ist Paypal z.B. nicht per HBCI abfragbar, und auch die recht populären DKB Kreditkarten Konten nicht.</p>
<p>In neuen Versionen unterstützt Jameica auch Scripting und sogenannte Offline-Konten. Das sind Konten, die nicht per HBCI abgefragt werden, sondern von Hand gepflegt werden. (Z.B. kann man so ein &#8220;Bar Kasse&#8221; Konto führen.) Mittels Scripting &#8211; und dem richtigen Script &#8211; lassen sich so nun auch Paypal und die DKB Kreditkartenkonten abfragen. Dazu laedt man sich lediglich die neueste Jameica Version herunter und installiert das Hibiscus Plugin.</p>
<p>Anschließend muss man noch das jameica.scripting Plugin, HTMLUnit (wird zum Screen-Scraping der DKB und Paypal Webseiten verwendet) und die Scripte für Paypal und/oder DKB installieren &#8211; dafür gibt es zum Glück ein einzelnes Archiv, welches man <a href="http://www.wiedenhoeft.net/hibiscus-scripting/installation-und-download">hier</a> herunterladen kann.</p>
<p>Das Archiv entpackt man &#8211; genauso wie das Hibiscus Plugin für Jameica &#8211; in den Plugins Ordner.</p>
<p>Nach dem Start von Jameica hat man unter &#8220;Datei-&gt;Einstellungen&#8221; den Punkt &#8220;Scripting&#8221;, wo man Paypal und/oder das DKB Script aktivieren kann.</p>
<p>Für die DKB Kreditkarte erstellt man nun ein Offline Konto &#8211; als Bankleitzahl nimmt man die der DKB (12030000), als Kontonummer verwendet man die eigene Kontonummer und als Kundennummer verwendet man die Nummer der Kreditkarte. Hier kann man die mittleren Stellen der Nummer durch &#8220;*&#8221; ersetzen &#8211; lediglich die ersten und letzten vier Ziffern der Kreditkartennummer müssen richtig angegeben sein.</p>
<p>Um Doppelbuchungen zu vermeiden, sollte unter &#8220;erweitert&#8221; noch das automatische Gegenbuchen ausgeschaltet werden.</p>
<p>Das Konto kann anschließend über den Knopf &#8220;per Scripting synchronisieren&#8221; abgefragt werden. (Leider nicht zentral mit den anderen HBCI Konten &#8211; aber immerhin.)</p>
<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/dkb-kreditkarte-kontoabfrage-mit-hibiscus-jameica-1821/">DKB Kreditkarte: Kontoabfrage mit Hibiscus/Jameica</a></p>
<p>Ähnliche Beiträge:<ol>
<li><a href='http://everflux.de/apobank-und-hbci-fail-999/' rel='bookmark' title='Apobank und HBCI (fail)'>Apobank und HBCI (fail)</a></li>
<li><a href='http://everflux.de/ssl-problem-mit-java-7-1855/' rel='bookmark' title='SSL Problem mit Java 7'>SSL Problem mit Java 7</a></li>
<li><a href='http://everflux.de/apobank-und-hbci4java-es-tut-jetzt-1365/' rel='bookmark' title='Apobank und HBCI4Java: Es tut jetzt!'>Apobank und HBCI4Java: Es tut jetzt!</a></li>
<li><a href='http://everflux.de/maven-jetty-und-der-extraclasspath-1780/' rel='bookmark' title='Maven, Jetty und der ExtraClasspath'>Maven, Jetty und der ExtraClasspath</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://everflux.de/dkb-kreditkarte-kontoabfrage-mit-hibiscus-jameica-1821/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hamcrest, Junit: NoSuchMethodError zur Test Laufzeit</title>
		<link>http://everflux.de/hamcrest-junit-nosuchmethoderror-zur-test-laufzeit-1801/</link>
		<comments>http://everflux.de/hamcrest-junit-nosuchmethoderror-zur-test-laufzeit-1801/#comments</comments>
		<pubDate>Sat, 19 Mar 2011 15:00:49 +0000</pubDate>
		<dc:creator>everflux</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[hamcrest]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://everflux.de/?p=1801</guid>
		<description><![CDATA[JUnit 4 bringt die (bessere) Syntax von assertThat über Hamcrest Matcher mit. Und nicht nur die Syntax ist besser, es gibt für viele Testfälle bereits &#8220;Matcher&#8221;, die das Leben erleichtern können. Genauso kann einem das Leben aber auch erschwert werden: JUnit bringt eben nur ein Subset der Hamcrest Funktionalität mit. Den Rest kann man über [...]<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/hamcrest-junit-nosuchmethoderror-zur-test-laufzeit-1801/">Hamcrest, Junit: NoSuchMethodError zur Test Laufzeit</a></p>
]]></description>
			<content:encoded><![CDATA[<p>JUnit 4 bringt die (bessere) Syntax von assertThat über Hamcrest Matcher mit. Und nicht nur die Syntax ist besser, es gibt für viele Testfälle bereits &#8220;Matcher&#8221;, die das Leben erleichtern können.<br />
Genauso kann einem das Leben aber auch erschwert werden: JUnit bringt eben nur ein Subset der Hamcrest Funktionalität mit. Den Rest kann man über die entsprechenden Hamcrest Bibliotheken hinzufügen. Und genau da gilt es nun aufzupassen: JUnit bringt eben bestimmte Versionen der Bilbiotheken mit &#8211; und dann kann es zu Konflikten kommen, die sich zur Test-Laufzeit erst zeigen:<br />
<code><br />
org.hamcrest.core.AnyOf.anyOf([Lorg/hamcrest/Matcher;)Lorg/hamcrest/core/AnyOf;<br />
java.lang.NoSuchMethodError: org.hamcrest.core.AnyOf.anyOf([Lorg/hamcrest/Matcher;)Lorg/hamcrest/core/AnyOf;<br />
at org.hamcrest.text.IsEmptyString.(IsEmptyString.java:18)<br />
</code><br />
Die Lösung ist dann JUnit ohne eigene Versionen von Hamcrest etc. zu verwenden (die &#8220;no-dependencies&#8221; Version), und entsprechend die Abhängigkeiten selber aufzulösen.</p>
<p>Mit Maven sieht dann der Einsatz von JUnit, Mockito und Hamcrest z.B. folgendermaßen aus:</p>
<pre><code>
&lt;dependency&gt;
  &lt;groupId&gt;junit&lt;/groupId&gt;
  &lt;artifactId&gt;junit-dep&lt;/artifactId&gt;
  &lt;version&gt;4.8.2&lt;/version&gt;
  &lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;org.mockito&lt;/groupId&gt;
  &lt;artifactId&gt;mockito-core&lt;/artifactId&gt;
  &lt;version&gt;1.8.5&lt;/version&gt;
  &lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;org.hamcrest&lt;/groupId&gt;
  &lt;artifactId&gt;hamcrest-core&lt;/artifactId&gt;
  &lt;version&gt;1.2.1&lt;/version&gt;
  &lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;org.hamcrest&lt;/groupId&gt;
  &lt;artifactId&gt;hamcrest-library&lt;/artifactId&gt;
  &lt;version&gt;1.2.1&lt;/version&gt;
  &lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;
</code></pre>
<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/hamcrest-junit-nosuchmethoderror-zur-test-laufzeit-1801/">Hamcrest, Junit: NoSuchMethodError zur Test Laufzeit</a></p>
<p>Ähnliche Beiträge:<ol>
<li><a href='http://everflux.de/netbeans-package-javax-servlet-jsp-does-not-exist-cannot-find-symbol-1751/' rel='bookmark' title='Netbeans: &#8220;package javax.servlet.jsp does not exist&#8221; (cannot find symbol)'>Netbeans: &#8220;package javax.servlet.jsp does not exist&#8221; (cannot find symbol)</a></li>
<li><a href='http://everflux.de/enter-text-test-sorry-dfdf767df-303/' rel='bookmark' title='Enter text? Test, sorry dfdf767df'>Enter text? Test, sorry dfdf767df</a></li>
<li><a href='http://everflux.de/gridgain-und-maven-805/' rel='bookmark' title='GridGain und Maven'>GridGain und Maven</a></li>
<li><a href='http://everflux.de/maven-jetty-und-der-extraclasspath-1780/' rel='bookmark' title='Maven, Jetty und der ExtraClasspath'>Maven, Jetty und der ExtraClasspath</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://everflux.de/hamcrest-junit-nosuchmethoderror-zur-test-laufzeit-1801/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Glassfish 3.1 und httpOnly Session Cookie</title>
		<link>http://everflux.de/glassfish-3-1-und-httponly-session-cookie-1794/</link>
		<comments>http://everflux.de/glassfish-3-1-und-httponly-session-cookie-1794/#comments</comments>
		<pubDate>Fri, 04 Mar 2011 13:48:37 +0000</pubDate>
		<dc:creator>everflux</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux/OpenSource]]></category>
		<category><![CDATA[glassfish]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://everflux.de/?p=1794</guid>
		<description><![CDATA[Wie bereits in meinem anderen Eintrag zu Glassfish 3.1 beschrieben, ist seit der Implementierung der Servlet 3.0 Spezifikation in Glassfish 3.1 der Session Cookie standardmäßig auf &#8220;httpOnly&#8221; gesetzt &#8211; dies kann Probleme mit einigen JavaScript Frameworks verursachen. In dem web.xml Deploymentdescriptor kann dies umkonfiguriert werden, im glassfish-web.xml Descriptor ist dafür leider keine Möglichkeit vorgesehen. Weblogic, [...]<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/glassfish-3-1-und-httponly-session-cookie-1794/">Glassfish 3.1 und httpOnly Session Cookie</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Wie bereits in meinem anderen <a href="http://everflux.de/glassfish-3-1-probleme-mit-dwr-2-und-mehr-1791/">Eintrag zu Glassfish 3.1</a> beschrieben, ist seit der Implementierung der Servlet 3.0 Spezifikation in Glassfish 3.1 der Session Cookie standardmäßig auf &#8220;httpOnly&#8221; gesetzt &#8211; dies kann Probleme mit einigen JavaScript Frameworks verursachen.</p>
<p>In dem web.xml Deploymentdescriptor kann dies umkonfiguriert werden, im glassfish-web.xml Descriptor ist dafür leider keine Möglichkeit vorgesehen. Weblogic, auch von Oracle mit BEA zugekauft, verhält sich dabei genauso, auch hier ist der Session Cookie auf httpOnly gesetzt &#8211; kann jedoch über den Weblogic spezifischen Deployment Descriptor unabhängig von der web.xml umkonfiguriert werden.</p>
<p>Und Glassfish 3.1 unterstützt nun auch ein Subset des Weblogic Deployment Descriptors um Weblogic kompatibel zu sein. (Vermutlich ist dies auch ein Grund, aus dem die Cookies httpOnly sind, um mit Weblogic konform zu sein.) Auch wenn es komisch ist, dass Glassfish selber keine Möglichkeit vorsieht das Verhalten im eigenen Deployment Deskriptor zu konfigurieren &#8211; über den Umweg des Weblogic spezifischen Descriptors geht es dann:<br />
<code><br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"&gt;<br />
&lt;session-descriptor&gt;<br />
&lt;cookie-http-only&gt;false&lt;/cookie-http-only&gt;<br />
&lt;/session-descriptor&gt;<br />
&lt;/weblogic-web-app&gt;<br />
</code></p>
<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/glassfish-3-1-und-httponly-session-cookie-1794/">Glassfish 3.1 und httpOnly Session Cookie</a></p>
<p>Ähnliche Beiträge:<ol>
<li><a href='http://everflux.de/glassfish-3-1-probleme-mit-dwr-2-und-mehr-1791/' rel='bookmark' title='Glassfish 3.1: Probleme mit DWR 2 (und mehr)'>Glassfish 3.1: Probleme mit DWR 2 (und mehr)</a></li>
<li><a href='http://everflux.de/maven-jetty-und-reloads-session-persistieren-1775/' rel='bookmark' title='Maven, Jetty und Reloads: Session persistieren'>Maven, Jetty und Reloads: Session persistieren</a></li>
<li><a href='http://everflux.de/glassfish-v3-prelude-der-neue-glassfish-ist-da-725/' rel='bookmark' title='GlassFish v3 Prelude: Der neue Glassfish ist da'>GlassFish v3 Prelude: Der neue Glassfish ist da</a></li>
<li><a href='http://everflux.de/firefox2-supercookie-monstercookie-public-cookie-124/' rel='bookmark' title='Firefox2: Supercookie, Monstercookie, Public-cookie?!'>Firefox2: Supercookie, Monstercookie, Public-cookie?!</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://everflux.de/glassfish-3-1-und-httponly-session-cookie-1794/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Glassfish 3.1: Probleme mit DWR 2 (und mehr)</title>
		<link>http://everflux.de/glassfish-3-1-probleme-mit-dwr-2-und-mehr-1791/</link>
		<comments>http://everflux.de/glassfish-3-1-probleme-mit-dwr-2-und-mehr-1791/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 19:32:07 +0000</pubDate>
		<dc:creator>everflux</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Web Entwicklung]]></category>
		<category><![CDATA[glassfish]]></category>
		<category><![CDATA[hudson]]></category>
		<category><![CDATA[jenkins]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://everflux.de/?p=1791</guid>
		<description><![CDATA[Oracle hat heute den Glassfish 3.1 freigegeben &#8211; gleichzeitig als Open Source und als Oracle Glassfish Edition. Es gibt eine Menge neues, und dazu gehören auch neue Probleme. Ich verwende Glassfish schon seit geraumer Zeit um mittels &#8220;Continuous Deployment&#8221; für aktuell entwickelte Anwendungen eine separate Umgebung zu haben, in der ich und Kollegen testen können. [...]<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/glassfish-3-1-probleme-mit-dwr-2-und-mehr-1791/">Glassfish 3.1: Probleme mit DWR 2 (und mehr)</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Oracle hat heute den Glassfish 3.1 freigegeben &#8211; gleichzeitig als Open Source und als Oracle Glassfish Edition. Es gibt eine Menge neues, und dazu gehören auch neue Probleme.</p>
<p>Ich verwende Glassfish schon seit geraumer Zeit um mittels &#8220;Continuous Deployment&#8221; für aktuell entwickelte Anwendungen eine separate Umgebung zu haben, in der ich und Kollegen testen können. Das ganze funktioniert mittels eine CI-Servers (<del>Hudson</del> Jenkins in diesem Fall), Maven und einem Deploy Plugin.</p>
<p>Auch mit Glassfish 3.1 funktionierte das Deployment prima &#8211; also hier war kein Update von Jenkins oder dem Deploy Plugin erforderlich. Auch die Anwendung startete &#8211; jedoch funktionierte nichts. Exceptions über ungültige Sessions gab es, auch Log-Einträge vom hier für Ajax eingesetzten DWR (Direct Web Remoting)<br />
<code><br />
2011-02-28 18:57:13,037 [http-thread-pool-8090(2)] ERROR o.d.dwrp.Batch - A request has been denied as a potential CSRF attack.<br />
2011-02-28 19:03:02,105 [http-thread-pool-8090(5)] ERROR o.d.dwrp.Batch - A request has been denied as a potential CSRF attack.<br />
</code><br />
Dank Firebug etwas schlauem Rumraten und Probieren fand ich dann heraus: Glassfish 3.1 setzt Session Cookies per Default auf &#8220;HTTP Only&#8221;. Dazu gibt es bereits ein Ticket im Glassfish Tracker: <a href="http://java.net/jira/browse/GLASSFISH-15730">GLASSFISH-15730</a></p>
<p>Es gibt nun mehrere Möglichkeiten für die nötige Kompatibilität mit Bestandsanwendungen zu sorgen:</p>
<p>Wird man die Anwendung zukünftig immer in einem Servlet 3.0 kompatiblen Container deployen, so kann man in der web.xml das Verhalten umkonfigurieren:</p>
<pre><code>&lt;web-app&gt;
  &lt;session-config&gt;
    &lt;cookie-config&gt;
      <strong>&lt;http-only&gt;true&lt;/http-only&gt;</strong>
    &lt;/cookie-config&gt;
  &lt;/session-config&gt;
&lt;/web-app&gt;
</code></pre>
<p>Alternativ kann man bei DWR den CSRF Check deaktivieren, wovon ich jedoch abraten würde:</p>
<pre>&lt;servlet&gt;
  &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;
  &lt;servlet-class&gt;org.directwebremoting.servlet.DwrServlet&lt;/servlet-class&gt;
  &lt;init-param&gt;
    &lt;param-name&gt;crossDomainSessionSecurity&lt;/param-name&gt;
    &lt;param-value&gt;false&lt;/param-value&gt;
  &lt;/init-param&gt;
&lt;/servlet&gt;</pre>
<p>Die letzte Möglichkeit ist &#8211; in diesem Fall &#8211; auf DWR 3 umzustellen, hier wurde das Problem grundsätzlich gelöst, so dass nicht mehr per JavaScript auf den Session Cookie zugegriffen werden muss. (Siehe <a href="http://slurm.dojotoolkit.org/jira/browse/DWR-26">DWR-26</a>) Leider gibt es von DWR 3 bisher noch kein Release, sondern lediglich vorab-Versionen.</p>
<p>Das Problem tritt übrigens auch mit Tomcat 7 auf, und nicht nur mit Glassfish 3.1 &#8211; ich frage mich, ob dies Verhalten am Ende sogar in der Servlet 3 Spezifikation vorgegeben ist.<br />
Natürlich betrifft dies nicht ausschließlich DWR, sondern auch andere Anwendungen, die per JavaScript auf den Session Cookie zugreifen wollen/müssen.</p>
<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/glassfish-3-1-probleme-mit-dwr-2-und-mehr-1791/">Glassfish 3.1: Probleme mit DWR 2 (und mehr)</a></p>
<p>Ähnliche Beiträge:<ol>
<li><a href='http://everflux.de/glassfish-3-1-und-httponly-session-cookie-1794/' rel='bookmark' title='Glassfish 3.1 und httpOnly Session Cookie'>Glassfish 3.1 und httpOnly Session Cookie</a></li>
<li><a href='http://everflux.de/netbeans-65-milestone-1-php-groovy-glassfish-und-mehr-604/' rel='bookmark' title='Netbeans 6.5 Milestone 1 PHP, Groovy, Glassfish und mehr'>Netbeans 6.5 Milestone 1 PHP, Groovy, Glassfish und mehr</a></li>
<li><a href='http://everflux.de/glassfish-v3-prelude-der-neue-glassfish-ist-da-725/' rel='bookmark' title='GlassFish v3 Prelude: Der neue Glassfish ist da'>GlassFish v3 Prelude: Der neue Glassfish ist da</a></li>
<li><a href='http://everflux.de/glassfish-remote-monitoring-mit-visualvm-auf-ubuntu-1720/' rel='bookmark' title='Glassfish remote Monitoring mit VisualVM auf Ubuntu'>Glassfish remote Monitoring mit VisualVM auf Ubuntu</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://everflux.de/glassfish-3-1-probleme-mit-dwr-2-und-mehr-1791/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jetty org.eclipse.jetty.io.EofException / Connection closed</title>
		<link>http://everflux.de/jetty-org-eclipse-jetty-io-eofexception-connection-closed-1788/</link>
		<comments>http://everflux.de/jetty-org-eclipse-jetty-io-eofexception-connection-closed-1788/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 13:27:52 +0000</pubDate>
		<dc:creator>everflux</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jetty]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://everflux.de/?p=1788</guid>
		<description><![CDATA[Bei der Umstellung von Jetty 6 zu Jetty 7 gab es (wie bereits geschildert) das eine oder andere an Überraschungsmomenten. So auch bei einem länger laufenden Request ( Fileupload anschließendes Parsen und Datenbank Updates die sich einige Minuten hinziehen können). Die saubere Lösung wäre hier natürlich dem Nutzer eine Art Fortschritts-Anzeige zu präsentieren. Da die [...]<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/jetty-org-eclipse-jetty-io-eofexception-connection-closed-1788/">Jetty org.eclipse.jetty.io.EofException / Connection closed</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Bei der Umstellung von Jetty 6 zu Jetty 7 gab es (wie bereits geschildert) das eine oder andere an Überraschungsmomenten. So auch bei einem länger laufenden Request ( Fileupload anschließendes Parsen und Datenbank Updates die sich einige Minuten hinziehen können).</p>
<p>Die saubere Lösung wäre hier natürlich dem Nutzer eine Art Fortschritts-Anzeige zu präsentieren. Da die Funktion jedoch so bereits getestet ist, und auch kein Umbau geplant war, sollte es so bleiben. Lediglich Jetty hat hier (mal wieder) einen Strich durch die Rechnung gemacht: Geschlossene Verbindungen die mit <strong>org.eclipse.jetty.io.EofException</strong> und vielen hässlichen Stacktraces kommentiert wurden. Erst hatte ich die Applikation in Verdacht.</p>
<p>Dann den Browser &#8211; macht der Browser vielleicht die Verbindung zu, wird der Socket nur solange wie &#8220;keep-alive&#8221; erlaubt ist offen gehalten? Mit etwas wireshark / tcpdump konnte ich dann beweisen: Es war Jetty. Der Server schloss die Verbindung bevor der Prozess fertig war.</p>
<p>Zum Glück kann man aber den idle Timeout von Jetty konfigurieren, das ist die Zeit, in der eine Verbindung ohne Fortschritt fortbestehen darf. (Fortschritt wäre hier ein gesendetes oder empfangenes Byte.) Hier kann man noch gut in die Falle tappen, dass die Zeit in Milisekunden angegeben werden muss &#8211; lediglich der verdeckte Hinweis, dass der Wert &#8220;grob gesagt&#8221; in den Parameter für <code>Socket.setSoTimeout(int)</code> übersetzt wird, bringt einen hier auf die Spur.</p>
<p>Für das Jetty Maven Plugin sieht das dann so aus:<br />
<code><br />
&lt;configuration&gt;<br />
  &lt;connectors&gt;<br />
    &lt;connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"&gt;<br />
      &lt;port&gt;8080&lt;/port&gt;<br />
      &lt;maxIdleTime&gt;600000&lt;/maxIdleTime&gt; &lt;!-- 10 minutes in milliseconds! --&gt;<br />
      &lt;lowResourcesMaxIdleTime&gt;600000&lt;/lowResourcesMaxIdleTime&gt;<br />
    &lt;/connector&gt;<br />
  &lt;/connectors&gt;<br />
&lt;/configuration&gt;<br />
</code></p>
<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/jetty-org-eclipse-jetty-io-eofexception-connection-closed-1788/">Jetty org.eclipse.jetty.io.EofException / Connection closed</a></p>
<p>Ähnliche Beiträge:<ol>
<li><a href='http://everflux.de/maven-jetty-und-reloads-session-persistieren-1775/' rel='bookmark' title='Maven, Jetty und Reloads: Session persistieren'>Maven, Jetty und Reloads: Session persistieren</a></li>
<li><a href='http://everflux.de/maven-jetty-und-der-extraclasspath-1780/' rel='bookmark' title='Maven, Jetty und der ExtraClasspath'>Maven, Jetty und der ExtraClasspath</a></li>
<li><a href='http://everflux.de/eclipse-rcpswt-fehler-javalangunsatisfiedlinkerror-no-swt-mozilla-gtk-504/' rel='bookmark' title='Eclipse RCP/SWT Fehler java.lang.UnsatisfiedLinkError: no swt-mozilla-gtk'>Eclipse RCP/SWT Fehler java.lang.UnsatisfiedLinkError: no swt-mozilla-gtk</a></li>
<li><a href='http://everflux.de/mysterioses-eclipse-457/' rel='bookmark' title='Mysteriöses Eclipse'>Mysteriöses Eclipse</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://everflux.de/jetty-org-eclipse-jetty-io-eofexception-connection-closed-1788/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven, Jetty und der ExtraClasspath</title>
		<link>http://everflux.de/maven-jetty-und-der-extraclasspath-1780/</link>
		<comments>http://everflux.de/maven-jetty-und-der-extraclasspath-1780/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 16:23:41 +0000</pubDate>
		<dc:creator>everflux</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jetty]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://everflux.de/?p=1780</guid>
		<description><![CDATA[Es hat nur wenige Monate gedauert, aber dann konnte ich endlich einen besonders nervigen Fehler finden. Ich verwende Maven (wie fast immer) als Buildsystem und habe ein Projekt, dass Eclipse BIRT verwendet. BIRT nutzt die Eclipse OSGi Plattform und daher werden beim Start einige Bilbiotheken benötigt. Nun gab es das Problem, dass dies im Tomcat [...]<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/maven-jetty-und-der-extraclasspath-1780/">Maven, Jetty und der ExtraClasspath</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Es hat nur wenige Monate gedauert, aber dann konnte ich endlich einen besonders nervigen Fehler finden. Ich verwende Maven (wie fast immer) als Buildsystem und habe ein Projekt, dass Eclipse BIRT verwendet.<br />
BIRT nutzt die Eclipse OSGi Plattform und daher werden beim Start einige Bilbiotheken benötigt. Nun gab es das Problem, dass dies im Tomcat nach einer kleinen Anpassung des Classpath prima funktionierte &#8211; nicht jedoch wenn ich das Maven Jetty Plugin verwendet habe. Trotz lt. Dokumentation korrekter Konfiguration über <strong>webAppConfig</strong> und <strong>extraClasspath</strong> Elemente.</p>
<p>Die Lösung war dann schließlich nicht mehr das maven-jetty-plugin in Version 6.1.2 sondern das &#8211; Achtung &#8211; jetty-maven-plugin in Version 7.2.1.v20101111 (die Versionnummer ist kein Witz) zu verwenden. Offenbar ein Jetty Bug &#8211; anders kann ich es mir nicht erklären.</p>
<p>Und so sieht dann die vollständige Konfiguration aus, die bei mir dann endlich auch zum Testen schnell und komfortabel funktioniert:</p>
<pre>&lt;plugin&gt;
  &lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;
  &lt;artifactId&gt;jetty-maven-plugin&lt;/artifactId&gt;
  &lt;version&gt;7.2.1.v20101111&lt;/version&gt;
  &lt;configuration&gt;
    &lt;webAppConfig&gt;
      &lt;extraClasspath&gt;${BIRT_HOME}/lib/engineapi.jar;${BIRT_HOME}/lib/coreapi.jar; \
${BIRT_HOME}/lib/modelapi.jar;${BIRT_HOME}/lib/org.apache.commons.codec_1.3.0.v20100518-1140.jar; \
${BIRT_HOME}/lib/scriptapi.jar&lt;/extraClasspath&gt;
    &lt;/webAppConfig&gt;
  &lt;/configuration&gt;
&lt;/plugin&gt;
</pre>
<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/maven-jetty-und-der-extraclasspath-1780/">Maven, Jetty und der ExtraClasspath</a></p>
<p>Ähnliche Beiträge:<ol>
<li><a href='http://everflux.de/maven-jetty-und-reloads-session-persistieren-1775/' rel='bookmark' title='Maven, Jetty und Reloads: Session persistieren'>Maven, Jetty und Reloads: Session persistieren</a></li>
<li><a href='http://everflux.de/jetty-org-eclipse-jetty-io-eofexception-connection-closed-1788/' rel='bookmark' title='Jetty org.eclipse.jetty.io.EofException / Connection closed'>Jetty org.eclipse.jetty.io.EofException / Connection closed</a></li>
<li><a href='http://everflux.de/hudson-maven-java-net-sockettimeoutexception-accept-timed-out-1504/' rel='bookmark' title='Hudson + Maven: java.net.SocketTimeoutException: Accept timed out'>Hudson + Maven: java.net.SocketTimeoutException: Accept timed out</a></li>
<li><a href='http://everflux.de/maven-properties-werden-falsch-gefiltert-1698/' rel='bookmark' title='Maven Properties werden falsch gefiltert?'>Maven Properties werden falsch gefiltert?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://everflux.de/maven-jetty-und-der-extraclasspath-1780/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven, Jetty und Reloads: Session persistieren</title>
		<link>http://everflux.de/maven-jetty-und-reloads-session-persistieren-1775/</link>
		<comments>http://everflux.de/maven-jetty-und-reloads-session-persistieren-1775/#comments</comments>
		<pubDate>Sat, 22 Jan 2011 15:24:31 +0000</pubDate>
		<dc:creator>everflux</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Web Entwicklung]]></category>
		<category><![CDATA[jetty]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://everflux.de/?p=1775</guid>
		<description><![CDATA[Entwickelt man mit Jetty als Servlet Container, so fällt der im Vergleich zu Glassfish relativ hohe Aufwand für Re-Deployments auf: Startet man Jetty per &#8220;mvn jetty:run&#8221; für jedes Deployment erneut, so dauert der Neustart erst mal relativ lange, dazu geht noch die gerade aktive Session verloren. So muss man sich gegebenenfalls nach jeder Änderung bzw. [...]<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/maven-jetty-und-reloads-session-persistieren-1775/">Maven, Jetty und Reloads: Session persistieren</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Entwickelt man mit Jetty als Servlet Container, so fällt der im Vergleich zu Glassfish relativ hohe Aufwand für Re-Deployments auf: Startet man Jetty per &#8220;mvn jetty:run&#8221; für jedes Deployment erneut, so dauert der Neustart erst mal relativ lange, dazu geht noch die gerade aktive Session verloren. So muss man sich gegebenenfalls nach jeder Änderung bzw. jedem Restart erneut anmelden.<br />
Das kann man relativ einfach ändern: Jetty verfügt über die Möglichkeit die Session zu persistieren &#8211; dazu müssen natürlich Session Objekte serialisierbar sein, aber das sollten diese ja sowieso sein. (Stichwort &#8220;Session migration&#8221; und &#8220;Clustering&#8221;)<br />
Leider findet sich auf der Jetty Homepage lediglich eine Anleitung für Jetty 6 &#8211; Jetty 7 wird nun von Eclipse weiter entwickelt und damit gehen einige Änderungen einher, für die ich hier eine Beispielkonfiguration habe:</p>
<pre>&lt;plugin&gt;
&lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;
&lt;artifactId&gt;jetty-maven-plugin&lt;/artifactId&gt;
&lt;version&gt;7.2.1.v20101111&lt;/version&gt;
&lt;configuration&gt;
  &lt;webAppConfig&gt;
    &lt;sessionHandler implementation="org.eclipse.jetty.server.session.SessionHandler"&gt;
      &lt;sessionManager implementation="org.eclipse.jetty.server.session.HashSessionManager"&gt;
      &lt;storeDirectory&gt;${basedir}/target/sessions/&lt;/storeDirectory&gt;
    &lt;/sessionManager&gt;
  &lt;/sessionHandler&gt;
&lt;contextPath&gt;/${project.artifactId}&lt;/contextPath&gt;
&lt;/webAppConfig&gt;
&lt;!--
&lt;reload&gt;automatic&lt;/reload&gt;
&lt;scanIntervalSeconds&gt;2&lt;/scanIntervalSeconds&gt;
&lt;scanTargets&gt;
&lt;scanTarget&gt;target/classes/&lt;/scanTarget&gt;
&lt;/scanTargets&gt;--&gt;
&lt;/configuration&gt;
&lt;/plugin&gt;
</pre>
<p>Mit dieser Einstellung werden die Session Daten in dem Order &#8220;target/sessions&#8221; persistiert, und man kann bei einem Neustart dort weitermachen, wo man aufgehört hat.</p>
<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/maven-jetty-und-reloads-session-persistieren-1775/">Maven, Jetty und Reloads: Session persistieren</a></p>
<p>Ähnliche Beiträge:<ol>
<li><a href='http://everflux.de/maven-jetty-und-der-extraclasspath-1780/' rel='bookmark' title='Maven, Jetty und der ExtraClasspath'>Maven, Jetty und der ExtraClasspath</a></li>
<li><a href='http://everflux.de/jetty-org-eclipse-jetty-io-eofexception-connection-closed-1788/' rel='bookmark' title='Jetty org.eclipse.jetty.io.EofException / Connection closed'>Jetty org.eclipse.jetty.io.EofException / Connection closed</a></li>
<li><a href='http://everflux.de/glassfish-3-1-und-httponly-session-cookie-1794/' rel='bookmark' title='Glassfish 3.1 und httpOnly Session Cookie'>Glassfish 3.1 und httpOnly Session Cookie</a></li>
<li><a href='http://everflux.de/maven-properties-werden-falsch-gefiltert-1698/' rel='bookmark' title='Maven Properties werden falsch gefiltert?'>Maven Properties werden falsch gefiltert?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://everflux.de/maven-jetty-und-reloads-session-persistieren-1775/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Servlet (Spring Controller) auf Root Path mappen</title>
		<link>http://everflux.de/java-servlet-spring-controller-auf-root-path-mappen-1753/</link>
		<comments>http://everflux.de/java-servlet-spring-controller-auf-root-path-mappen-1753/#comments</comments>
		<pubDate>Wed, 12 Jan 2011 17:18:12 +0000</pubDate>
		<dc:creator>everflux</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux/OpenSource]]></category>
		<category><![CDATA[Web Entwicklung]]></category>
		<category><![CDATA[servlet]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://everflux.de/?p=1753</guid>
		<description><![CDATA[Nicht immer genuegt es, wenn man ein Servlets auf andere Pfade oder Patterns mappt, manchmal möchte man bereits auf den Context Root ein Servlet mappen. Der übliche Work-Around sieht so aus, dass man bspw. in einer &#8220;index.jsp&#8221; einen redirect auf eine tatsächlich einem Servlet zugeordnete URL (über den Pfad oder Datei Extension) macht, das könnte [...]<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/java-servlet-spring-controller-auf-root-path-mappen-1753/">Java Servlet (Spring Controller) auf Root Path mappen</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Nicht immer genuegt es, wenn man ein Servlets auf andere Pfade oder Patterns mappt, manchmal möchte man bereits auf den Context Root ein Servlet mappen. Der übliche Work-Around sieht so aus, dass man bspw. in einer &#8220;index.jsp&#8221; einen redirect auf eine tatsächlich einem Servlet zugeordnete URL (über den Pfad oder Datei Extension) macht, das könnte so aussehen:<br />
<code><br />
&lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt;<br />
&lt;c:redirect url="/myServlet"/&gt;<br />
</code><br />
Das ist aber nicht immer praktikabel &#8211; nun soll es darum gehen ein Servlet direkt auf den &#8220;/&#8221; Pfad zu mappen &#8211; dafür gibt es mehrere Möglichkeiten:</p>
<ol>
<li>Das Default Servlet ersetzen, dazu wird auf den Root Pfad &#8220;/&#8221; in der web.xml ein Mapping angelegt:<code><br />
&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;myServlet&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;/&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;</code></li>
<li>Ab Servlet Spezifikation kann auch ein Servlet in der welcome-file-list in der web.xml gemappt werden:<br />
<code>&lt;welcome-file-list&gt;<br />
&lt;welcome-file&gt;myServlet&lt;/welcome-file&gt;<br />
&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />
&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />
&lt;/welcome-file-list&gt;</code></li>
</ol>
<p>Im folgenden beschreibe ich die Vor- und Nachteile der verschiedenen Ansätze, und welche Erfahrungen ich mit verschiedenen Web Containern dabei gemacht habe.<span id="more-1753"></span>Das Default Servlet wird in der Regel zur Auslieferung von statischen Ressourcen (z.B. Bilder, CSS Dateien) und dem Directory Listing verwendet. Ersetzt man das Default Servlet des Web Containers nun durch ein eigenes, muss man sich ggf. selber um die zusätzlichen Aufgaben kümmern, oder die statischen Inhalte über einen anderen Pfad ausliefern, z.B. &#8220;static&#8221; und diesen auf das Default Servlet mappen:</p>
<pre><code>&lt;servlet-mapping&gt;
    &lt;servlet-name&gt;default&lt;/servlet-name&gt;
    &lt;url-pattern&gt;/static/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;</code></pre>
<p>Da inzwischen wirklich überall Servlet 2.4 konforme Webcontainer im Einsatz sein dürften, ist der Web über ein Servlet als Welcome-File praktischer: Das vom Container bereitgestellte Default Servlet kommt weiterhin für die restlichen Ressourcen zum Einsatz, an der Struktur des Projektes muss nichts geändert werden. Die zugehörige Konfiguration in der web.xml für ein Spring Dispatcher Servlet könnte z.B. so aussehen:<br />
<code><br />
&lt;servlet&gt;<br />
&lt;description&gt;Spring Dispatcher Servlet&lt;/description&gt;<br />
&lt;servlet-name&gt;myServlet&lt;/servlet-name&gt;<br />
&lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt;<br />
&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;</code></p>
<p>&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;myServlet&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;</p>
<p>&lt;welcome-file-list&gt;<br />
&lt;welcome-file&gt;myServlet&lt;/welcome-file&gt;<br />
&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />
&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />
&lt;/welcome-file-list&gt;</p>
<p>Das funktioniert soweit in Tomcat und Glassfish auch &#8211; allerdings nicht in Jetty. Und Jetty verwende ich sehr gerne zum lokalen Testen, z.B. über das Jetty Maven Plugin. Zu dem Fehler von Jetty gibt es auch einen Bug in der Jetty Bug Datenbank (<a href="http://jira.codehaus.org/browse/JETTY-936">936</a>), offenbar sind die Jetty Entwickler der Auffassung, dass die Spezifikation in diesem Punkt &#8220;stupid&#8221; sei, man weigert sich da auch in dem Codehaus Jetty 6.1.x das Defaultverhalten der Spezifikation gemäss anzupassen.<br />
Um das Verhalten zu korrigieren, muss man das Jetty Default Servlet anders konfigurieren &#8211; damit bekommt das Projekt eine Jetty Abhängigkeit, die in meinen Augen nicht gewünscht ist, vor allem nicht, wenn Jetty lediglich zur Entwicklung eingesetzt wird.</p>
<p>Jetty ist nun zu Eclipse umgezogen und mit Jetty 7 ändert sich das Problem ein wenig: Jetty 7 akzeptiert nun im Default auch Servlets für ein Welcome-File-Mapping &#8211; jedoch findet vorher noch eine Prüfung statt, ob die Datei existiert. Existiert sie nicht, wird ein 404 HTTP Fehler erzeugt. Natürlich kann man dies über Konfiguration des Default Servlets ändern &#8211; aber dann hat man wieder die Jetty Abhängigkeit im Projekt. Hier hilft ein kleiner Trick: Man legt einfach eine leere Datei, z.B. index.html, an, gibt diese (zusätzlich) in der Welcome-File-List an, und mappt diesen Pfad auch noch auf das entsprechende Servlet. Diese Lösung funktioniert mit allen von mir getesteten Containern. Also kommt zusätzlich in die web.xml:<br />
<code><br />
&lt;!-- for stupid jetty --&gt;<br />
&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;myServlet&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;/index.html&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;<br />
</code><br />
Für das Maven Plugin von Jetty 7 hat sich der Artefakt Name geändert, und auch der Default Context ist &#8220;/&#8221; statt des Artefakt Namens &#8211; so sieht der Eintrag im POM daher aus:</p>
<pre>&lt;plugin&gt;
  &lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;
    &lt;artifactId&gt;jetty-maven-plugin&lt;/artifactId&gt;
    &lt;version&gt;7.2.1.v20101111&lt;/version&gt;
    &lt;configuration&gt;
      &lt;webAppConfig&gt;
        &lt;contextPath&gt;/${artifactId}&lt;/contextPath&gt;
      &lt;/webAppConfig&gt;
    &lt;/configuration&gt;
&lt;/plugin&gt;
</pre>
<p>Nun noch die Konfiguration für Spring 3 Controller, die auf den Root Path gemappt werden sollen.  Ich verwende hier die Spring Annotationen für @Controller und @RequestMapping. Das Problem hier: Jetty ruft &#8220;natürlich&#8221; die &#8220;index.html&#8221; auf &#8211; auch hierfür muss der Controller dann ein Mapping haben. Die Lösung dafür ist ein Pattern zu verwenden, was Spring erlaubt:</p>
<pre><code>@Controller
public class SampleController
{
   @RequestMapping(value = "*", method = RequestMethod.GET)
   public ModelAndView rootPathHandler()
   {
       //...
       return new ModelAndView("sample");
   }
}
</code></pre>
<p>Artikel von: <a href="http://everflux.de/">everflux.de</a><br/><br/><a href="http://everflux.de/java-servlet-spring-controller-auf-root-path-mappen-1753/">Java Servlet (Spring Controller) auf Root Path mappen</a></p>
<p>Ähnliche Beiträge:<ol>
<li><a href='http://everflux.de/netbeans-package-javax-servlet-jsp-does-not-exist-cannot-find-symbol-1751/' rel='bookmark' title='Netbeans: &#8220;package javax.servlet.jsp does not exist&#8221; (cannot find symbol)'>Netbeans: &#8220;package javax.servlet.jsp does not exist&#8221; (cannot find symbol)</a></li>
<li><a href='http://everflux.de/web-xml-tag-reihenfolge-relevant-1717/' rel='bookmark' title='web.xml Tag Reihenfolge: Relevant!'>web.xml Tag Reihenfolge: Relevant!</a></li>
<li><a href='http://everflux.de/heuschrecken-springsource-spring-framework-lock-in-673/' rel='bookmark' title='Heuschrecken @ SpringSource: Spring Framework lock-in'>Heuschrecken @ SpringSource: Spring Framework lock-in</a></li>
<li><a href='http://everflux.de/php-fastcgi-path-bug-ubuntu-hardy-1089/' rel='bookmark' title='PHP FastCGI Path Bug (Ubuntu Hardy)'>PHP FastCGI Path Bug (Ubuntu Hardy)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://everflux.de/java-servlet-spring-controller-auf-root-path-mappen-1753/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

