<?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>Olaf&#039;s blog &#187; continuum</title>
	<atom:link href="http://olafsblog.sysbsb.de/category/continuum/feed/" rel="self" type="application/rss+xml" />
	<link>http://olafsblog.sysbsb.de</link>
	<description>Olaf&#039;s blog on software development and life</description>
	<lastBuildDate>Sat, 14 Aug 2010 20:39:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>OutOfMemoryError using findbugs &amp; continuum &#8211; and how to fix it.</title>
		<link>http://olafsblog.sysbsb.de/outofmemoryerror-using-findbugs-continuum-and-how-to-fix-it/</link>
		<comments>http://olafsblog.sysbsb.de/outofmemoryerror-using-findbugs-continuum-and-how-to-fix-it/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 00:04:35 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[continuum]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[maven 2]]></category>

		<guid isPermaLink="false">http://olafsblog.sysbsb.de/?p=46</guid>
		<description><![CDATA[When using findbugs through the findbugs maven plugin, one is very likely to see the maven build in continuum fail with an OutOfMemory-Exception like this:


java.lang.OutOfMemoryError: Java heap space
	at java.util.ArrayList.&#60;init&#62;(ArrayList.java:112)
	at edu.umd.cs.findbugs.ba.Frame.&#60;init&#62;(Frame.java:111)
	at edu.umd.cs.findbugs.ba.vna.ValueNumberFrame.&#60;init&#62;(ValueNumberFrame.java:55)
	at edu.umd.cs.findbugs.ba.vna.ValueNumberAnalysis.createFact(ValueNumberAnalysis.java:131)
	at edu.umd.cs.findbugs.ba.vna.ValueNumberAnalysis.createFact(ValueNumberAnalysis.java:56)
	at edu.umd.cs.findbugs.ba.BasicAbstractDataflowAnalysis.lookupOrCreateFact(BasicAbstractDataflowAnalysis.java:171)
	at edu.umd.cs.findbugs.ba.BasicAbstractDataflowAnalysis.getResultFact(BasicAbstractDataflowAnalysis.java:73)
	at edu.umd.cs.findbugs.ba.Dataflow.&#60;init&#62;(Dataflow.java:78)
	at edu.umd.cs.findbugs.ba.AbstractDataflow.&#60;init&#62;(AbstractDataflow.java:42)
	at edu.umd.cs.findbugs.ba.vna.ValueNumberDataflow.&#60;init&#62;(ValueNumberDataflow.java:34)
	at edu.umd.cs.findbugs.ba.ClassContext$3.analyze(ClassContext.java:611)
	at edu.umd.cs.findbugs.ba.ClassContext$3.analyze(ClassContext.java:599)
	at edu.umd.cs.findbugs.ba.ClassContext$AnalysisFactory.getAnalysis(ClassContext.java:266)
	at edu.umd.cs.findbugs.ba.ClassContext.getValueNumberDataflow(ClassContext.java:1376)
	at edu.umd.cs.findbugs.detect.BuildUnconditionalParamDerefDatabase.analyzeMethod(BuildUnconditionalParamDerefDatabase.java:96)
	at edu.umd.cs.findbugs.detect.BuildUnconditionalParamDerefDatabase.considerMethod(BuildUnconditionalParamDerefDatabase.java:85)
	at edu.umd.cs.findbugs.detect.BuildUnconditionalParamDerefDatabase.visitClassContext(BuildUnconditionalParamDerefDatabase.java:71)
	at edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:64)
	at edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:658)
	at edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:185)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.codehaus.groovy.runtime.metaclass.ReflectionMetaMethod.invoke(ReflectionMetaMethod.java:52)
	at org.codehaus.groovy.runtime.MetaClassHelper.doMethodInvoke(MetaClassHelper.java:714)
	at [...]]]></description>
			<content:encoded><![CDATA[<p>When using <a href="http://findbugs.sourceforge.net">findbugs</a> through the <a href="http://mojo.codehaus.org/findbugs-maven-plugin/">findbugs maven plugin</a>, one is very likely to see the maven build in <a href="http://continuum.apache.org/">continuum</a> fail with an OutOfMemory-Exception like this:<br />
<span id="more-46"></span><br />
<code><br />
java.lang.OutOfMemoryError: Java heap space<br />
	at java.util.ArrayList.&lt;init&gt;(ArrayList.java:112)<br />
	at edu.umd.cs.findbugs.ba.Frame.&lt;init&gt;(Frame.java:111)<br />
	at edu.umd.cs.findbugs.ba.vna.ValueNumberFrame.&lt;init&gt;(ValueNumberFrame.java:55)<br />
	at edu.umd.cs.findbugs.ba.vna.ValueNumberAnalysis.createFact(ValueNumberAnalysis.java:131)<br />
	at edu.umd.cs.findbugs.ba.vna.ValueNumberAnalysis.createFact(ValueNumberAnalysis.java:56)<br />
	at edu.umd.cs.findbugs.ba.BasicAbstractDataflowAnalysis.lookupOrCreateFact(BasicAbstractDataflowAnalysis.java:171)<br />
	at edu.umd.cs.findbugs.ba.BasicAbstractDataflowAnalysis.getResultFact(BasicAbstractDataflowAnalysis.java:73)<br />
	at edu.umd.cs.findbugs.ba.Dataflow.&lt;init&gt;(Dataflow.java:78)<br />
	at edu.umd.cs.findbugs.ba.AbstractDataflow.&lt;init&gt;(AbstractDataflow.java:42)<br />
	at edu.umd.cs.findbugs.ba.vna.ValueNumberDataflow.&lt;init&gt;(ValueNumberDataflow.java:34)<br />
	at edu.umd.cs.findbugs.ba.ClassContext$3.analyze(ClassContext.java:611)<br />
	at edu.umd.cs.findbugs.ba.ClassContext$3.analyze(ClassContext.java:599)<br />
	at edu.umd.cs.findbugs.ba.ClassContext$AnalysisFactory.getAnalysis(ClassContext.java:266)<br />
	at edu.umd.cs.findbugs.ba.ClassContext.getValueNumberDataflow(ClassContext.java:1376)<br />
	at edu.umd.cs.findbugs.detect.BuildUnconditionalParamDerefDatabase.analyzeMethod(BuildUnconditionalParamDerefDatabase.java:96)<br />
	at edu.umd.cs.findbugs.detect.BuildUnconditionalParamDerefDatabase.considerMethod(BuildUnconditionalParamDerefDatabase.java:85)<br />
	at edu.umd.cs.findbugs.detect.BuildUnconditionalParamDerefDatabase.visitClassContext(BuildUnconditionalParamDerefDatabase.java:71)<br />
	at edu.umd.cs.findbugs.DetectorToDetector2Adapter.visitClass(DetectorToDetector2Adapter.java:64)<br />
	at edu.umd.cs.findbugs.FindBugs2.analyzeApplication(FindBugs2.java:658)<br />
	at edu.umd.cs.findbugs.FindBugs2.execute(FindBugs2.java:185)<br />
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br />
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br />
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br />
	at java.lang.reflect.Method.invoke(Method.java:597)<br />
	at org.codehaus.groovy.runtime.metaclass.ReflectionMetaMethod.invoke(ReflectionMetaMethod.java:52)<br />
	at org.codehaus.groovy.runtime.MetaClassHelper.doMethodInvoke(MetaClassHelper.java:714)<br />
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:583)<br />
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:476)<br />
	at org.codehaus.groovy.runtime.Invoker.invokePogoMethod(Invoker.java:115)<br />
	at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:81)<br />
	at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:85)<br />
	at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:158)<br />
