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

<channel>
	<title>knallisworld &#187; mac os x</title>
	<atom:link href="http://www.knallisworld.de/blog/tag/mac-os-x/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.knallisworld.de/blog</link>
	<description>Where is the beef?</description>
	<lastBuildDate>Wed, 28 Jul 2010 11:41:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=1556</generator>
		<item>
		<title>Mac OS X Remote Install via Disc Target Mode</title>
		<link>http://www.knallisworld.de/blog/2009/05/29/mac-os-x-remote-install-via-disc-target-mode/</link>
		<comments>http://www.knallisworld.de/blog/2009/05/29/mac-os-x-remote-install-via-disc-target-mode/#comments</comments>
		<pubDate>Fri, 29 May 2009 20:43:32 +0000</pubDate>
		<dc:creator>knalli</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[remote install]]></category>

		<guid isPermaLink="false">http://www.knallisworld.de/blog/?p=724</guid>
		<description><![CDATA[Problem: Leider ist das Superdrive von meinem MacBook Pro scheinbar schon etwas mitgenommen.. denn die Leopard-CD (normal, kein OEM) wollte er nicht mehr lesen &#8211; der iMac aber schon. Dafür aber die mitgelieferte DVD, nur war das noch Tiger (10.4). Was tun? Die Problemlösung ist die gleiche, wenn man ein ganz kaputtes Superdrive hat. Idee [...]]]></description>
			<content:encoded><![CDATA[<p>Problem: Leider ist das Superdrive von meinem MacBook Pro scheinbar schon etwas mitgenommen.. denn die Leopard-CD (normal, kein OEM) wollte er nicht mehr lesen &#8211; der iMac aber schon. <img src='http://www.knallisworld.de/blog/wp-includes/images/smilies/icon_neutral.gif' alt=':|' class='wp-smiley' />  Dafür aber die mitgelieferte DVD, nur war das noch Tiger (10.4). Was tun?</p>
<p>Die Problemlösung ist die gleiche, wenn man ein ganz kaputtes Superdrive hat.</p>
<h4>Idee 1: Remote Install oder in deutsch: Entfernte Installation</h4>
<p>Dieses Feature wurde mit der Einführung des Macbook Airs in Leopard integriert &#8211; okay, fein, den Host könnte der iMac spielen. Leider scheint das entweder nicht funktionieren oder aber es funktioniert tatsächlich nur mit dem Macbook Air <img src='http://www.knallisworld.de/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Geht nicht. Schade</p>
<h4>Idee 2: Die Leopard-DVD vom iMac</h4>
<p>Ja, geniale Idee.. nur (leider) sind die mitgelieferten DVDs allesamt OEM-Versionen, die jeweils nur für die Produktreihe funktionieren. Also mit anderen Worten: Einen anderen iMac kann ich Leopard installieren, für ein anderes Macbook hätt ich ein(en) Tiger im Angebot.. ach menno <img src='http://www.knallisworld.de/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<h4>Idee 2.5: Disc Target Mode</h4>
<p>Nachdem die Installation der iMac-Leopard-DVD auf dem Macbook Pro die Installation verweigerte, kam mir eine Blitzidee: Targetmode. Damit startet man das Target (also das Macbook) in einen besonderen Bootstatus; zeitgleich verbindet man den Target mit dem Hostrechner (Mac) und kann von dort auf die Platten zugreifen (vgl. externe Platten). Da man bei einem Mac auf externe Platten wie die eigene zugreifen kann, kann man auch installieren. Und wenn man für den Host auch eine gültige Installations-CD hat (oder ein funktionierendes Laufwerk)&#8230; *freu*</p>
<p>Tatsache, man nehme also die Boot-DVD des Hosts (hier iMac), mit der man &#8220;booten &amp; installieren darf&#8221;. Als Zielmedium wählt man aber die Platte aus, die auf dem Target liegt &#8211; sehr einfach an dem Symbol eines externen Datenträgers zu erkennen. Nicht vergessen, vor dem nächsten Neustart die Rechner alle auszumachen, Kabel raus.. neu starten.. und voila. <img src='http://www.knallisworld.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.knallisworld.de/blog/2009/05/29/mac-os-x-remote-install-via-disc-target-mode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac OS X: Non-Java exception raised.</title>
		<link>http://www.knallisworld.de/blog/2009/05/01/mac-os-x-non-java-exception-raised/</link>
		<comments>http://www.knallisworld.de/blog/2009/05/01/mac-os-x-non-java-exception-raised/#comments</comments>
		<pubDate>Fri, 01 May 2009 18:07:32 +0000</pubDate>
		<dc:creator>knalli</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[zugriffsrechte]]></category>

		<guid isPermaLink="false">http://www.knallisworld.de/blog/?p=682</guid>
		<description><![CDATA[Böses Erwachen nach einem Reboot: Auf einmal funktionierte Swing nicht mehr richtig, Components mit eigener paint()-Methode funktionierten gar nicht oder verursachten die abenteuerlichsten Zeichnungen. Schätzungsweise nach dem Installieren des Developerpacks habe ich irgendwann letzte Woche (&#62; 9 Tage) nicht den Mac nicht neu gestartet.. dann wäre mir das früher aufgefallen. Der genaue Wortlaut der Meldung: [...]]]></description>
			<content:encoded><![CDATA[<p>Böses Erwachen nach einem Reboot: Auf einmal funktionierte Swing nicht mehr richtig, Components mit eigener paint()-Methode funktionierten gar nicht oder verursachten die abenteuerlichsten Zeichnungen. Schätzungsweise nach dem Installieren des Developerpacks habe ich irgendwann letzte Woche (&gt; 9 Tage) nicht den Mac nicht neu gestartet.. dann wäre mir das früher aufgefallen.</p>
<p>Der genaue Wortlaut der Meldung: exception: java.lang.RuntimeException: Non-Java exception raised, not handled! (Original problem: Error (10000) creating CGSWindow)</p>
<p>Nach ein bisschen Recherche mit dieser Meldung stieß ich dann auf diesen <a href="http://help.ravensoundsoftware.com/forum/showthread.php?p=290">Thread</a>, in welchem auch die Lösung parat steht: Zugriffsrechte reparieren lassen und rebooten. Warum man rebooten muss (man muss es, habe es ausprobiert), entzieht sich meiner Kenntnisse; vielleicht werden manche Ressourcen nur einmal geöffnet?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.knallisworld.de/blog/2009/05/01/mac-os-x-non-java-exception-raised/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java-Applikation als Mac-Anwendung deployen (Ant)</title>
		<link>http://www.knallisworld.de/blog/2009/04/21/java-applikation-als-mac-anwendung-deployen-ant/</link>
		<comments>http://www.knallisworld.de/blog/2009/04/21/java-applikation-als-mac-anwendung-deployen-ant/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 21:15:48 +0000</pubDate>
		<dc:creator>knalli</dc:creator>
				<category><![CDATA[Diplomarbeit.. ftw!]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[MacOS X]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[mac os x]]></category>

		<guid isPermaLink="false">http://www.knallisworld.de/blog/?p=674</guid>
		<description><![CDATA[Wie bereits berichtet, ist es von Vorteil, der Buildprozess mit einem Ant-Script zu automatisieren. Um eine Mac-Application zu erstellen, muss man nur wissen, wie eine solche Application aufgebaut ist.. der Rest ist ein Klacks. Eine Mac-Application ist ein Verzeichnis mit der Erweiterung .app. Die Struktur einer Application (wir nennen sie im Folgenden Application) sieht wie [...]]]></description>
			<content:encoded><![CDATA[<p>Wie <a href="http://www.knallisworld.de/blog/2009/04/21/automatischer-deploy-von-java-applikationen-oder-ant-builds-mit-externen-jars-und-svn-informationen/#content">bereits</a> berichtet, ist es von Vorteil, der Buildprozess mit einem Ant-Script zu automatisieren. Um eine Mac-Application zu erstellen, muss man nur wissen, wie eine solche Application aufgebaut ist.. der Rest ist ein Klacks.</p>
<p>Eine Mac-Application ist ein Verzeichnis mit der Erweiterung <em>.app</em>. Die Struktur einer Application (wir nennen sie im Folgenden <em>Application</em>) sieht wie folgt aus:</p>
<ul>
<li>Application.app
<ul>
<li>Contents
<ul>
<li>Info.plist &#8212; Properties-Datei für die Anwendung und Java</li>
<li>MacOS &#8212; Verzeichnis
<ul>
<li>JavaApplicationStub &#8212; Bootloader für Javaprogramme</li>
</ul>
</li>
<li>PkgInfo &#8212; Datei mit Entwicklerinfo</li>
<li>Resources &#8212; Verzeichnis mit dem eigentlichen Javaprogramm
<ul>
<li>Java</li>
</ul>
<ul>
<li>
<ul>
<li>Die Jars und so.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Den Bootloader befindet sich auf einem Mac in dem Ordner <em>/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub</em>.</p>
<p>Prinzipiell kann man sich diese Struktur komplett selber erstellen; es ist aber zu Empfehlen, den initialen Prozess durch das Programm <em>/Developer/Applications/Utilities/Jar Bundler</em> zu machen. Mit Hilfe dieses Programmes lässt sich für eine bereits fertige JAR die Application erstellen.</p>
<p>Anschließend kopiert man das erstellte Resultat &#8211; quasi als Vorlage &#8211; in ein Verzeichnis für die Builds. In meinem Fall in dem <em>build_data</em> Verzeichnis. Ein Ant-Task erstellt darauf hin im Verzeichnis <em>deploy</em> eine Application. Die Vorlage ist idealerweise auch im SVN und auch später noch veränderbar &#8211; beispielsweise durch das Ändern des Applicationicon, -titel oder anderen Einstellungen.</p>
<p>Wichtig 1: Bei Verwendung von FatJar muss man als Package für die Main den Bootloader von FatJar (com.simontuffs.onejar.Boot) verwenden. Dies erkennt das Programm Jar Bundler aber auch automatisch.</p>
<p>Wichtig 2: Beim Kopieren der Dateien kann es passieren, dass die Rechte an der <em>JavaApplicationStub</em> verloren gehen. Diese muss als ausführbar markiert sein. Ein entsprechender Ant-Befehl stellt das sicher.</p>
<p><code><span> </span>&lt;target name="makeMac" depends="makeNormal"&gt;<br />
&lt;copy todir="deploy/Application.app"&gt;<br />
&lt;fileset dir="build_data/Application.app"/&gt;<br />
&lt;/copy&gt;<br />
&lt;!-- chmod the application stub file executable --&gt;<br />
&lt;chmod file="deploy/Application.app/Contents/MacOS/JavaApplicationStub" perm="755"/&gt;<br />
&lt;copy file="deploy/Application.jar" tofile="deploy/Application.app/Contents/Resources/Java/Application.jar" /&gt;<br />
&lt;/target&gt;</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.knallisworld.de/blog/2009/04/21/java-applikation-als-mac-anwendung-deployen-ant/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Automatischer Deploy von Java-Applikationen oder: Ant Builds mit externen Jars und SVN-Informationen</title>
		<link>http://www.knallisworld.de/blog/2009/04/21/automatischer-deploy-von-java-applikationen-oder-ant-builds-mit-externen-jars-und-svn-informationen/</link>
		<comments>http://www.knallisworld.de/blog/2009/04/21/automatischer-deploy-von-java-applikationen-oder-ant-builds-mit-externen-jars-und-svn-informationen/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 16:59:23 +0000</pubDate>
		<dc:creator>knalli</dc:creator>
				<category><![CDATA[Diplomarbeit.. ftw!]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[mac os x]]></category>

		<guid isPermaLink="false">http://www.knallisworld.de/blog/?p=670</guid>
		<description><![CDATA[Der Eclipse-verwöhnte Programmierer braucht sich eigentlich nicht mit Begriffen wie Deploy oder Build herumschlagen &#8212; zumindestens nicht so lange man in der Entwicklung ist. Ein Knopfdruck auf &#8220;Run&#8221; und das Programm läuft. Sowohl alle lokalen Resourcen als auch alle externen Jars werden gefunden, eingebunden und können einwandfrei genutzt werden. Möchte man die Applikation nun fertigstellen [...]]]></description>
			<content:encoded><![CDATA[<p>Der Eclipse-verwöhnte Programmierer braucht sich eigentlich nicht mit Begriffen wie Deploy oder Build herumschlagen &#8212; zumindestens nicht so lange man in der Entwicklung ist. Ein Knopfdruck auf &#8220;Run&#8221; und das Programm läuft. Sowohl alle lokalen Resourcen als auch alle externen Jars werden gefunden, eingebunden und können einwandfrei genutzt werden.</p>
<p>Möchte man die Applikation nun fertigstellen und anderen zur Verfügung stellen &#8211; oder früher im Rahmen von Enduser-Tests &#8211; so kommt es bei großen Projekten unweigerlich zu Problemen.</p>
<p>Im Folgenden beschäftige ich mit den Problemen:</p>
<ol>
<li>Wie exportiere ich ein Projekt mit vielen externen Jars einfach und sicher in ein lauffähiges Jar?</li>
<li>Wie stelle ich sicher, das sowohl in der Entwicklungsumgebung als auch in der Jar alle Bilder o.ä. Ressourcen wiedergefunden werden?</li>
<li>Wie nutze ich einen eigenen Buildprozess und</li>
<li>Wie kann ich im Buildprozess Zusatzinformationen wie die aktuelle SVN-Revision oder das Build-Datum verwerten?</li>
</ol>
<p><span id="more-670"></span></p>
<h2>Problem 1: Viele externe Jars</h2>
<p>Eclipse bietet im Exportwizard die Möglichkeit, eine Jar-Datei zu erstellen. Dabei wird das aktuelle Projekt <span style="text-decoration: underline;">ohne</span> die verlinkten Jar-Dateien erstellt. Unschön, wenn man die Applikation als ganzes anbieten will. So eine Art Out-of-the-Box.</p>
<p>Seit Eclipse 3.4 bietet der Exportwizard eine Neuerung, die so genannte <em>Runnable Jar</em>. Dabei werden neben den eigenen Class-Dateien alle verlinkten Jars (sind ja in Wirklichkeit Zip-Dateien) extrahiert und alles, wirklich <em>alles</em>, in eine Jar geschmissen. Das funktioniert in einigen Fällen, ist aber erstens unschön, kann zweitens zu Problemen bei Namenskonflikten führen (bsp. Resourcenodner) und ist drittens u.U. nicht mit der Lizenz vereinbar. Auch nicht so ganz schön.</p>
<p>Das zuletzt angesprochene neue Feature ist eine Art &#8220;Light-Version&#8221; des <a href="http://fjep.sourceforge.net/">Fat Jar Eclipse-Plugin</a>. Das eigentliche Plugin selber hingehen bietet mehr: Das angegebene Projekt wird in ein Jar zusammengefügt (vgl. Option 1). Dazu kommen alle externen Jars &#8211; und entgegen der zweiten Option so wie sie sind. Das ganze wird in eine große Jar (quasi ein Wrapper) gepackt und mit einem kleinen &#8220;Bootloader&#8221; versehen. Perfekt!</p>
<h2>Problem 2: Lokale Ressourcen wie Bilder o.ä.</h2>
<p>Im lokalen Projekt funktioniert natürlich immer der Zugriff auf alle Ressourcen. Möchte man später jedoch ein Jar anbieten, muss man sich an einige Spielregeln halten. Erstens müssen sich die Ressourcen im (lokalen) Classpath befinden oder diesem bekannt gemacht werden. Zweitens können die Ressourcen selber nicht normal via File-Konstruktor geöffnet werden, sondern müssen über den ClassLoader geladen werden. In der Regel reicht der Standard Classloader.</p>
<p>Um also in einem Ressourcen sowohl im Entwicklungsprojekt als auch in der Jar später (und vor allem: in dem Multi-Jar-Archiv mit FatJar, siehe oben) zu benutzen, bedarf es folgender Konfiguration:</p>
<ul>
<li>In der Regel existiert ein Verzeichnis <em>src</em>, wo die Packages der eigenen Java-Dateien liegen. Dort einen Verzeichnis (Beispiel: <em>images</em>) anlegen, oder natürlich auch als Unterverzeichnis in einem Package (ist ja auch ein Verzeichnis).</li>
<li>Um in Java nun beispielsweise das Bild <em>image.png </em>aus dem Verzeichnis <em>images</em> zu laden, macht man folgendes: <code>URL url = classLoader.getResource("images/image.png")</code>. classLoader ist dabei der Standard-Classloader; diesen erhält man beispielsweise durch <code>classLoader = MyClass.class.getClassLoader()</code> wobei MyClass eine Klasse aus dem eigenen Projekt ist, die den Standard-ClassLoader verwendet. Das vollständige Beispiel zum Laden eines Bildes wäre also: <code>Icon icon = new ImageIcon(MyClass.class.getClassLoader().getResource("images/image.png"));</code></li>
</ul>
<h2>Problem 3a: Der Buildprozess</h2>
<p>Jedes Mal, wenn man eine Änderung am Projekt gemacht hat, muss das gesamte Projekt exportiert werden. Zum Beispiel mit dem o.g. FatJar-Plugin. Jedes Mal müssen die Einstellungen geprüft werden und eventuelle Sonderkonfigurationen wie Classpath-Erweiterungen oder Zusatzressourcen eingestellt werden. Dies ist nicht nur lästig und zeitaufreibend &#8211; es ist auch schlichtweg unnötig. Die Antwort darauf ist: Ant.</p>
<p>Ant ist die moderne Antwort auf make. Während make auf Kommandozeilen orientierte Konfiguration und auf Basis von Leerzeichen/Tabulatoren arbeitet, wird ant mittels XML &#8220;geschrieben&#8221;. Nicht ohne Grund verwendet Eclipse für die internen Buildprozesse &#8220;rein zufällig&#8221; auch Ant &#8211; und es lässt nicht überraschen, dass Eclipse auch externe Ant-Tasks ausführen kann. Für Unwissende: Das ist das dritte Icon oben, Debug, Run und eben Run Tool/External Tools wie etwa Ant-Tasks.</p>
<p>Im Wesentlichen ähnelt Ant dabei sehr an make. Es werden einzelne Targets und untereinander zusammenhängende Abhängigkeiten definiert. Auch können wahlweise Systemkommandos ausgeführt werden (ggf. plattformabhängig). Des Weiteren gibt es zu der großen Ant-Befehls-Library zahlreiche Plugins.</p>
<p>Das FatJar Plugin bietet beim Export-Prozess die Möglichkeit, die Konfiguration auch als build.xml zu speichern. Damit erhält man eine Grundlage. Wie man auch ohne Kenntnisse von FatJar und Ant leicht erkennen kann, werden alle Jars zusammengepackt und an das Plugin geschickt. Der fertige Name wie auch die Main-Klasse können theoretisch noch angepasst werden. Kleiner Test? Einfach auf diese <em>build.xml &gt; Rechte Maustaste &gt; Ru</em><em>n</em> ausführen. Voilá. Damit hat man mit einem Knopfdruck immer ein aktuelles Jar.</p>
<h2>Problem 3b: Keine Testfälle</h2>
<p>In das exportierte Jar gehören in Regel mindestens keine Testfälle &#8211; und zusätzlich kann man sich eine Jar (nämlich junit) sparen. Dafür müssen alle Class-Dateien in ein seperates Verzeichnis kopiert werden. In einem Standardprojekt liegen im Verzeichnis <em>src</em> die Codedateien, im Verzeichnis <em>bin </em>die kompilierten Bytecodedateien. Als Zwischenschritt kopieren wir alle Dateien von <em>bin</em> nach <em>build</em> &#8211; aber mit einer definierten Ausnahmeliste: Alle Pfade, die mit tests beginnen oder mit test(s) aufhören, werden ignoriert. Die Muster mit Wildcards sind leicht zu verstehen und selber anpassbar.</p>
<p><code><span><span> </span></span>&lt;mkdir<span> </span>dir=<span>"build"</span><span> </span>/&gt;<br />
&lt;copy<span> </span>todir=<span>"build"</span>&gt;<br />
&lt;fileset<span> </span>dir=<span>"bin"</span>&gt;<br />
&lt;exclude<span> </span>name=<span>"tests/**/*.*"</span>/&gt;<br />
&lt;exclude<span> </span>name=<span>"**/test/*.*"</span>/&gt;<br />
&lt;exclude<span> </span>name=<span>"**/tests/*.*"</span>/&gt;<br />
&lt;/fileset&gt;<br />
<span style="font-family: Georgia;"><code>&lt;/copy&gt;</code>;</span></code></p>
<p><span style="font-family: Georgia;">Zunächst wird das Verzeichnis gelöscht (von einem vorherigen Task) und anschließend werden die Dateien kopiert. Die Ant-API sei auch an dieser Stelle erwähnt.</span></p>
<p><span style="font-family: Georgia;">Das XML von FatJar muss nun natürlich geringfügig angepasst werden: Statt aus bin muss jetzt build im Filesourcepath stehen: <code>&lt;fatjar.filesource<span> </span>path=<span>"build"</span><span> </span>relpath=<span>""</span>/&gt;</code></span></p>
<h2>Problem 4: Zusatzinformationen im Buildprozess</h2>
<p>Vor allem in der Entwicklungszeit &#8211; vielleicht aber auch danach für den Support &#8211; möchte man im Buildprozess einige Zusatzinformationen speichern. In dieser Kurzvorstellung gehe ich auf zwei interessante Möglichkeiten ein: Das Datum und die Uhrzeit des Buildens und die aktuelle Revision des Subvision-Repository.</p>
<p>Als Ausgabe definieren wir eine<em> Pr</em><em>operty-Datei</em>, die von Java aus sehr einfach mit der Klasse Properties oder ResourceBundle gelesen werden kann. Ant kann ebenfalls Property-Dateien lesen und schreiben.</p>
<p>Mit dem XML-Schnippsel <code>&lt;tstamp&gt;<span>&lt;format</span><span> </span><span>property=</span>"TSTAMP"<span> </span><span>pattern=</span>"MM/dd/yyyy HH:MM:SS z"<span>/&gt;&lt;/tstamp&gt;</span></code> legen wir eine lokale Variable namens &#8220;<em>TSTAMP</em>&#8221; an, die durch den Ant-Befehl <em>tstamp</em> und format ausgefüllt wird. Hier ein standardisiertes Format, damit es Java auch entsprechend einfach wieder lesen kann. Wer mag, kann dies (beidseitig) auch ändern.</p>
<p>Für die aktuelle SVN-Revision bedarf es einem Plugin. Theoretisch könnte man auch ein Ant-Befehl &#8220;svn info&#8221; losschicken, aber dafür muss sowohl das Programm svn lokal verfügbar sein (in Eclipse nicht zwingend notwendig) als auch in der richtigen Version. Stichwort hier: SVN 1.4 != 1.5. Glücklicherweise bietet <a href="http://subclipse.tigris.org/svnant.html">tigris.org</a> ein entsprechendes Plugin unter dem Namen <em>SvnAnt</em> an. Entweder man kopiert sich das Plugin in den Ant-Classpath.. oder einfach in das Projekt selber. Im Beispiel gehe ich davon aus, dass das Plugin unter <em>build_data/svndata-1.2.1</em> extrahiert wurde.<br />
Das Plugin muss zunächst im project bekannt gemacht werden, das sieht in Ant etwa so aus:</p>
<p><code><span><span> </span></span>&lt;!-- svn ant integration --&gt;<br />
<span>&lt;path</span><span> </span><span>id=</span><span> </span>"svnant.classpath"<span> </span><span>&gt;<br />
<span> &lt;fileset</span><span> </span><span>dir=</span><span> </span>"build_data/svnant-1.2.1/lib"<span> </span><span>&gt;<br />
&lt;include<span> </span>name=<span> </span><span>"*.jar"</span><span> </span>/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/path&gt;<br />
<span style="font-family: Georgia;"><code><span>&lt;typedef</span><span> </span><span>resource=</span>"org/tigris/subversion/svnant/svnantlib.xml"<span> </span><span>classpathref=</span>"svnant.classpath"<span> </span><span>/&gt;</span></code></span></span></span></code></p>
<p><span><span><span style="font-family: Georgia;">An der Stelle (sprich: in dem Task) wo man die Information braucht, reicht dann beispielsweise folgender Aufruf, um eine Ant-Variable <em>svn.revision</em> zu setzen.</span></span></span></p>
<p><code><span><span> </span></span>&lt;svn&gt;<br />
&lt;status<span> </span>path=<span>"src/"</span><span> </span>revisionProperty=<span>"svn.revision"</span><span> </span>/&gt;<br />
&lt;/svn&gt;</code></p>
<p><code><span><span>Es stehen natürlich auch andere Informationen zur Verfügung, dazu bitte die entsprechenden Dokumentationen von Subversion oder SvnAnt konsultieren.</span></span></code></p>
<p>Die nun zwei gewonnen Informationen &#8211; TSTAMP und svn.revision &#8211; können nun in eine Property-Datei geschrieben werden. Dies geht wirklich sehr einfach mit:</p>
<p><code><span><span> </span></span><span>&lt;propertyfile</span><span> </span><span>file=</span>"build/configuration.properties"<span>&gt;<br />
<span> &lt;entry</span><span> </span><span>key=</span>"buildRevision"<span> </span><span>value=</span>"${svn.revision}"<span>/&gt;<br />
<span> &lt;entry</span><span> </span><span>key=</span>"buildDatetime"<span> </span><span>value=</span>"${TSTAMP}"<span>/&gt;<br />
&lt;/propertyfile&gt;</span></span></span></code></p>
<p>Das war&#8217;s schon. Idealerweise sollte das Java-Programm diese Informationen natürlich nur optional verwenden, da sie ja zur Laufzeit in Eclipse selber nicht vorhanden sind. Erst nach dem Export werden diese Informationen gesetzt. Wie bereits in <span style="text-decoration: underline;">3b</span> erwähnt, werden die Dateien im Verzeichnis <em>build</em> zusammengefügt. Natürlich muss das Schreiben der Property-Datei <span style="text-decoration: underline;">vor dem Zusammenfügen</span> mittels FatJar passieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.knallisworld.de/blog/2009/04/21/automatischer-deploy-von-java-applikationen-oder-ant-builds-mit-externen-jars-und-svn-informationen/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