</code></p>
<p>This is not because continuum lacks memory, but because maven does &#8211; and running findbugs is a quite resource-hungry undertaking.<br />
The following addition to the &#8220;mvn&#8221; executable (residing in your maven&#8217;s &#8220;bin&#8221; folder) should do (tested in the 2.0.8 release):</p>
<p><code>MAVEN_OPTS="-Xmx1024m -Xms128m -XX:MaxPermSize=512m"</code>.</p>
<p>I must admit that <code>-Xmx1024m</code> is rather generous, though. 256m or 512m might do for many cases, too.</p>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/outofmemoryerror-using-findbugs-continuum-and-how-to-fix-it/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ContinuumBuildCancelledException in continuum</title>
		<link>http://olafsblog.sysbsb.de/continuumbuildcancelledexception-in-continuum/</link>
		<comments>http://olafsblog.sysbsb.de/continuumbuildcancelledexception-in-continuum/#comments</comments>
		<pubDate>Sun, 20 Apr 2008 23:48:12 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[continuum]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[maven 2]]></category>

		<guid isPermaLink="false">http://olafsblog.sysbsb.de/?p=44</guid>
		<description><![CDATA[Users of continuum might see their builds fail with the following exception when running a little more voluminous build:

org.apache.maven.continuum.execution.ContinuumBuildCancelledException: The build was cancelled

	at org.apache.maven.continuum.execution.AbstractBuildExecutor.executeShellCommand(AbstractBuildExecutor.java:214)
	at org.apache.maven.continuum.execution.maven.m2.MavenTwoBuildExecutor.build(MavenTwoBuildExecutor.java:138)
	at org.apache.maven.continuum.core.action.ExecuteBuilderContinuumAction.execute(ExecuteBuilderContinuumAction.java:118)
	at org.apache.maven.continuum.buildcontroller.DefaultBuildController.performAction(DefaultBuildController.java:408)
	at org.apache.maven.continuum.buildcontroller.DefaultBuildController.build(DefaultBuildController.java:147)
	at org.apache.maven.continuum.buildcontroller.BuildProjectTaskExecutor.executeTask(BuildProjectTaskExecutor.java:50)
	at org.codehaus.plexus.taskqueue.execution.ThreadedTaskQueueExecutor$ExecutorRunnable$1.run(ThreadedTaskQueueExecutor.java:116)
	at edu.emory.mathcs.backport.java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442)
	at edu.emory.mathcs.backport.java.util.concurrent.FutureTask.run(FutureTask.java:176)
	at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:987)
	at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:528)
	at java.lang.Thread.run(Thread.java:619)
Caused by: org.codehaus.plexus.util.cli.CommandLineException: Error while executing external command, process killed.
	at org.codehaus.plexus.util.cli.CommandLineUtils.executeCommandLine(CommandLineUtils.java:164)
	at org.codehaus.plexus.util.cli.CommandLineUtils.executeCommandLine(CommandLineUtils.java:89)
	at org.apache.maven.continuum.utils.shell.DefaultShellCommandHelper.executeShellCommand(DefaultShellCommandHelper.java:114)
	at org.apache.maven.continuum.utils.shell.DefaultShellCommandHelper.executeShellCommand(DefaultShellCommandHelper.java:59)
	at org.apache.maven.continuum.execution.AbstractBuildExecutor.executeShellCommand(AbstractBuildExecutor.java:202)
	... 11 more
Caused by: java.lang.InterruptedException
	at java.lang.Object.wait(Native Method)
	at [...]]]></description>
			<content:encoded><![CDATA[<p>Users of <a href="http://continuum.apache.org/">continuum</a> might see their builds fail with the following exception when running a little more voluminous build:</p>
<p><code><br />
org.apache.maven.continuum.execution.ContinuumBuildCancelledException: The build was cancelled<br />
<span id="more-44"></span><br />
	at org.apache.maven.continuum.execution.AbstractBuildExecutor.executeShellCommand(AbstractBuildExecutor.java:214)<br />
	at org.apache.maven.continuum.execution.maven.m2.MavenTwoBuildExecutor.build(MavenTwoBuildExecutor.java:138)<br />
	at org.apache.maven.continuum.core.action.ExecuteBuilderContinuumAction.execute(ExecuteBuilderContinuumAction.java:118)<br />
	at org.apache.maven.continuum.buildcontroller.DefaultBuildController.performAction(DefaultBuildController.java:408)<br />
	at org.apache.maven.continuum.buildcontroller.DefaultBuildController.build(DefaultBuildController.java:147)<br />
	at org.apache.maven.continuum.buildcontroller.BuildProjectTaskExecutor.executeTask(BuildProjectTaskExecutor.java:50)<br />
	at org.codehaus.plexus.taskqueue.execution.ThreadedTaskQueueExecutor$ExecutorRunnable$1.run(ThreadedTaskQueueExecutor.java:116)<br />
	at edu.emory.mathcs.backport.java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442)<br />
	at edu.emory.mathcs.backport.java.util.concurrent.FutureTask.run(FutureTask.java:176)<br />
	at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:987)<br />
	at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:528)<br />
	at java.lang.Thread.run(Thread.java:619)<br />
Caused by: org.codehaus.plexus.util.cli.CommandLineException: Error while executing external command, process killed.<br />
	at org.codehaus.plexus.util.cli.CommandLineUtils.executeCommandLine(CommandLineUtils.java:164)<br />
	at org.codehaus.plexus.util.cli.CommandLineUtils.executeCommandLine(CommandLineUtils.java:89)<br />
	at org.apache.maven.continuum.utils.shell.DefaultShellCommandHelper.executeShellCommand(DefaultShellCommandHelper.java:114)<br />
	at org.apache.maven.continuum.utils.shell.DefaultShellCommandHelper.executeShellCommand(DefaultShellCommandHelper.java:59)<br />
	at org.apache.maven.continuum.execution.AbstractBuildExecutor.executeShellCommand(AbstractBuildExecutor.java:202)<br />
	... 11 more<br />
Caused by: java.lang.InterruptedException<br />
	at java.lang.Object.wait(Native Method)<br />
	at java.lang.Object.wait(Object.java:485)<br />
	at java.lang.UNIXProcess.waitFor(UNIXProcess.java:165)<br />
	at org.codehaus.plexus.util.cli.CommandLineUtils.executeCommandLine(CommandLineUtils.java:128)<br />
	... 15 more<br />
</code></p>
<p>The simple reason is: The build is taking longer than continuum allows it to take, and thus the execution is canceled.<br />
The maximum amount of time a build may take is schedule-specific, and can thus be configured in the &#8220;schedules&#8221; view under &#8220;Administration&#8221;.</p>
<p>If you change the execution time, i would recommend to adapt the time between checks for new builds accordingly.</p>
<p>Here&#8217;s a screenshot showing the setting that worked for my maven project:</p>
<p><img id="image43" src="http://olafsblog.sysbsb.de/wp-content/uploads/2008/04/continuum-edit-schedule.png" alt="Continuum: Edit schedule" /></p>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/continuumbuildcancelledexception-in-continuum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuring custom username for maven&#8217;s scm with subversion and ssh</title>
		<link>http://olafsblog.sysbsb.de/configuring-custom-username-for-mavens-scm-with-subversion-and-ssh/</link>
		<comments>http://olafsblog.sysbsb.de/configuring-custom-username-for-mavens-scm-with-subversion-and-ssh/#comments</comments>
		<pubDate>Sun, 20 Apr 2008 23:25:57 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[System engineering]]></category>
		<category><![CDATA[continuum]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[maven 2]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://olafsblog.sysbsb.de/?p=42</guid>
		<description><![CDATA[I just stumbled over a nice little problem: When using the maven 2 changelog plugin, it automatically uses the configured &#60;scm&#62; settings and attempts to fetch the change history with them.
Unfortunately, such a setting usually does not contain a username, since this has to be provided by the actual team member connecting to version control.
Neither [...]]]></description>
			<content:encoded><![CDATA[<p>I just stumbled over a nice little problem: When using the <a href="http://maven.apache.org/plugins/maven-changelog-plugin/">maven 2 changelog plugin</a>, it automatically uses the configured &lt;scm&gt; settings and attempts to fetch the change history with them.</p>
<p>Unfortunately, such a setting usually does not contain a username, since this has to be provided by the actual team member connecting to version control.<br />
Neither did i have any intention to configure a placeholder into the scm section, forcing the developers to mess with the maven settings.xml in order to provide their own username.</p>
<p>Luckily, after searching a while, i found a proper solution.<br />
SSH allows an optional per-host specific username setting to be placed in a file called &#8220;config&#8221; located in the user&#8217;s .ssh directory, for example</p>
<p>File: ~/.ssh/config</p>
<p><code><br />
Host my.host.name<br />
User myusername<br />
</code></p>
<p>Thanks to <a href="http://programmingishard.com/users/spicycode">Chad Humphries</a>  for posting <a href="http://programmingishard.com/code/434">the Solution on programming is hard</a>.<br />
It really wasn&#8217;t&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/configuring-custom-username-for-mavens-scm-with-subversion-and-ssh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven2-Projekt in Continuum konfigurieren</title>
		<link>http://olafsblog.sysbsb.de/java-entwicklungsarchitektur-teil-2-maven2-projekt-in-continuum-konfigurieren/</link>
		<comments>http://olafsblog.sysbsb.de/java-entwicklungsarchitektur-teil-2-maven2-projekt-in-continuum-konfigurieren/#comments</comments>
		<pubDate>Sat, 19 Jan 2008 15:17:25 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[System architecture]]></category>
		<category><![CDATA[continuum]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[maven 2]]></category>

		<guid isPermaLink="false">http://olafsblog.sysbsb.de/?p=5</guid>
		<description><![CDATA[In diesem Post zeige ich, wie ein bestehendes maven 2-Projekt in  Continuum integriert wird.

2.1: Voraussetzungen

Continuum ist erfolgreich aufgesetzt
Es existiert bereits ein maven2-Projekt
Das bestehende maven2-Projekt ist unter Versionskontrolle (Vorzugsweise subversion)

2.2: &#60;scm&#62;-Konfiguration der POM.xml überprüfen
Da sich continuum einige essentielle Informationen aus der primären pom.xml beschafft, muss der &#60;scm&#62; Eintrag auf jeden Fall vorhanden sein.
Hier ein Beispiel, [...]]]></description>
			<content:encoded><![CDATA[<p>In diesem Post zeige ich, wie ein bestehendes maven 2-Projekt in  <a href="http://maven.apache.org/continuum/">Continuum</a> integriert wird.<br />
<span id="more-5"></span></p>
<h2>2.1: Voraussetzungen</h2>
<ul>
<li><a href="http://olafsblog.sysbsb.de/?p=15">Continuum ist erfolgreich aufgesetzt</a></li>
<li>Es existiert bereits ein maven2-Projekt</li>
<li>Das bestehende maven2-Projekt ist unter Versionskontrolle (Vorzugsweise <a href="http://subversion.tigris.org/">subversion</a>)</li>
</ul>
<h2>2.2: &lt;scm&gt;-Konfiguration der POM.xml überprüfen</h2>
<p>Da sich continuum einige essentielle Informationen aus der primären pom.xml beschafft, muss der <code>&lt;scm&gt;</code> Eintrag auf jeden Fall vorhanden sein.<br />
Hier ein Beispiel, wie die  &lt;scm&gt;-Sektion für <code>svn+ssh</code> konfiguriert ist, wenn sich die developer-connection, connection und url nicht unterscheiden (was oft der Fall ist):</p>
<pre class="brush: xml;">
	&lt;scm&gt;
		&lt;connection&gt;
			scm:svn:svn+ssh://hostname/[repository-URL]/[Ordner mit primärer pom.xml]
		&lt;/connection&gt;
		&lt;developerConnection&gt;
			scm:svn:svn+ssh://hostname/[repository-URL]/[Ordner mit primärer pom.xml]
		&lt;/developerConnection&gt;
		&lt;tag&gt;HEAD&lt;/tag&gt;
		&lt;url&gt;
			scm:svn:svn+ssh://hostname/[repository-URL]/[Ordner mit primärer pom.xml]
		&lt;/url&gt;
	&lt;/scm&gt;
</pre>
<p>Wichtig, ist, dass die Einträge mit scm:svn: beginnen; Nur so kann continuum die korrekte &#8220;Provider&#8221; &#8211; Klasse für den Zugriff auf das Repository bestimmen.</p>
<p>Des weiteren würde ich empfehlen, auch die <code><developers>...</code>-Sektion in der pom gefüllt zu haben, da die dort enthaltenen Developer ebenfalls in die Konfiguration des continuum-Projektes einfliessen.</p>
<h2>2.3: Build-Profil in continuum anlegen</h2>
<p>Continuum erlaubt es sinnvollerweise, die JAVA und maven-Versionen in Profilen zu speichern und diese den Builds zuzuweisen.<br />
Vor dem Anlegen eines Projektes empfiehlt es sich also, ein Profil Anzulegen.</p>
<p>Dazu werden zunächst die vorhandenen JAVA und maven-Versionen (und ggf. weitere Tools) unter &#8220;Installations&#8221; hinzugefügt.<br />
Hier ein Beispiel mit java 1.6 und maven 2.0.8:</p>
<p><img id="image7" src="http://olafsblog.sysbsb.de/wp-content/uploads/2008/01/continuum_add_installation.png" alt="Installations in Continuum" /></p>
<p>Eine Auswahl dieser <em>Installations</em> lässt sich dann als Profil zusammenfassen:</p>
<p><img id="image8" src="http://olafsblog.sysbsb.de/wp-content/uploads/2008/01/continuum_profiles.png" alt="Profiles in continuum" /></p>
<h2>2.4: Maven 2-Projekt importieren</h2>
<p>Ist die pom richtig konfiguriert und ein Profil vorhanden, lässt sich unter &#8220;Add Project&#8221; > &#8220;Add Maven2.x Project&#8221; ein Dialog zum Hinzufügen einer pom öffnen.<br />
Continuum unterscheidet dabei zwischen zwei unterschiedlichen Fällen:</p>
<ul>
<li>Zugriff auf eine pom.xml per http(s)</li>
<li>Zugriff auf eine pom.xml per upload (nur single-module pom&#8217;s)</li>
</ul>
<p>Wichtig ist dabei, dass Continuum diese pom.xml nur ein einziges mal, nämlich zum Anlegen des Projektes benötigt (später wird automatisch die pom.xml aus dem konfigurierten SCM-Repository verwendet).<br />
Hat man kein <a href="http://maven.apache.org/plugins/maven-eclipse-plugin/examples/multi-module-projects.html">Multi-Module Projekt</a>, so empfiehlt sich die &#8220;Upload&#8221; Funktion.<br />
Ansonsten muss die pom.xml und die dazugehörigen Unterverzeichnisse und pom&#8217;s über http(s) verfügbar sein.<br />
Man kann also <em>nicht</em> ein scm: &#8230;. URL in das Eingabefeld eintragen, sondern (leider) nur eine http/https URL.</p>
<p>Das ist kein Problem, wenn man Subversion (empfehlenswerter Weise) über Apache per https verfügbar gemacht hat.<br />
In meinem Fall war das nicht möglich, da das Universitäts-SVN nur per &#8220;svn+ssh&#8221; verfügbar ist.<br />
Ich habe also das maven-Projekt (Ohne Sourcecode, nur die pom&#8217;s und Verzeichnisse) auf einen x-beliebigen Webserver geschoben und einfach die entsprechende http-URL verwendet.<br />
Da diese nur einmal benötigt wird, ist das kein grosses Problem.</p>
<p>Continuum konfiguriert und installiert nun das Projekt automatisch und legt es unter der in der pom spezifizierten Gruppe an, in meinem Falle wie folgt:</p>
<p><img id="image9" src="http://olafsblog.sysbsb.de/wp-content/uploads/2008/01/continuum_project_groups.png" alt="project groups in continuum" /></p>
<h3>2.4.1: Anpassen der Projekt-Build Konfiguration</h3>
<p>Hat man ein multi-module Projekt, so werden die Module durch continuum per default nicht rekursiv, sondern einzeln gebaut (maven-Option <code>--non-recursive</code>).<br />
Das kann Probleme geben, wenn man relative Pfade in seiner Konfiguration verwendet hat (beliebt bspw: &#8220;../src/config/&#8230;..&#8221;). Am einfachsten ist es, lediglich das primär-Projekt bestehen zu lassen und das rekursive Bauen durch Entfernen der &#8211;non-recursive-Option wieder zu aktivieren.</p>
<p>Das in 2.3 konfigurierte Profil kann im Projekt ausgewählt werden, ebenso wie ein Schedule.<br />
Schedules können unter &#8220;Administration&#8221; angelegt werden und sind nichts weiter als eine einfache CRON-Einträge mit dem aus <a href="http://en.wikipedia.org/wiki/Crontab">Unix bekannten Format</a>. Ein Projekt mit eigenem Profil und Schedule sieht dann etwa so aus:</p>
<p><img id="image10" src="http://olafsblog.sysbsb.de/wp-content/uploads/2008/01/continuum_project_information.png" alt="project information in continuum" /></p>
<h3>2.4.2: Notifications</h3>
<p>Benachrichtigungen über Build-Vorgänge können in der pom.xml  oder direkt in Continuum konfiguriert werden. Continuum 1.1 unterstützt dabei mail, irc, jabber, MSN und <a href="http://maven.apache.org/wagon/">Wagon</a> als Benachrichtigungstypen.</p>
<p>Am naheliegendsten dürfte wohl eine Benachrichtigung per E-Mail sein.</p>
<p>Hat man seine <code><developers></code> in der pom konfiguriert, so hat jeder Developer eine eindeutige <code><id></code>, welche man für die Konfiguration von Benachrichtigungen in folgender Weise in der pom.xml nutzt:</p>
<pre class="brush: xml;">
&lt;ciManagement&gt;
&lt;system&gt;continuum&lt;/system&gt;
&lt;url&gt;[continuum-url]&lt;/url&gt;
&lt;notifiers&gt;
    &lt;notifier&gt;
      &lt;type&gt;mail&lt;/type&gt;
      &lt;configuration&gt;
        &lt;address&gt;developer-id&lt;/address&gt;
      &lt;/configuration&gt;
    &lt;/notifier&gt;
    &lt;/notifier&gt;
    ... [weitere notifier] ...
&lt;/notifiers&gt;
&lt;/ciManagement&gt;
</pre>
<p>Statt der Developer-id kann auch eine E-Mail Adresse verwendet werden.</p>
<p>Alternativ lassen sich auch weitere Benachrichtigungen in der Projekt-Sicht von Continuum hinzufügen.</p>
<p>Wichtig beim Versand der E-Mails ist die <a href="http://olafsblog.sysbsb.de/?p=15#improveconf">richtige E-Mail Konfiguration von continuum (1.4: Konfiguration verbessern)</a>. Insbesondere sollte die absender-Adresse den korrekten Hostnamen des continuum-Servers beinhalten, da die Mails sonst leicht als SPAM klassifiziert werden.</p>
<h2>Referenzen &#038; Literaturempfehlungen</h2>
<ul>
<li>
              <a href="http://maven.apache.org/continuum/">Apache Continuum</a><br />
              Homepage des Apache-Continuum Projektes
     </li>
<li>
              <a href="http://maven.apache.org/">Apache Maven</a><br />
              Homepage des Apache-Maven Projektes
     </li>
<li>
              <a href="http://www.cdi-ag.de/index.php?action=sec&#038;artId=91">Kontinuierlich zum Ziel &#8211; Eine Einführung in Maven Continuum</a><br />
              JavaMagazin 07/2007<br />
              Autor: Dr. Halil-Cem Gürsoy <br />
              Knappe Einführung in continuum, bietet aber eine gute Ãœbersicht
     </li>
<li>
              <a href="http://today.java.net/lpt/a/293#adding-maven2-project">Continuous Integration with Continuum</a><br />
              Java.net<br />
              Autor: John Ferguson Smart<br />
              Umfangreiches Howto aus dem Jahr 2006, was noch ein paar Andere Aspekte zeigt als mein Post.
     </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/java-entwicklungsarchitektur-teil-2-maven2-projekt-in-continuum-konfigurieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Continuum-1.1 aufsetzen</title>
		<link>http://olafsblog.sysbsb.de/java-entwicklungsarchitektur-teil-1-continuum-11-aufsetzen/</link>
		<comments>http://olafsblog.sysbsb.de/java-entwicklungsarchitektur-teil-1-continuum-11-aufsetzen/#comments</comments>
		<pubDate>Fri, 18 Jan 2008 18:11:19 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[System architecture]]></category>
		<category><![CDATA[System engineering]]></category>
		<category><![CDATA[continuum]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[maven 2]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://olafsblog.sysbsb.de/?p=15</guid>
		<description><![CDATA[In diesem Post zeige ich, wie der Continuous-Integration Server Continuum mit tomcat 6     und MYSQL aufgesetzt und konfiguriert werden kann. 
Hin und wieder ist man in der Universität mit der vergnüglichen Tatsache konfrontiert, dass es weder eine brauchbare vorhandene Anzahl an Entwicklungswerkzeugen gibt, noch dass sich irgend jemand &#8211; ausserhalb von [...]]]></description>
			<content:encoded><![CDATA[<p>In diesem Post zeige ich, wie der Continuous-Integration Server <a href="http://maven.apache.org/continuum/ ">Continuum</a> mit <a href="http://tomcat.apache.org/">tomcat 6</a>     und MYSQL aufgesetzt und konfiguriert werden kann. </p>
<p>Hin und wieder ist man in der Universität mit der vergnüglichen Tatsache konfrontiert, dass es weder eine brauchbare vorhandene Anzahl an Entwicklungswerkzeugen gibt, noch dass sich irgend jemand &#8211; ausserhalb von Lehrveranstaltungen &#8211; um Prozesse in der Softwareentwicklung kümmert.</p>
<p>Sprich: Ein Projekt soll umgesetzt werden, und auÃŸer einem SVN-Account gibt&#8217;s nichts.</p>
<p>Bei einem Team von 8 Leuten ist das völlig unzureichend. Neben einem ordentlichen <a href="http://en.wikipedia.org/wiki/Issue_tracking">Issue tracking</a> bin ich auch daran gewöhnt,<span id="more-15"></span> mittels eines <a href="http://en.wikipedia.org/wiki/Continuous_integration">Continous Integration-Systems</a> aktuelle Buildstände abzurufen und den Stand der Dinge im Auge behalten zu können. Von einem ordentlichen WIKI zur Projektdoku ganz zu schweigen.</p>
<p>Da der Code an sich mittels Maven2 verwaltet wird, hatte ich sofort <a href="http://maven.apache.org/continuum/">continuum</a> ins Auge gefasst &#8211; schlieÃŸlich ist continuum selbst Java-basiert und speziell für maven &#8211; Projekte entwickelt.</p>
<h3>1.1: Voraussetzungen</h3>
<p>Da Continuum eine J2EE-Webapplikation ist, muss zunächst einmal ein entsprechender Servletcontainer her.<br />
Im recht schwachbrüstigen <a href="http://docs.codehaus.org/display/CONTINUUMUSER/Home">WIKI</a> werden Resin, JBOSS, tomcat und glassfish als Referenzen angeführt.<br />
Da ich mich gut mit <a href="http://tomcat.apache.org">Tomcat</a> auskenne entschloss ich mich, continuum mit diesem zu installieren. als JDK entschied ich mich für Sun&#8217;s <a href="http://java.sun.com/javase/downloads/index.jsp">JDK 1.6.3</a>, Datenbank sollte nicht die integrierte Derby, sondern ein vorhandenes MYSQL werden.</p>
<h3>1.2: Die richtige Distribution herunterladen</h3>
<p>Auf der <a href="http://maven.apache.org/continuum/download.html">continuum-Downloadseite</a> stehen unterschiedliche Arten des 1.1-Releases zur Verfügung:<br />
Die etwas schräge standalone-Distribution (Warum sollte man so etwas benutzen, wo es ein schönes, Standardkonformes WAR-Deployment gibt?), und die webapp-Distribution.<br />
Ich empfehle in jedem Fall letztere zu verwenden, da somit kein Herumgefrickel in irgendwelchen Scripten notwendig wird.</p>
<h3>1.3: continuum deployen und konfigurieren</h3>
<h4>1.3.1: Tomcat installieren</h4>
<p>Der gute Tomcat lässt sich sehr einfach installieren. Ist das JDK vorhanden muss lediglich die Umgebungsvariable JAVA_HOME gesetzt sein.<br />
Dann reicht es, wenn man keine weiteren Anpassungen braucht, die <a href="http://tomcat.apache.org/download-60.cgi#6.0.16">tomcat 6 core-distribution herunterzuladen</a> und zu entpacken. Unix-typisch sind unter <em>bin/</em> die ausführbaren Dateien, sprich start-Scripts (auch das weiter unten erwähnte catalina.sh &#8211; Script).<br />
Unter <em>conf/</em> findet man die <em>server.xml</em>, in welcher man die unten angeführten Anpassungen für die mysql-Anbindung durchführen kann.</p>
<h4>1.3.2: continuum-Parameter in Umgebungsvariablen</h4>
<p>Aus einem mir unklaren Grund brauch die continuum-webapp zwei JVM-Parameter um sich &#8220;zu orientieren&#8221;:<br />
appserver.home und appserver.base sollten entsprechend auf das CATALINA_HOME und CATALINA_BASE Verzeichnis zeigen.<br />
Bei einer sauberen default- Installation sind diese Verzeichnisse identisch. Ich habe das durch einen Eintrag am Anfang der <em>catalina.sh</em> erledigt:</p>
<pre class="brush: java;">
export CATALINA_OPTS=&quot;-Dappserver.home=$CATALINA_HOME -Dappserver.base=$CATALINA_HOME&quot;
</pre>
<h4>1.3.3: MYSQL anbinden</h4>
<p>Out-Of-The-Box verwendet Continuum Derby als Datenbank. Da ich MYSQL verwenden wollte war es notwendig, eigene <em>DataSource</em>-Konfigurationen vorzunehmen.<br />
DataSources können Global oder Kontext-spezifisch in Tomcat Konfiguriert werden. Ich entschied mich, sie im <code>&lt;Context&gt;</code> Element der server.xml zu konfigurieren:</p>
<pre class="brush: xml;">
&lt;Context path=&quot;/continuum&quot; docBase=&quot;continuum&quot;&gt;
&lt;Resource name=&quot;jdbc/users&quot;
            auth=&quot;Container&quot;
            type=&quot;javax.sql.DataSource&quot;
            username=&quot;...&quot;
            password=&quot;...&quot;
            driverClassName=&quot;com.mysql.jdbc.Driver&quot;
            url=&quot;jdbc:mysql://localhost/...?autoReconnect=true&quot; /&gt;

  &lt;Resource name=&quot;jdbc/continuum&quot;
            auth=&quot;Container&quot;
            type=&quot;javax.sql.DataSource&quot;
            username=&quot;...&quot;
            password=&quot;...&quot;
            driverClassName=&quot;com.mysql.jdbc.Driver&quot;
            url=&quot;jdbc:mysql://localhost/...?autoReconnect=true&quot; /&gt;

  &lt;Resource name=&quot;mail/Session&quot;
            auth=&quot;Container&quot;
            type=&quot;javax.mail.Session&quot;
            mail.smtp.host=&quot;localhost&quot;/&gt;
&lt;/Context&gt;
</pre>
<p>Dazu muss der passende mysql-connector natürlich im lib-Verzeichnis des Tomcats platziert werden. (Bei 5&#8242;er Tomcats unter common/lib, ab 6 einfach &#8220;lib&#8221;).<br />
Wichtig ist, dass der Datenbanknutzer Tabellen etc. anlegen darf. Zudem ist bei der Anbindung von continuum an MYSQL oft folgende Fehlermeldung zu sehen:</p>
<p><code><br />
Error thrown executing CREATE TABLE '.....'<br />
...<br />
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Specified key was too long; max key length is 765 bytes<br />
</code></p>
<p>Das Problem existiert, da Continuum PRIMARY KEY-Constraints über mehrere varchar-Felder (als composite primary key) verwendet und tritt auf, wenn für<br />
das Encoding der für continuum verwendeten Datenbank ein Encoding gewählt wurde, wass mehr als ein Byte pro Character verwendet &#8211; Beispielsweise &#8220;utf8_general_ci&#8221;.<br />
Ich habe aus diesem Grund ein latin1-Encoding verwendet &#8211; Danach lief alles glatt.</p>
<h4>1.3.4: Richtiges ablegen der .war-Datei</h4>
<p>Extrem wichtig ist, dass Verzeichnis der continuum webapp unter &#8220;webapps&#8221; genau so zu nennen wie den Contextnamen:</p>
<pre class="brush: xml;">
&lt;Context path=&quot;/continuum&quot; docBase=&quot;continuum&quot;&gt;
</pre>
<p>Da es ansonsten zu unangenehmen Fehlern bei der Auflösung der konfigurierten Datasource kommt.<br />
Das continuumâ€¦.war-File sollte also unter &#8220;webapps&#8221; am besten als &#8220;continuum.war&#8221; gespeichert werden.</p>
<h4>1.3.5: Start!</h4>
<p>Mit diesen Einstellungen sollte die Continuum webapp starten. Der Startvorgang wird recht ausführlich im logs-verzeichnis von catalina protokolliert.</p>
<h3 id="improveconf">1.4: Konfiguration verbessern</h3>
<p>Die Out-Of-The-Box Konfiguration hat noch ein paar Defizite, welche in der application.xml der ausgepackten .war-Datei verbessert werden können.<br />
Diese findet sich unter â€¦/webapps/continuum/WEb-INF/classes/META-INF/plexus.</p>
<p>Unter</p>
<pre class="brush: xml;">
    &lt;!--
    | The mail notifier
    |--&gt;
    &lt;component&gt;
      &lt;role&gt;org.codehaus.plexus.notification.notifier.Notifier&lt;/role&gt;
      &lt;role-hint&gt;mail&lt;/role-hint&gt;
      &lt;implementation&gt;org.apache.maven.continuum.notification.mail.MailContinuumNotifier&lt;/implementation&gt;
    ...
</pre>
<p>Sollte beispielsweise die sender-mailbox konfiguriert werden, da continuum sonst als continuum@localhost Nachrichten per SMTP versendet:</p>
<pre class="brush: xml;">
    &lt;configuration&gt;
        &lt;from-mailbox&gt;continuum@myhost.domain&lt;/from-mailbox&gt;
        &lt;from-name&gt;Continuum Server&lt;/from-name&gt;
</pre>
<h3>1.5: Problem mit Jsch beheben</h3>
<p>In der mit Continuum ausgelieferten Version enthält die <a href="http://www.jcraft.com/jsch/">java secure channel-Blibliothek</a> Noch einen Nullpointer-Fehler, der sich<br />
allerdings erst dann zeigt, wenn tatsächlich ein build in continuum durchgeführt wird. Dann erscheint folgendes im build-log:</p>
<p><code><br />
...<br />
java.lang.NullPointerException<br />
at com.jcraft.jsch.ChannelSession.run(Unknown Source)<br />
...<br />
</code></p>
<p>Zum Beheben einfach das jsch&#8230;.jar File aus dem WEB-INF/lib Verzeichnes der continuum webapp mit einer aktuelleren Version, in meinem Fall jsch-0.1.36.jar, ersetzen.</p>
<p>Weiter geht es in <a href="http://olafsblog.sysbsb.de/?p=5">Maven2-Projekt in Continuum konfigurieren</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/java-entwicklungsarchitektur-teil-1-continuum-11-aufsetzen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
