tag:blogger.com,1999:blog-60868516619510522312024-03-13T14:14:25.897+01:00Softwareentwicklung in Theorie und PraxisUnknownnoreply@blogger.comBlogger7125tag:blogger.com,1999:blog-6086851661951052231.post-8649793628151045242013-10-12T00:40:00.001+02:002013-10-12T01:16:10.479+02:00CSS Preprocessing Allrounder - Prepros<br />
Homepage: <a class="external free" href="http://alphapixels.com/prepros" rel="nofollow">http://alphapixels.com/prepros</a> oder auf <a href="https://github.com/sbspk/Prepros" target="_blank">Github</a>.<br />
<a href="https://github.com/sbspk/Prepros/blob/master/license.md" target="_blank">Lizenzinfo auf Github</a> (MIT license)
<br />
<br />
Prepros ist ein Tool für die gängigsten CSS Preprocessing Sprachen, z.B. LESS, SASS, etc.
<br />
Prepros ist ein Stand-Alone Programm und unabhängig von einer IDE.
<br />
Prepros benötigt <b>keine</b> Installationen anderer Programme wie Ruby, LESS, SASS, etc.
<br />
Prepros kann auch als Javascript Minifier und Image Optimizer genutzt werden.<br />
<br />
<h3>
Features: </h3>
<ul>
<li> Compile <span style="color: lime;">less, sass, scss, compass, coffeescript, stylus, jade, slim, markdown, haml and livescript</span> files
<ul>
<li> Prepros unterstützt out-of-the-box mehrere Pre-Prozessor Sprachen.
</li>
</ul>
</li>
<li> No dependencies (sass compass etc..)
<ul>
<li> <span style="color: red;">Keine</span> weiteren Installationen notwendig, z.B. Ruby, SASS, etc.
</li>
</ul>
</li>
<li> Image optimization
<ul>
<li> Prepros optimiert Bilder für das Web.
</li>
</ul>
</li>
<li> Javascript minification and concatenation
<ul>
<li> Prepros erstellt komprimierte Javascript Dateien
</li>
<li> Originaldatei: js/my_file.js
</li>
<li> Minified File: js/<span style="color: yellow;">min</span>/my_file.<span style="color: yellow;">min</span>.js
</li>
</ul>
</li>
<li> @imports detection and watching
<ul>
<li> Prepros überwacht auch <span style="color: lime;">importierte Dateien</span>, d.h. das parent file wird nach Änderungen in der importierten Datei kompiliert.
</li>
</ul>
</li>
<li> Options for customization
</li>
<li> Error & success notifications
</li>
<li> Built-in http server
</li>
<li> Live browser refresh </li>
</ul>
<h3>
</h3>
<h3>
Schnellstart </h3>
<ol>
<li> Prepros herunterladen: <a class="external free" href="http://prepros.alphapixels.com/downloads/Prepros-3.1.0.exe" rel="nofollow">http://prepros.alphapixels.com/downloads/Prepros-3.1.0.exe</a>
</li>
<li> Prepros installieren
</li>
<li> Prepros starten
</li>
<li> Klick "Add new project". Projekte werden in der linken Spalte angezeigt.
<ol>
<li> Ein Prepros Projekt ist die Sammlung aller "preprocessing" Dateien, die übersichtlich im Hauptfenster aufgelistet werden.
</li>
<li> Man kann das Hauptverzeichnis des Web Projekts wählen oder ein
bzw. mehrere Unterverzeichnisse z.B. nur einzelne css und js
Verzeichnisse.
</li>
</ol>
</li>
<li> CSS kompilieren - Voraussetzung ist ein Verzeichnis mit Dateien eines Preprocessing Tools, z.B. SASS, LESS, Coffeescript, etc.
<ol>
<li> Lokales Projekt o. Verzeichnis wählen -> Datei in Hauptfenster wählen -> Compile klicken
</li>
<li> Kontextmenü des Prepros Projekts aufrufen -> Compile All Files klicken
</li>
</ol>
</li>
</ol>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6086851661951052231.post-76140119225656259512013-05-30T04:24:00.001+02:002013-11-01T13:24:04.218+01:00K2.5 - Android Entwicklungsumgebung und modulare Projektstruktur mit Maven und Eclipse<h2>
Einleitung</h2>
Die <b>Mobile Entwicklung</b> ist eine eigenständige Disziplin in der Softwareentwicklung und als Java Entwickler hat man den Vorteil, dass man keine komplett neue Programmiersprache erlernen muss, um eine Mobile App zu entwickeln. Mit Android® von Google® steht eine Mobile Plattform zur Verfügung, die zu den 3 führenden Betriebssystemen für Smartphones und Tablets gehört neben Apple iOS® und Windows Phone®.<br />
<br />
Natürlich sollte man den Aufwand nicht unterschätzen die <b>Architektur, Life-cycle und die API der Android Plattform</b> kennenzulernen. Mehr dazu auf der offiziellen <a href="http://developer.android.com/" target="_blank">Android Entwickler Plattform</a> von Google®.<br />
<br />
In diesem Artikel geht es um den Einstieg in die <b>Android Entwicklung mit Eclipse und Maven</b>. Allerdings ist der erste Schritt beim Erlernen neuer Technologien immer die lokale Entwicklungsumgebung aufzusetzen, und nicht das Programmieren. Die Installation aller Voraussetzungen kann sehr komplex sein, und bis man eine saubere und professionelle Infrastruktur bzw. Entwicklungsumgebung aufgebaut und konfiguriert hat braucht man einiges an KnowHow und Erfahrung. Ich möchte hier nun eine Entwicklungsbasis vorstellen von der ich denke, dass sie ausgereift und flexibel ist.<br />
<br />
Mit dieser Basis können Einsteiger, aber auch Fortgeschrittene, einfach und schnell für Android® entwickeln.<br />
<br />
<h2>
Motivation</h2>
Die eine Seite der Basis sind die Installationen auf der lokalen Workstation, also Eclipse, Plugins, Maven, etc.<br />
Die andere Seite ist die Code Basis, um mit der Programmierung starten zu können. Diese Projektstruktur kann man sich am Anfang mit Project Wizards zusammenklicken oder sogar auf Maven Archetypes setzen. Ich kenne allerdings aktuell keinen Archetype, der eine wirklich profesionelle Android Projektbasis bereitstellt. Mit einer Ausnahme: <a href="http://stand.spree.de/" target="_blank">STAND for Android</a>.<br />
Dieses Projekt habe ich erst einige Wochen nachdem ich diesen Artikel zu Ende geschrieben hatte entdeckt. Das tolle dabei ist, dass mein Ansatz ebenfalls auf dem <b>Maven Android Plugin</b> basiert und mit der Integration von <b>Android Library Projects</b> zwecks <i>Modularisierung</i>, sogar die bessere Lösung bietet, als <a href="http://stand.spree.de/wiki_details_rindirect" target="_blank">RINDIRECT</a>.<br />
Allerdings hat das <b>STAND for Android</b> Projekt noch weitaus mehr Lösungen zu bieten, die man unbedingt beachten sollte, z.B. <a href="http://stand.spree.de/wiki_details_androlog" target="_blank">ANDROLOG</a>, <a href="http://stand.spree.de/wiki_details_marvin" target="_blank">MARVIN </a>oder <a href="http://stand.spree.de/wiki_details_roboject" target="_blank">ROBOJECT</a>. Diese Lösungen können per Maven Dependency ganz einfach in dem hier vorgestellten Template Projekt integriert werden. Mehr dazu ganz am Ende dieses Artikels.<br />
<br />
Eine ähnliche und mindestens genauso professionelle Android Projektbasis habe ich nun nach meinen Vorstellungen erstellt und werde sie in diesem Artikel als Eclipse Projekt bereitstellen. Sobald ich mir mal angeschaut habe, wie man Maven Archetypes entwickelt, wird dieses Template wohl auch als Archetype bezogen werden können.<br />
Das Ergebnis wird dann ungefähr so aussehen:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-5L_HPmwGSlU/Uaz2UkeVcqI/AAAAAAAAAlM/4D8__sQbRvo/s1600/templateproject.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-5L_HPmwGSlU/Uaz2UkeVcqI/AAAAAAAAAlM/4D8__sQbRvo/s1600/templateproject.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-ttBzPMczCH8/Uaa5kJDhjqI/AAAAAAAAAkI/5pcJb5Qip9k/s1600/templateapp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-ttBzPMczCH8/Uaa5kJDhjqI/AAAAAAAAAkI/5pcJb5Qip9k/s1600/templateapp.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-U1leZuWijLo/Uaa5kDZSBSI/AAAAAAAAAj8/NVWA_9cx_ZQ/s1600/templateapklib.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-U1leZuWijLo/Uaa5kDZSBSI/AAAAAAAAAj8/NVWA_9cx_ZQ/s1600/templateapklib.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-xxd-9sZxvLE/Uaa5lHX_TnI/AAAAAAAAAkQ/nnNdoWEfOfA/s1600/templatemodule.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-xxd-9sZxvLE/Uaa5lHX_TnI/AAAAAAAAAkQ/nnNdoWEfOfA/s1600/templatemodule.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-rAl6XkWYT9Y/Uaa5khCEKlI/AAAAAAAAAkA/qNf2QgJRBxM/s1600/templatelib.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-rAl6XkWYT9Y/Uaa5khCEKlI/AAAAAAAAAkA/qNf2QgJRBxM/s1600/templatelib.png" /></a></div>
<br />
<br />
Vorab noch ein kleines Diagramm meiner Idee einer modularen Projektbasis für die native Android Entwicklung. Sie bekommen später in diesem Artikel die komplette rechte Seite (templateproject) als ZIP Archiv zum Herunterladen.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-6EF1KnwqoCo/Uaac3PUKICI/AAAAAAAAAjs/0Fy_Ih3dOSY/s1600/android-components-new.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="http://3.bp.blogspot.com/-6EF1KnwqoCo/Uaac3PUKICI/AAAAAAAAAjs/0Fy_Ih3dOSY/s400/android-components-new.png" width="400" /></a></div>
<br />
<div style="text-align: center;">
<a href="https://docs.google.com/file/d/0BwBlXQsr_e6IRHEyc3hSSTRxaVE/edit?usp=sharing" target="_blank">PDF Version des Diagramms "Android Maven modular project setup" herunterladen</a></div>
<br />
Besonders hervorheben möchte ich an dieser Stelle das <i>templateapklib</i> Projekt auf der rechten Seite. Dies ist ein <a href="http://code.google.com/p/maven-android-plugin/wiki/ApkLib" target="_blank">Android Library (.apklib)</a> Projekt und ermöglicht letztlich die modulare Entwicklung von <b>wiederverwendbaren</b> Android Komponenten!<br />
<br />
Die linke Seite (<i>developmentproject</i>) hat im Prinzip die gleichen Module, nur stellt es ein anderes Projekt dar mit einer anderen Intention. Man benötigt während der Entwicklung insbesondere von wiederverwendbaren Modulen auch eine Möglichkeit diese Module zu testen bzw. auszuführen. Und genau diesen Zweck soll dieses Projekt erfüllen.<br />
Man sieht, dass auf das Modul <i>Devdroidlib</i> alle anderen Module zugreifen! Dies bedeutet, dass dieses Modul eine allgemeine Bibliothek darstellt. Es gibt jedoch einen wichtigen Unterschied zu dem Modul <i>Devdroidapklib</i>. Und zwar kann das letztere echte Android Resources einbinden, z.B. <b>/res/*, Activities, Services, Providers</b>, etc.<br />
Diese Ressourcen müssten ansonsten direkt im <b>Android App Projekt</b> (<i>Devdroidapp</i>) liegen, was nicht besonders modular ist.<br />
<br />
Sie können also auf Basis der rechten Seite (<i>templateproject</i>) die komplette linke Seite als eigenes Hauptprojekt erstellen und darin dann eigene wiederverwendbare Android Komponenten entwickeln, die Sie in neuen Projekten per <b>Maven Dependency</b> einfach einbinden können.<br />
<br />
<h2>
Voraussetzungen</h2>
<ul>
<li><span id="goog_1574628563"></span><span id="goog_1574628564"></span>Eclipse IDE</li>
<li>Eclipse Plugins: m2e (Maven), Android Development Tools</li>
<li>Maven auf der lokalen Workstation</li>
<li>Android SDK auf der lokalen Workstation</li>
<li>Android Testgerät (Smartphone oder Tablet)</li>
</ul>
<br />
<h2>
Umsetzung</h2>
<br />
<h3>
Kurzübersicht aller Schritte</h3>
<ol>
<li>Eclipse Basis Setup (~10min)</li>
<li>Eclipse Setup - Installation von Plugins für die Android Entwicklung (~20min)</li>
<li>Herunterladen des Android Template Maven Projekts (~5min)</li>
<li>Importieren des Maven parent Projekts in Eclipse (~5min)</li>
<li>Einrichten der Eclipse Run Configuration für das templateapp Projekt (~5min)</li>
<li>Kompilieren des Maven parent Projekts (~0,5min)</li>
<li>Deployment der Template App auf einem Testgerät (~0,5min)</li>
</ol>
<br />
<h3>
1. Eclipse Basis Setup</h3>
Sie benötigen als Basis für dieses Android Projekt mindestens das Maven Plugin für Eclipse. Optimialerweise installieren Sie auch EGit zwecks Versionskontrolle. Folgen Sie den Schritten dieser Anleitung:<br />
<br />
<div style="text-align: center;">
<a href="http://sw-technik.blogspot.de/2013/01/professionelle-entwicklung-mit-git-und.html" target="_blank">Eclipse Plugins - Maven und EGit</a> </div>
<br />
<br />
<b>Hinweis: </b><br />
Fügen Sie diese XML Konfiguration in Ihre <b>.m2/settings.xml</b> in Ihrem Benutzerverzeichnis. Falls die Datei noch nicht existiert erstellen Sie sie manuell.
<br />
<pre class="brush:xml;"> <profiles>
<profile>
<id>android-sdk</id>
<properties>
<android.sdk.path>...\android-sdk</android.sdk.path>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>android-sdk</activeProfile>
</activeProfiles>
</settings>
</pre>
<br />
<br />
<h3>
2. Eclipse Setup für Android</h3>
Führen Sie die Schritte 1 bis 3 aus dieser Anleitung durch:<br />
<br />
<div style="text-align: center;">
<a href="http://sw-technik.blogspot.de/2013/03/einleitung-die-entwicklung-fur-mobile.html" target="_blank">Eclipse Setup für Android</a></div>
<br />
<br />
Sie haben dann diverse Eclipse Perspectives und Views für Android zur Verfügung, sowie direkte Buttons zur Verwaltung der Android SDKs und Virtual Devices:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-SK9Cbhdi2l0/UaZuN3F-4YI/AAAAAAAAAhk/hcpj-D2GQhM/s1600/screenshot.4b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-SK9Cbhdi2l0/UaZuN3F-4YI/AAAAAAAAAhk/hcpj-D2GQhM/s1600/screenshot.4b.png" /></a></div>
<br />
<br />
<h3>
3. Herunterladen des Template Projekts</h3>
<h3>
</h3>
<div style="text-align: center;">
<a href="https://docs.google.com/file/d/0BwBlXQsr_e6INkRtU2hYMU9SNEU/edit?usp=sharing" target="_blank">ZIP Archiv - Android Template Projekt</a></div>
<br />
Entpacken Sie das Archiv in ein lokales Verzeichnis Ihrer Wahl. Folgende Verzeichnisse und Dateien sollten Sie vorfinden:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-STlVTtljyLo/UaaMbXDAehI/AAAAAAAAAh0/cgeSnftKn1o/s1600/template-folders.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-STlVTtljyLo/UaaMbXDAehI/AAAAAAAAAh0/cgeSnftKn1o/s1600/template-folders.png" /></a></div>
<br />
<h3>
4. Importieren des Maven parent Projekts in Eclipse</h3>
Gehen Sie in Eclipse über <span style="font-family: "Courier New",Courier,monospace;">File -> Import...</span> und wählen Sie <b>"Existing Maven Projects"</b> und bestätigen Sie alle folgenden Dialoge:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-q-jcsp08xHY/UaaOGfx2NeI/AAAAAAAAAiM/Ti2Q6y6g8VE/s1600/import-screenshot.1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-q-jcsp08xHY/UaaOGfx2NeI/AAAAAAAAAiM/Ti2Q6y6g8VE/s1600/import-screenshot.1.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-PI1dA-YlzcI/UaaOF65Qg2I/AAAAAAAAAiI/8NAn9WVe0bo/s1600/import-screenshot.2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="270" src="http://3.bp.blogspot.com/-PI1dA-YlzcI/UaaOF65Qg2I/AAAAAAAAAiI/8NAn9WVe0bo/s400/import-screenshot.2.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-x0waiqeO1Gs/UaaOE5czKAI/AAAAAAAAAiA/PQaJyL9dZJ4/s1600/import-screenshot.3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-x0waiqeO1Gs/UaaOE5czKAI/AAAAAAAAAiA/PQaJyL9dZJ4/s1600/import-screenshot.3.png" /></a></div>
<br />
<h3>
5. Einrichten der Eclipse Run Configuration</h3>
In den Maven pom.xml Dateien der beiden Projekte <i>templateapp</i> und <i>templateapklib</i> wird das Android Maven Plugin von <a href="http://www.jayway.com/" target="_blank">Jayway</a> genutzt:<br />
<br />
<div style="text-align: center;">
<a href="http://maven-android-plugin-m2site.googlecode.com/svn/plugin-info.html" target="_blank">Google Code Homepage - Android Maven Plugin</a></div>
<div style="text-align: center;">
<a href="http://mvnrepository.com/artifact/com.jayway.maven.plugins.android.generation2/android-maven-plugin" target="_blank">Übersicht im Maven Repository mvnrepository.com</a></div>
<br />
Erstellen Sie in Eclipse folgende Maven Run Configuration:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-R1sjw0zqPjo/UaaRtgIu4RI/AAAAAAAAAic/7r1CpDx5yWg/s1600/android-maven-run-config.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="308" src="http://3.bp.blogspot.com/-R1sjw0zqPjo/UaaRtgIu4RI/AAAAAAAAAic/7r1CpDx5yWg/s400/android-maven-run-config.png" width="400" /></a></div>
<br />
<h3>
6. Kompilieren des Maven parent Projekts</h3>
Bevor wir die Android App (das <i>templateapp</i> Projekt) auf einem Android Gerät testen können müssen alle Maven Module gebaut werden. Gehen Sie folgendermaßen vor:<br />
<ol>
<li>Rechtsklick auf das Maven parent Projekt <b>templateproject</b></li>
<li>Im Kontextmenü wählen Sie <b>Run As...</b></li>
<li>Wählen Sie nun "<b>7 Maven install</b>"</li>
</ol>
Anschließend sollte in der Eclipse Maven Console die erfolgreiche Kompilierung der Projekte bestätigt werden:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-g2fVnnaehwM/UaaUMd6ZppI/AAAAAAAAAis/u6AKFDSicpw/s1600/build-templateproject.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-g2fVnnaehwM/UaaUMd6ZppI/AAAAAAAAAis/u6AKFDSicpw/s1600/build-templateproject.png" /></a></div>
<br />
<h3>
7. Deployment der Template App auf einem Testgerät</h3>
Ein Android Entwickler sollte mindestens 1 Testgerät besitzen, um sich nicht ausschließlich auf die Virtual Devices verlassen zu müssen. Optimal wäre ein Smartphone, um auch Telefon Funktionalität testen zu können, alternativ kann auch ein Tablet die Zwecke erfüllen.<br />
<br />
Schließen Sie jetzt bitte Ihr Testgerät per USB an Ihre Workstation an. Vergessen Sie nicht den Entwicklermodus auf dem Gerät zu aktivieren.<br />
<br />
Öffnen Sie danach in Eclipse die Android DDMS Perspective. Sie sollten dann das angeschlossene Gerät dort gelistet sehen:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-gz8HNsTeSEo/UaaXR1CErxI/AAAAAAAAAi8/fEVsPbgn48c/s1600/device-eclipse-ddms.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://2.bp.blogspot.com/-gz8HNsTeSEo/UaaXR1CErxI/AAAAAAAAAi8/fEVsPbgn48c/s320/device-eclipse-ddms.png" width="320" /></a></div>
<br />
Nun können Sie die Run Configuration starten, die Sie in Schritt 5 erstellt haben. Das Ergebnis in der Maven Eclipse Console sollte ungefähr so aussehen:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-toA1nCfxVYk/UaaYQdjjIlI/AAAAAAAAAjI/sHUaR05R67I/s1600/build-templateapp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="86" src="http://2.bp.blogspot.com/-toA1nCfxVYk/UaaYQdjjIlI/AAAAAAAAAjI/sHUaR05R67I/s400/build-templateapp.png" width="400" /></a></div>
<br />
Und jetzt ist die Android Template App auf Ihrem Testgerät installiert und gestartet:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-PpAUyptmZKk/UaaYw2ZMEwI/AAAAAAAAAjY/2pKr6DC2c80/s1600/device-templateapp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="http://2.bp.blogspot.com/-PpAUyptmZKk/UaaYw2ZMEwI/AAAAAAAAAjY/2pKr6DC2c80/s320/device-templateapp.png" width="320" /></a></div>
<br />
Nach einem Touch auf den Button sollten Sie folgendes sehen: <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-XGx2u-jFy3w/UaaYwfUv3cI/AAAAAAAAAjU/_2P1Fs1THJM/s1600/device-templateapp-apklib.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="http://3.bp.blogspot.com/-XGx2u-jFy3w/UaaYwfUv3cI/AAAAAAAAAjU/_2P1Fs1THJM/s320/device-templateapp-apklib.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-aM_2TfWPNZQ/UaZr9y9JegI/AAAAAAAAAf8/XPNhfoMT8LQ/s1600/screenshot.1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
Schauen Sie sich den Quelltext der Projekte <i>templateapp</i> und <i>templateapklib</i> an, um die App nachzuvollziehen.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<h2>
Zusammenfassung</h2>
Sie haben nun eine <b>Basis für die Android Entwicklung</b>, die in Sachen <b>Automatisierung, Erweiterbarkeit und Modularität</b> kaum noch Optimierung bedarf. Dank <b>Eclipse und Maven</b> ist das eine Entwicklungsumgebung mit der man auch in größeren Teams an einem Android Projekt arbeiten und/oder sogar allgemeine <a href="http://code.google.com/p/maven-android-plugin/wiki/ApkLib" target="_blank">Android Maven Module als .apklib</a> entwickeln kann, die man in App Projekten einfach wiederverwenden kann.<br />
<br />
Vielleicht kam bei dem ein oder anderen Leser die Frage auf, wo eigentlich der Unterschied zwischen den Modulen <i>templatelib</i> und <i>templatemodule</i> ist. Dies ist kurz erklärt. Es gibt eigentlich keinen Unterschied, es sei denn man definiert einen für sich selbst. Die Struktur der Verzeichnisse und Dateien ist wie man sieht die selbe, nur nutzt ein <i>templatemodule</i> die API einer <i>templatelib</i>, was durch die Maven Dependency konfiguriert ist. Sie können also selbst entscheiden, welche dieser Maven Module sie in Ihrem Projekt benötigen.<br />
<br />
Falls Sie sich nun noch fragen, wo der Unterschied zwischen einem <i>templatemodule</i> und <i>templateapklib</i> Maven Modul ist, dann ist das ebenfalls kurz erklärt. Da letzteres wie bereits erläutert ein <b>Android Library (.apklib)</b> Projekt ist, hat es spezielle Vorteile, z.B. kann man Android Ressourcen in diesem Projektmodul verwalten und im App Projekt darauf zugreifen. Dies funktioniert nur recht eingeschränkt mit einem normalen Maven Modul wie es das <i>templatemodule</i> ist.<br />
<br />
<h2>
Weitere Schritte</h2>
Für Einsteiger in die Android Entwicklung kann ich das Tutorial von <a href="http://www.vogella.com/articles/Android/article.html" target="_blank">Lars Vogel unter vogella.com</a> empfehlen. Er hat auch ein Tutorial zu den speziellen <a href="http://www.vogella.com/articles/AndroidLibraryProjects/article.html" target="_blank">Android Library Projects</a> geschrieben.<br />
<br />
Für etwas weiter fortgeschrittene Android Entwickler brauche ich sicherlich nicht erwähnen, dass unter <a href="http://www.javacodegeeks.com/android/" target="_blank">javacodegeeks.com</a> immer hilfreiche Tutorials zu finden sind.<br />
<br />
Und wer speziell für Facebook eine Android App entwickeln möchte sollte einen Blick auf das <a href="http://developers.facebook.com/android/" target="_blank">Facebook SDK for Android</a> werfen.<br />
<br />
Ach ja, wer sich für die s.g. <a href="http://sw-technik.blogspot.de/2013/03/einleitung-die-entwicklung-fur-mobile.html" target="_blank">cross-platform Entwicklung interessiert findet hier einen Blog Post dazu</a>.<br />
<br />
Google scheint so ziemlich die selben Build Workflows in Zukunft anzustreben, allerdings mit <a href="http://www.gradle.org/" target="_blank">Gradle</a>, aber immerhin ohne ANT. Hier gibts eine <a href="http://tools.android.com/tech-docs/new-build-system" target="_blank">45min Präsentation</a> dazu. Sehenswert für alle, die sich auch für diese Anleitung interessiert haben.<br />
<br />
Außerdem kann ich fast uneingeschränkt das <a href="http://stand.spree.de/" target="_blank">STAND for Android</a> Projekt empfehlen. Die Komponenten für Logging und Testing werde ich in einer meiner nächsten Blog Artikel vorstellen und auf diesem Template Projekt aufbauen.<br />
<br />
Ich arbeite privat an einem Projekt für das ich auch eine Android App baue. Natürlich halte ich mich dabei an die hier vorgestellte Modulstruktur, wer daran interessiert ist kann sich auf <a href="https://github.com/davidtoniolo/youconfapp" target="_blank">Github</a> alles genauer anschauen. <br />
<br />
Happy coding, developers!<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6086851661951052231.post-727515723189340182013-03-30T18:33:00.001+01:002013-05-30T13:52:55.505+02:00K2.4 - Entwicklungsumgebung zur cross-platform Entwicklung für Android mit Eclipse<h2>
Einleitung</h2>
Die Entwicklung für mobile Endgeräte, z.B. Smartphones oder Tablets, ist wahrscheinlich der wachstumsstärkste Sektor der letzten 5 Jahre oder sogar länger. Ein Pionier dieser Enwicklung ist ausnahmsweise mal nicht Microsoft®, sondern Apple® mit ihren Produkten iPhone® und iPad®. Für diese Produkte gelten andere Anforderungen für die Entwicklung, als z.B. für die mobilen Plattformen Windows 8®, Blackberry® oder Google's Android®. Es gibt noch einige Plattformen mehr, die aktuell aber keine größere Relevanz im mobilen Markt spielen, z.B. Symbian® von Nokia® oder Bada® von Samsung®.<br />
<br />
Für einen Entwickler, und die sind schließlich die Zielgruppe dieses Artikels, ist jede mobile Plattform eine eigenständige Umgebung mit unterschiedlichen Anforderungen. Man muss für jede Plattform einiges an Spezialwissen aufbauen, angefangen von der nativen Programmiersprache (C#, Java, Objective-C) bis hin zu den plattformspezifischen SDKs der Hersteller und den damit verbundenen Unterschiede der einzelnen Betriebssysteme hinsichtlich Workflow, Rechteverwaltung, Ereignissteuerung und vielen anderen Möglichkeiten. Sehr oft sind diese Möglichkeiten an die Version des Betriebssystems, sowie die Hardware, das Endgerät, gebunden.<br />
<br />
Neben der nativen Entwicklung von mobilen Apps ist auch die Entwicklung von mobilen Webapps ein zunehmender Markt. <b>Diese mobilen Webapps sind keine mobilen Websites, sondern eine s.g. hybride Lösung</b>. Man nennt diesen Bereich auch <b>cross-platform development</b>. Es gibt auch hier spezielle Anforderungen an die Entwicklungsumgebungen und in allen Fällen benötigt man fast eine identische Umgebung, wie für die native Entwicklung, z.B. das SDK oder eine bestimmte IDE.<br />
Der Grundgedanke der cross-platform Entwicklung ist, dass man als Entwickler 100% native mobile Apps bauen kann ohne Programmierung in der plattformspezifischen Programmiersprache, stattdessen mit den einfacheren Web Technologien HTML/HTML5, CSS und vorallem Javascript. Für diesen Ansatz gibt es ständig neue Frameworks und aktuell haben sich <a href="http://cordova.apache.org/" target="_blank">Apache Cordova</a> (ehemals Phonegap), <a href="http://www.appcelerator.com/platform/titanium-sdk/" target="_blank">Appcelerator Titanium</a> oder auch <a href="http://www.sencha.com/products/touch" target="_blank">Sencha Touch</a> einen Namen gemacht. Eine ebenfalls sehr interessante Lösung ist <a href="http://www.mosync.com/" target="_blank">MoSync</a> mit der man sowohl mit C/C++ als auch mit Javascript cross-platform entwickeln kann. Weitere cross-platform Lösungen kann man <a href="http://www.toolsjournal.com/item/157-10-of-best-cross-platform-mobile-development-tools" target="_blank">hier</a> sehen.<br />
<br />
Das Ziel aller cross-platform Technologien ist, dass man mit <b>einer einzigen Code Basis native Applikationen für alle Plattformen</b> entwickeln kann. Native Applikationen und mobile Webapps können im Gegensatz zu mobilen Websites in die jeweiligen App Stores eingetragen werden. Dieser Vertriebsweg ist ebenfalls sehr unterschiedlich gelöst von den jeweiligen Herstellern, ist aber in jedem Fall ein wichtiger Vertriebskanal für die mobile Anwendungen.<br />
<br />
In diesem Artikel werde ich eine Entwicklungsumgebung für die Android Plattform aufsetzen. Diese Umgebung ist für die Entwicklung von nativen Apps und mobilen Webapps mit Cordova/Phonegap geeignet. Wer für die cross-platform Entwicklung ein anderes Framework einsetzen möchte wird in diesem Artikel keine Lösung finden. Der Teil für die native Entwicklung für Android ist jedoch für alle cross-platform Technologien relevant.<br />
<br />
<h2>
Motivation</h2>
Als Java Entwickler wird man in Zukunft kaum noch um die Android Entwicklung herumkommen. Man erwartet von meinem Java Entwickler, dass er auch Anwendungen für Android entwickeln kann, obwohl das natürlich aus Sicht der Entwicklung totaler Blödsinn ist. Die Java Entwicklung für Desktop oder Web sind ebenfalls komplett unterschiedlich, und dazu kommt nun auch der Bereich Mobile. Dieser Bereich ist nicht so neu wie man meint, denn mit Java ME (Micro Edition) gibt es bereits einen Sektor für die Embedded Entwicklung. Letztlich sind mobile Apps eine Art Embedded System, und gehören damit einer eigenen IT Strategie an.<br />
<br />
Die Entwicklung für mobile Endgeräte ist allerdings nicht so kompliziert wie man meinen könnte. Insbesondere für die Android Plattform sind die Voraussetzungen sehr überschaubar und das zusätzlich notwendige Android Fachwissen kann man sich recht schnell aneignen. Wer eine gute Basis als Softwareentwickler mitbringt, egal ob Desktop oder Web, wird eine sehr flache Lernkurve haben. Da der Mobile Bereich jedoch etwas höhere Anforderungen an die Softwareentwicklung stellt, als beispielsweise die Web Entwicklung, sollte man sich als Einsteiger mehr Zeit nehmen, um sich komplexe Themen wie Speicherverwaltung, eingebettete Datenbanken, asynchrone Kommunikation, etc. ins Bewusstsein zu rufen.<br />
<br />
Am Ende dieses Artikels hat jedoch jeder, egal ob Profi oder Einsteiger, eine professionelle Entwicklungsumgebung für die Android Entwicklung. Was sie daraus dann machen liegt an ihnen, denn dies ist kein Tutorial, um eine Hello World Anwendung zu programmieren, sondern um die Voraussetzungen dafür zu schaffen.<br />
<br />
<h2>
Voraussetzungen</h2>
Folgende Tools werden wir benötigen:<br />
<ul>
<li>JDK - Java Development Kit </li>
<li>Eclipse IDE</li>
<li>Eclipse Plugins - Android Developer Tools (ADT), MDS AppLaud (Phonegap/Cordova)</li>
<li>Android SDK</li>
</ul>
<br />
<h2>
Umsetzung</h2>
<h3>
Kurzübersicht aller Schritte</h3>
<ol>
<li>Eclipse Plugin ADT installieren (~10min)</li>
<li>Android SDK Installer herunterladen und in ein Wahlverzeichnis installieren (~20min)</li>
<li>Android SDK Manager konfigurieren (~15min)</li>
<li>Eclipse Plugin MDS AppLaud installieren (~5min)</li>
<li>Eclipse Plugin HTML Web Editor installieren (~5min)</li>
<li>Phonegap/Cordova Projekt erstellen (~5min)</li>
<li>Troubleshooting </li>
</ol>
<br />
<h3>
1. Eclipse Plugin ADT installieren</h3>
Installieren Sie folgende Pakete:<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-BQubHabMtR8/UUot73uBZrI/AAAAAAAAAdw/CdqKNP-saic/s1600/screenshot.1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="305" src="http://3.bp.blogspot.com/-BQubHabMtR8/UUot73uBZrI/AAAAAAAAAdw/CdqKNP-saic/s320/screenshot.1.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-0lTX-YcROVA/UUouABmfF4I/AAAAAAAAAd4/_WVhAw4eZG4/s1600/screenshot.2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://3.bp.blogspot.com/-0lTX-YcROVA/UUouABmfF4I/AAAAAAAAAd4/_WVhAw4eZG4/s320/screenshot.2.png" width="320" /></a></div>
<br />
<br />
<h3>
2. Android SDK herunterladen und installieren</h3>
Laden Sie das <a href="http://developer.android.com/sdk/index.html" target="_blank">Android SDK</a> herunter. Entpacken Sie das Paket in ein lokales Verzeichnis ihrer Wahl, z.B.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-iKw7qGzmJsM/UUox2bxcoiI/AAAAAAAAAeE/CFE-JOS_unQ/s1600/screenshot.5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="134" src="http://4.bp.blogspot.com/-iKw7qGzmJsM/UUox2bxcoiI/AAAAAAAAAeE/CFE-JOS_unQ/s320/screenshot.5.png" width="320" /></a></div>
<br />
<h3>
3. Android SDK Manager konfigurieren</h3>
Starten Sie den SDK Manager über die .exe Datei und aktivieren Sie die Android Plattformversionen, die Sie benötigen bzw. für die Sie entwickeln möchten.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-HVkgQITo6EU/UUozhADeOJI/AAAAAAAAAeM/OWm0ZXcckis/s1600/screenshot.6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="170" src="http://4.bp.blogspot.com/-HVkgQITo6EU/UUozhADeOJI/AAAAAAAAAeM/OWm0ZXcckis/s320/screenshot.6.png" width="320" /></a></div>
<br />
<h3>
4. Eclipse Plugin MDS AppLaud installieren</h3>
Installieren Sie das Eclipse Plugin MDS AppLaud, um Projekte mit Phonegap/Cordova einfacher erstellen zu können. Dieses Plugin liefert einen Project Wizard, der die notwendige Verzeichnisstruktur und die Javascript Dateien erstellt, damit Sie direkt mit einer Beispielanwendung starten können.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-H5lk-XFRyF4/UUo0lPw0V9I/AAAAAAAAAec/DPtFfLvdfZw/s1600/screenshot.8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="275" src="http://3.bp.blogspot.com/-H5lk-XFRyF4/UUo0lPw0V9I/AAAAAAAAAec/DPtFfLvdfZw/s320/screenshot.8.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-8OpEzLSwh7s/UUo0jymtLTI/AAAAAAAAAeY/VlpW58kWZvU/s1600/screenshot.9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="195" src="http://2.bp.blogspot.com/-8OpEzLSwh7s/UUo0jymtLTI/AAAAAAAAAeY/VlpW58kWZvU/s320/screenshot.9.png" width="320" /></a></div>
<br />
<h3>
5. Eclipse Plugin HTML Web Editor installieren</h3>
<div class="separator" style="clear: both; text-align: center;">
</div>
Damit Eclipse Syntaxhighlighting in HTML Dateien unterstützt, wird das HTML Web Editor Plugin benötigt.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-TEMLiRhL1uo/UUuBZtbr95I/AAAAAAAAAe0/mr67ngCAwa4/s1600/screenshot.13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="309" src="http://2.bp.blogspot.com/-TEMLiRhL1uo/UUuBZtbr95I/AAAAAAAAAe0/mr67ngCAwa4/s320/screenshot.13.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-hSxkBlRQboQ/UUuBXgOywsI/AAAAAAAAAew/rVXKntsiMg0/s1600/screenshot.14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="173" src="http://1.bp.blogspot.com/-hSxkBlRQboQ/UUuBXgOywsI/AAAAAAAAAew/rVXKntsiMg0/s320/screenshot.14.png" width="320" /></a></div>
<br />
<h3>
6. Phonegap/Cordova Projekt erstellen</h3>
Wir nutzen nun den Project Wizard des MDS AppLaud Plugins, um ein neues Projekt zu erstellen. Dieses Projekt beinhaltet eine lauffähige Phonegap/Cordova Applikation.<br />
<br />
Starten Sie den Project Wizard Dialog mit einem Klick auf das "Telefon" Symbol des AppLaud Plugins, hier direkt links neben dem Dialog zu sehen:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-zHQHSa2uUdY/UUuFqtiPhtI/AAAAAAAAAe8/IpJrT6NS1n8/s1600/screenshot.12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="170" src="http://3.bp.blogspot.com/-zHQHSa2uUdY/UUuFqtiPhtI/AAAAAAAAAe8/IpJrT6NS1n8/s320/screenshot.12.png" width="320" /></a></div>
<br />
Nach Abschluss des Dialogs können Sie die Dateien bearbeiten oder das Projekt z.B. im Emulator testen. <br />
<br />
<br />
<h3>
6. Troubleshooting</h3>
<br />
<h4>
Fehler: <span style="font-size: small;"><span style="font-size: small;"> </span></span></h4>
<span style="font-size: small;"><span style="font-size: small;">Starting emulator for AVD '...' PANIC: Could not open</span></span><br />
<h4>
<span style="font-size: small;"><span style="font-size: small;">Lösung:</span></span></h4>
Dieser Fehler kann auftreten, wenn man das Benutzerverzeichnis auf eine andere Partition eingerichtet hat, also statt unter C: auf D: o.ä. In diesem Fall kann man eine Verknüpfung unter C: einrichten: <br />
<ul>
<li>mklink /J "C:\Users\John Doe\.android" "D:\John Doe\.android"</li>
</ul>
<h4>
</h4>
<h4>
Fehler:</h4>
Expired debug.keystore<br />
<h4>
Lösung:</h4>
In diesem Fall kann man die Datei .android/debug.keystore einfach löschen. Sie wird neu erzeugt.<br />
<h4>
</h4>
<h4>
Fehler:</h4>
Unknown error: Unable to build: the file dx.jar was not loaded from the SDK folder! SecurityException: Unable to find field for dex.jar<br />
<h4>
Lösung: </h4>
SDK Manager - Options -> Clear Cache<br />
<b>SDK Manager öffnen und Updates installieren.</b><br />
<h4>
</h4>
<h4>
Fehler:</h4>
Testgerät per USB angeschlossen, wird aber nicht erkannt.<br />
<h4>
Lösung: </h4>
Im Geräte-Manager prüfen, ob das Gerät richtig erkannt wurde, ansonsten Treiber im Internet herunterladen und installieren. <br />
<br />
<h2>
Zusammenfassung</h2>
Sie haben nun alle Installationen die notwendig sind, um eine erste mobile cross-platform Anwendung mit <b>Phonegap/Cordova</b> zu entwickeln. Sie benötigen je Zielplattform das native SDK, in diesem Artikel haben wir das Android SDK installiert. Sie können damit für jede Android Version entwickeln und falls Sie kein Testgerät zur Verfügung haben, können Sie ein s.g. Virtual Device einrichten und damit im Emulator testen.<br />
<br />
Außerdem ist diese Infrastruktur auch dazu geeignet, um echte native Android Apps mit Java und dem Android SDK zu programmieren. Auch dazu habe ich einen <a href="http://sw-technik.blogspot.de/2013/05/k25-android-entwicklungsumgebung-und.html" target="_blank">Blog Post</a> geschrieben.<br />
<br />
Hier noch ein Diagramm, welches den Workflow und einige Voraussetzungen für die Mobile Entwicklung der 4 wichtigsten Plattformen (iOS, Android, Windows Phone und Blackberry) darstellt.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-WdgCrkknQ0o/Uac63MDtwYI/AAAAAAAAAk8/f-0TiuPy8EQ/s1600/mobile-cross-platform-development.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-WdgCrkknQ0o/Uac63MDtwYI/AAAAAAAAAk8/f-0TiuPy8EQ/s320/mobile-cross-platform-development.png" width="216" /></a></div>
<br />
<div style="text-align: center;">
<a href="https://docs.google.com/file/d/0BwBlXQsr_e6Ib1lxSUh1WWNlQ00/edit?usp=sharing" target="_blank">PDF Version zum Download</a></div>
<br />
<br />
<h2>
Weitere Schritte</h2>
Sie sollten sich die Möglichkeiten im Bereich Unit/Integration Testing unter Android klar machen und anfangen erste Tests für ihre Anwendung zu schreiben. Nützliche Links sind:<br />
<ul>
<li><a href="http://developer.android.com/tools/testing/testing_android.html" target="_blank">Android Testing Fundamentals</a></li>
<li><a href="http://pivotal.github.com/robolectric/" target="_blank">Robolectric</a></li>
</ul>
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6086851661951052231.post-7534354239137111212013-02-24T15:31:00.001+01:002013-06-12T21:25:19.026+02:00K2.3 - HTML5 WebSocket Server mit Tomcat 7<div class="separator" style="clear: both; text-align: center;">
</div>
<h2>
Einleitung</h2>
In diesem Artikel werde ich zeigen, wie man die <a href="http://de.wikipedia.org/wiki/WebSocket" target="_blank">HTML5 WebSockets</a> auf der Client-side und Server-side nutzt. Die WebSockets benötigen auf beiden Seiten spezielle APIs bzw. Implementierungen und gerade letztere gibt es in einigen Sprachen die im Web Umfeld relevant sind, z.B. Java, PHP, .NET, Ruby, Python, etc.<br />
<br />
Heute werden wir auf der Client-side die neue HTML5 Javascript WebSocket API einsetzen und damit eine <b>persistente Verbindung</b> zum Webserver aufbauen. Außerdem werden wir eine Textnachricht zum Server senden und sogar eine <b>Broadcast Nachricht</b> vom Webserver empfangen. Der Client-side Code ist überwiegend von <a href="http://jcavallotti.blogspot.de/2012/06/websockets-on-tomcat-7.html">jcavallotti.blogspot.de</a> kopiert - blogspot Blogger müssen schließlich zusammenhalten.<br />
<br />
Auf der Server-side werden wir den Tomcat 7 nutzen mit seiner neuen <a href="http://tomcat.apache.org/tomcat-7.0-doc/api/index.html?org/apache/catalina/websocket/WebSocketServlet.html">Servlet API</a> für WebSockets. Meine Hauptquelle für diesen Artikel war ein Tutorial auf <a href="http://www.tomcatexpert.com/blog/2012/05/01/how-apache-tomcat-implemented-websocket">tomcatexpert.com</a>. Ich arbeite auf der Server-side bevorzugt mit Java oder PHP, daher kommen für mich Technologien wie <a href="http://nodejs.org/">Node.js</a> oder <a href="http://www.tornadoweb.org/">Tornado</a> nicht in Frage. Es gibt auch schon erste inoffizielle Module für den Apache http Server in C, die den Apache Webserver WebSocket-fähig machen. Was daraus wird bleibt abzuwarten.<br />
<br />
<h2>
Motivation</h2>
Mit einer persistenten Verbindung zum Server kann man eine Menge nützlicher Anwendungen umsetzen, allen voran sind das Applikationen mit <b>Echtzeit Anforderungen</b>. Mit Ajax ist lediglich ein s.g. <b>Polling</b> möglich, was einen extremen Overhead an unnötigen Verbindungsauf- und abbau bedeutet und somit die Anwendung einiges an Performance kostet.<br />
<br />
Ein weiterer Vorteil von WebSockets ist, dass nun <b>server-controlled</b> Peer2Peer Verbindungen möglich sind. Das bedeutet, dass man zwar keine direkte Verbindung von Client zu Client hinbekommt, aber die Server-side Applikation die Verbindungen verwalten kann, und somit Daten direkt an Clients adressieren kann. Als bestes Beispiel dient hier ein Private Messaging Feature eines Chatsystems. Mit Ajax muss der Client zyklisch den Server fragen (<b>polling</b>), ob neue Private Nachrichten eingetroffen sind. Das verlangt außerdem einen Mehraufwand in der Programmierung bzgl. Sicherheit und Authentifizierung.<br />
Mit den WebSockets benachrichtigt der Server den Client quasi in Echtzeit, wenn ein anderer Client eine Nachricht an diesen Client gesendet hat. Dieses Verfahren nennt man auch <b>Event-basierte Kommunikation</b>, weil der Client auf ein Ereignis reagiert, statt ständig nachzufragen, ob es ein Ereignis gibt.<br />
<br />
WebSockets sind ein echtes Highlight im HTML5 Standard. Wer sich jetzt damit vertraut macht kann bestehende Anwendungen optimieren oder ganz neue state-of-the-art Applikationen bauen, wie z.B. <a href="http://tweetping.net/">tweetping.net</a>.<br />
<br />
<h2>
Voraussetzungen</h2>
Wir benötigen folgende Tools:<br />
<ul>
<li>Eclipse</li>
<li>Maven</li>
<li>Tomcat 7</li>
<li>HTML5 kompatiblen Browser</li>
</ul>
Ich empfehle außerdem die <a href="http://tomcat.apache.org/tomcat-7.0-doc/api/index.html?org/apache/catalina/websocket/package-summary.html">Tomcat 7 Websocket API </a>Dokumentation. Alle hier genannten Voraussetzungen werden in vorherigen Artikeln (K2.1 bis K2.2.1) ausführlich behandelt.<br />
<br />
<h2>
Umsetzung</h2>
<h3>
Kurzübersicht aller Schritte</h3>
<ol>
<li>Neue Verzeichnisstruktur inklusive Dateien im parentproject anlegen</li>
<li>Verzeichnis als Maven Projekt importieren</li>
<li>Eclipse Run Configuration einrichten</li>
<li>Tomcat 7 Server starten</li>
<li>Maven Cargo Plugin ausführen</li>
<li>Mit HTML websocket Client verbinden</li>
</ol>
Den gesamten Code des aktuellen Standes meines Maven Projekts <b>parentproject </b>gibt es <a href="https://docs.google.com/file/d/0BwBlXQsr_e6IMWxkTkU1Wmc2MHM/edit" target="_blank">hier zum Download</a>.<br />
<br />
<ol>
</ol>
<h3>
1. Verzeichnisstruktur anlegen</h3>
Wir wollen folgende Verzeichnisse und Dateien anlegen:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-KDkYU_-SQO0/USk74ZiSG7I/AAAAAAAAAb0/KfZIqEUIGdI/s1600/screenshot.1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-KDkYU_-SQO0/USk74ZiSG7I/AAAAAAAAAb0/KfZIqEUIGdI/s320/screenshot.1.png" width="256" /></a></div>
<br />
Die Quelltexte zu den 3 Dateien sehen folgendermaßen aus:<br />
<h4>
pom.xml
</h4>
<pre class="brush:xml;"><project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelversion>4.0.0</modelversion>
<artifactid>websocket</artifactid>
<version>1.0.0</version>
<packaging>war</packaging>
<parent>
<groupid>de.blogspot.sw-technik</groupid>
<artifactid>parentproject</artifactid>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<tomcat .version="">7.0.29</tomcat>
<cargo .version="">1.2.4</cargo>
</properties>
<build>
<plugins>
<plugin>
<groupid>org.codehaus.cargo</groupid>
<artifactid>cargo-maven2-plugin</artifactid>
<version>${cargo.version}</version>
<!-- Cargo Tomcat -->
<configuration>
<container>
<containerid>tomcat7x</containerid>
<type>remote</type>
</container>
<configuration>
<type>runtime</type>
<properties>
<!-- /text requires the tomcat-users.xml user/role config with manager-script -->
<cargo .tomcat.manager.url="">http://localhost:8080/manager/text</cargo>
<cargo .remote.username="">tomcat</cargo>
<cargo .remote.password="">tomcat</cargo>
</properties>
</configuration>
</configuration>
<dependencies>
<dependency>
<groupid>org.codehaus.cargo</groupid>
<artifactid>cargo-core-container-tomcat</artifactid>
<version>${cargo.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupid>org.apache.tomcat</groupid>
<artifactid>tomcat-catalina</artifactid>
<version>${tomcat.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupid>org.apache.tomcat</groupid>
<artifactid>tomcat-coyote</artifactid>
<version>${tomcat.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
</pre>
<br />
<br />
<h4>
web.xml
</h4>
<pre class="brush:xml;"><web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>ws_servlet</servlet-name>
<servlet-class>de.blogspot.swtechnik.servlet.WsServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ws_servlet</servlet-name>
<url-pattern>/websocket</url-pattern>
</servlet-mapping>
</web-app>
</pre>
<br />
<h4>
de.blogspot.swtechnik.servlet.WsServlet.java
</h4>
<pre class="brush:java;">package de.blogspot.swtechnik.servlet;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;
public class WsServlet extends WebSocketServlet {
private static final long serialVersionUID = 4541321228711151433L;
/**
* Connected clients
*/
private static List<streaminbound> clients = new ArrayList<streaminbound>();
/**
* Send a message to all clients connected.
*
* @param message
*/
private void broadcast(String message) {
StreamInbound someClient;
ListIterator<streaminbound> iter = clients.listIterator();
while (iter.hasNext()) {
someClient = (MessageInbound) iter.next();
try {
someClient.getWsOutbound().writeTextMessage(
CharBuffer.wrap(message)
);
} catch (IOException e) {
}
}
}
@Override
protected StreamInbound createWebSocketInbound(String string, HttpServletRequest hsr) {
MessageInbound inbound = new MessageInbound() {
@Override
protected void onClose(int status) {
System.out.println("onClose - status code: " + status);
clients.remove(this);
}
@Override
protected void onBinaryMessage(ByteBuffer bb) throws IOException {
System.out.println("onBinaryMessage");
}
@Override
protected void onTextMessage(CharBuffer cb) throws IOException {
System.out.println("onTextMessage");
CharBuffer msg = CharBuffer.wrap(cb);
WsOutbound outbound = getWsOutbound();
// Send message to client connected
outbound.writeTextMessage(msg);
// Send message to all clients connected
broadcast("Broadcast");
}
@Override
protected void onOpen(WsOutbound outbound) {
int connSize = clients.size();
System.out.println("onOpen - connections: " + connSize);
}
};
// Collect clients connected
clients.add(inbound);
return inbound;
}
}
</pre>
<br />
<h3>
2. Import als Maven Projekt</h3>
Öffnen Sie in Eclipse die <b>Import</b> View:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/--3IAJ84WkI4/USk776TgmWI/AAAAAAAAAb8/fsnDpcAkdlQ/s1600/screenshot.2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/--3IAJ84WkI4/USk776TgmWI/AAAAAAAAAb8/fsnDpcAkdlQ/s320/screenshot.2.png" width="238" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-B3dHmLscBEo/USk88Oi0hqI/AAAAAAAAAcE/BSKYMmgbJw0/s1600/screenshot.3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="283" src="http://2.bp.blogspot.com/-B3dHmLscBEo/USk88Oi0hqI/AAAAAAAAAcE/BSKYMmgbJw0/s320/screenshot.3.png" width="320" /></a></div>
Nach Abschluss dieses Dialogs sollten Sie nun ein eigenständiges Projekt in Eclipse haben.<br />
<br />
<br />
<h3>
3. Eclipse Run Configuration einrichten</h3>
Für dieses Projekt nutzen wir das Maven Cargo Plugin, um unsere Web Anwendung per Klick auf dem Tomcat Server zu deployen.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-dGbRoclWJjg/USk9c1qanAI/AAAAAAAAAcM/JQx3TTlsHmg/s1600/screenshot.4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="238" src="http://2.bp.blogspot.com/-dGbRoclWJjg/USk9c1qanAI/AAAAAAAAAcM/JQx3TTlsHmg/s320/screenshot.4.png" width="320" /></a></div>
<br />
<h3>
4. Tomcat 7 starten</h3>
Für HTML5 websockets wird ein Server benötigt, der das <i>ws</i> und <i>wss</i> Protokoll implementiert. Der Apache http Webserver ist momentan noch nicht fähig Verbindungen mit diesem Protokoll zu verwalten. Aktuelle Server, die websockets unterstützen sind z.B.<br />
<ul>
<li><a href="http://tomcat.apache.org/download-70.cgi">Tomcat 7</a></li>
<li><a href="http://jetty.codehaus.org/jetty/">Jetty</a></li>
<li><a href="http://jwebsocket.org/" target="_blank">jWebSocket</a></li>
<li><a href="http://nodejs.org/">Node.js</a></li>
<li>uvm.</li>
</ul>
Wir werden in diesem Tutorial den Tomcat 7 verwenden, da es mir lieber ist auf der Server-side mit Java, statt Javascript zu programmieren. Sicherlich sind die Java Lösungen nicht so performant, wie ein Node.js, aber für die meisten Anwendungen wird ein Tomcat 7 sicher mehr als ausreichend sein.<br />
<br />
Tomcat 7 sollte in Eclipse bereits als Server eingerichtet sein. Nun starten Sie den Server:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-pFebU8cELU8/USlBjrqX8hI/AAAAAAAAAcU/NYcdwMt4oHg/s1600/screenshot.5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/-pFebU8cELU8/USlBjrqX8hI/AAAAAAAAAcU/NYcdwMt4oHg/s320/screenshot.5.png" width="231" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<h3>
5. Maven Cargo Plugin ausführen</h3>
In der pom.xml haben wir das Cargo Plugin integriert. Außerdme haben wir die Run Configuration eingerichtet und wenn wir nun das Projekt auf dem laufenden Tomcat Server deployen möchten müssen wir nur diese Konfiguration ausführen.<br />
Sie sollten in der Eclipse Konsole sehen wie das Projekt gebaut wird und direkt nach dem erfolgreichen Build den Deployment Pfad in Tomcat:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-O9Dv6e-WDmk/USlCAvRTqDI/AAAAAAAAAcc/JsJZvVVxe7Y/s1600/screenshot.6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="271" src="http://1.bp.blogspot.com/-O9Dv6e-WDmk/USlCAvRTqDI/AAAAAAAAAcc/JsJZvVVxe7Y/s320/screenshot.6.png" width="320" /></a></div>
<br />
<h3>
6. Websocket Client</h3>
Es gibt für Websockets nicht nur auf der Server-side spezielle Voraussetzungen, sondern natürlich auch auf der Client-side. Wir werden eine einfache HTML Seite mit Javascript Code als Client verwenden. Es existieren zahlreiche Websocket Client APIs in verschiedenen Sprachen, z.B. Java, Javascript, PHP, Ruby, Python, etc.<br />
HTML Beispiel:
<br />
<pre class="brush:html;"><!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.1.1.min.js"></script>
<script type="text/javascript">
var ws = new WebSocket("ws://localhost:8080/websocket-1.0.0/websocket");
ws.onopen = function() {
console.log("Websocket Ready!!");
}
ws.onclose = function() {
console.log("Websocket Closed!!");
}
ws.onerror = function() {
console.log("Websocket Error!!");
}
ws.onmessage= function(data) {
console.log(data.data);
if ("Hi!" == data.data) {
//ws.close();
}
}
function sendMessage() {
ws.send(2);
}
$( document ).ready( function() {
$("a").click(function( event ) {
sendMessage();
});
});
</script>
<title>WebSockets Client</title>
</head>
<body>
<a href="#">LINK</a>
</body></html>
</pre>
<br />
<br />
Speichern Sie den obigen HTML Code in einer .html Datei auf ihrem Rechner. Rufen Sie diese Datei im Browser auf, z.B.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-3_xVEO751TE/USlF6vOIXaI/AAAAAAAAAck/bkbmqC9G6jw/s1600/screenshot.7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="http://1.bp.blogspot.com/-3_xVEO751TE/USlF6vOIXaI/AAAAAAAAAck/bkbmqC9G6jw/s320/screenshot.7.png" width="320" /></a></div>
Öffnen Sie die Entwicklertools des Browsers. Sie sollten dann eine Meldung "<i>Websocket Ready!!</i>" sehen, und in der Eclipse Konsole (rechts) sehen Sie die Ausgabe aus der Methode <b><span style="font-family: "Courier New",Courier,monospace;">onClose(int status)</span></b> aus der Servlet Klasse.<br />
<br />
Klicken Sie nun einmal auf "<b>LINK</b>" und beobachten Sie die Eclipse und Browser Konsole. Hier die Veränderungen:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Xf542Ymm48k/USlIE5QLbqI/AAAAAAAAAc0/lqYylEb_RDI/s1600/screenshot.8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="161" src="http://3.bp.blogspot.com/-Xf542Ymm48k/USlIE5QLbqI/AAAAAAAAAc0/lqYylEb_RDI/s320/screenshot.8.png" width="320" /></a></div>
Und ein weiterer Klick ergibt folgende Ausgabe:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-jiybSPpEn0I/USlInDVfrnI/AAAAAAAAAc8/SoeiFjC8ig4/s1600/screenshot.9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="163" src="http://2.bp.blogspot.com/-jiybSPpEn0I/USlInDVfrnI/AAAAAAAAAc8/SoeiFjC8ig4/s320/screenshot.9.png" width="320" /></a></div>
Nun wollen wir uns mit einem zweiten Client verbinden. Dafür müssen wir nur ein neues Tab öffnen und die HTML websocket Client Datei aufrufen:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-0QYCB0YW-0Y/USlJAgvyFzI/AAAAAAAAAdE/KTa5hYjMeZw/s1600/screenshot.10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="163" src="http://3.bp.blogspot.com/-0QYCB0YW-0Y/USlJAgvyFzI/AAAAAAAAAdE/KTa5hYjMeZw/s320/screenshot.10.png" width="320" /></a></div>
Jetzt wollen wir die <b>Broadcast</b> Methode unseres Servlets einmal testen. Ein Broadcast ist eine Nachricht, die an alle Clients versendet wird. In unserem Fall werden wir per Klick auf "<b>LINK</b>" im <i>ersten Tab</i> den Broadcast quasi auslösen. Die Nachricht wird dann auch im <i>zweiten Tab</i> zu sehen sein, weder dass wir dort eine Aktion ausgeführt haben, noch muss das Tab oder der Browser dabei im Vordergrund sein.<br />
Außerdem sehen Sie in der Eclipse Konsole, dass nun tatsächlich 2 Verbindungen existieren.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-R01orjXodIk/USlLmfDzwhI/AAAAAAAAAdM/V5fd5e9NCas/s1600/screenshot.11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="165" src="http://1.bp.blogspot.com/-R01orjXodIk/USlLmfDzwhI/AAAAAAAAAdM/V5fd5e9NCas/s320/screenshot.11.png" width="320" /></a></div>
An dieser Stelle endet das Tutorial zu HTML5 WebSockets, allerdings ist damit das Thema noch lange nicht ausgeschöpft. Sie haben aber jetzt das nötige Basiswissen, um zu erkennen, welches Potential in WebSockets steckt und wie Sie die neuen Möglichkeiten für Ihre Anwendungen nutzen können.<br />
<br />
<h2>
Zusammenfassung</h2>
Sie haben gelernt, wie man den Tomcat 7 als WebSocket Server einsetzen kann und wie Sie sich mit einem Javascript Client verbinden können. Die lokale Entwicklungsumgebung wurde mit Eclipse und dem Maven Cargo Plugin praxisorientiert aufgesetzt, sodass Sie nun alles haben, um professionell moderne HTML5 Anwendungen entwickeln zu können.<br />
<br />
<h2>
Weitere Schritte</h2>
Dieser Artikel hat das Thema WebSockets nur in einem minimalen Umfang angerissen. Es lohnt sich weiter mit den verschiedenen APIs, Frameworks und Anwendungsfällen zu beschäftigen. Am besten in der jeweils bevorzugten Technologie für Client und Server.<br />
<br />
Weiterführende Links zu diesem Thema:<br />
<ul>
<li><a href="http://www.websocket.org/index.html">websocket.org</a></li>
<li><a href="http://www.html5rocks.com/de/tutorials/websockets/basics/">html5rocks.com</a> (WebSockets)</li>
<li><a href="http://tools.ietf.org/html/rfc6455">RFC6455</a> (WebSockets)</li>
<li><a href="http://www.tomcatexpert.com/blog/2012/04/24/websockets-tomcat-7">tomcatexpert.com</a></li>
<li><a href="http://activemq.apache.org/websockets.html">ActiveMQ</a> (WebSockets) </li>
<li><a href="http://mbed.org/cookbook/Websockets-Server">Tornado Tutorial</a></li>
<li><a href="http://socket.io/">socket.io</a></li>
<li><a href="http://blog.jonaspasche.com/2011/11/30/https-websockets-port-multiplexing-wenn-apache-nicht-mehr-reicht/">Apache, websockets und mehr</a></li>
</ul>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6086851661951052231.post-73196973608474859842013-02-12T00:47:00.000+01:002013-08-11T09:06:45.219+02:00K2.2.1 - Entwicklung im Team mit Apache Archiva, Maven, Git und Eclipse<h2>
Einleitung</h2>
In diesem Artikel werden wir zu aller erst <a href="http://archiva.apache.org/" target="_blank">Apache Archiva</a> als zentralen Repository Management Server für ein Projekt konfigurieren, welches wir mit dem <a href="http://www.magnolia-cms.com/" target="_blank">Magnolia CMS</a> aufsetzen werden. Wir nutzen <a href="http://git-scm.com/" target="_blank">Git</a> als Versionskontrollsystem und werden dafür auch ein zentrales Repository einrichten, ein s.g. <a href="http://git-scm.com/book/en/Git-on-the-Server-Getting-Git-on-a-Server" target="_blank">Git bare</a> repository.<br />
<br />
Wir
werden es uns nicht zu einfach machen und direkt ein Maven Projekt mit
Untermodulen (Maven submodules) aufsetzen. Es gibt als Alternative noch
die flache Projektstruktur, die ich persönlich nicht empfehle, da man
für jedes Modul/Projekt ein eigenes Git Repository benötigen würde. Das
kann dann etwas aufwendig werden in der Wartung und Verwaltung der
Repositories. Ansonsten ist die flache Struktur nicht unbedingt
schlechter, als die hierarchische. Man sollte sich die Vor- und
Nachteile mal genauer ansehen, und dazu kann ich den <a href="http://www.torsten-horn.de/techdocs/maven-multiproj.htm" target="_blank">Artikel von Torsten Horn</a> empfehlen.<br />
<br />
Außerdem
zeige ich diverse Wege, wie man in Eclipse ein Maven Webapp Projekt auf
einem Apache Tomcat deployen kann. Den Tomcat Server werden wir
natürlich auch gemeinsam installieren und in Eclipse in der S<i>ervers View</i> einrichten. Wir werden für das Deployment das <a href="http://cargo.codehaus.org/Maven2+plugin" target="_blank">Maven Cargo Plugin</a> nutzen und dabei ist es übrigens egal, ob der Tomcat Server <b>lokal oder entfernt (remote)</b>
läuft, da mit dem Plugin auf einen beliebigen Server deployed werden
kann. Wir nutzen hier zwar Tomcat, aber das Plugin kann auch mit JBoss
oder anderen Application Servern umgehen.<br />
<br />
Am Ende
dieses Artikels haben Sie dann ein Magnolia Webapp Projekt als Maven
submodule in einem Maven parent Projekt unter Git Versionskontrolle. Mit
den beiden zentralen Repository Servern für Maven und Git ist das eine
solide Basis für die Entwicklung auch in einem größeren Team.<br />
<br />
<h2>
Motivation</h2>
<br />
Im Unternehmensumfeld macht es Sinn aus
Gründen einer wartbaren und standardisierten Infrastuktur für die
Softwareentwicklung einen zentralen Repository Server, sowohl für Maven
als auch für Git aufzusetzen. Beide Technologien sind seit einiger Zeit
dabei die etablierten Tools <i>Apache Ant</i> und <i>Subversion</i>
abzulösen und das wohl zu recht. Aus eigener Erfahrung muss ich nach
langjähriger Nutzung von SVN zugeben, dass Git als verteiltes
Versionskontrollsystem einige Vorteile hat. Allerdings kenne ich keines
der anderen Distributed Version Control Systems (DVCS), wie z.B. <a href="http://mercurial.selenic.com/" target="_blank">Mercurial</a>.
Wer etwas im Internet unterwegs ist und diverse Fachmagazine liest, der
weiß, dass Git in diesen Medien eine enorme Präsenz hat und daher wohl
einen größeren Bekanntheitsgrad genießt.<br />
<br />
Auch Apache
Maven kann einen ähnlichen Erfolg vorweisen. Der Umstieg von Ant auf
Maven ist zwar etwas aufwendig, da die Workflows und die Projektstruktur
komplett unterschiedlich sind, aber wer in die Zukunft investieren
möchte, sollte die Migration auf jeden Fall angehen. Die Ant Experten
und auch die SVN Gurus werden über die nächsten Jahre weniger werden, so
dass Unternehmen es schwer haben werden fähiges Personal für ihre
Projekte zu finden, wenn diese auf veralteten Technologien basieren. Und
andersherum erhöht man natürlich als Entwickler seinen eigenen
Markwert, wenn man moderne Technologien beherrscht.<br />
<br />
Apropos
"moderne Technologie", wie bereits erwähnt werden wir als erstes Maven
Projekt eine Java Web Applikation mit dem Magnolia CMS aufsetzen.
Magnolia gehört zweifellos zu den modernsten Content Management Systemen
im Java Umfeld. Leider ist in diesem Artikel kein Platz mehr für eine
Einführung in Magnolia, wer aber Interesse hat kann im Anschluss mit der
sehr guten <a href="http://documentation.magnolia-cms.com/technical-guide.html" target="_blank">Dokumentation</a> weiter arbeiten und das Projekt ausbauen. Ich empfehle zuerst mit der <a href="http://documentation.magnolia-cms.com/technical-guide/magnolia-webapp.html" target="_blank">Webapp</a> und <a href="http://documentation.magnolia-cms.com/technical-guide/modules.html" target="_blank">Modul</a> Dokumentation anzufangen.<br />
<br />
Have fun!<br />
<br />
<h2>
Voraussetzungen</h2>
So wie es die Kapitelnummer im Titel dieses Artikels vermuten lässt, sollte man den vorherigen Artikel <a href="http://sw-technik.blogspot.de/p/blog-page_21.html" target="_blank">K2.2 - Professionelle Entwicklung mit Git und Maven unter Eclipse und mit Apache Archiva</a>
durchgearbeitet haben, um alle notwendigen Installationen bereit zu
haben, z.B. eine lokal laufende virtuelle Maschine mit VirtualBox, um
die Server Repositories für Maven und Git möglichst praxisnah betreiben
zu können. Vorallem aber wird von Apache Archiva eine Installation
aufgesetzt, die in diesem Tutorial weiter konfiguriert wird und auch
Eclipse mit den notwendigen Plugins <i>m2eclipse</i> und <i>EGit</i> werden installiert.<br />
<br />
<h3>
Server-Side (Linux Debian)</h3>
<ul>
<li><a href="http://sw-technik.blogspot.de/2013/01/k21-workstation-pc-mit-der-virtualbox.html" target="_blank">Virtuelle Maschine mit Linux Debian</a> </li>
<li>Apache Archiva</li>
<li>Git</li>
</ul>
<br />
<h3>
Workstation PC (Windows 7)</h3>
<ul>
<li><a href="http://tomcat.apache.org/download-70.cgi" target="_blank">Apache Tomcat 7</a> (Core, zip)</li>
<li><a href="http://www.eclipse.org/downloads/" target="_blank">Eclipse</a> mit den Plugins <a href="http://eclipse.org/m2e/download/" target="_blank">m2eclipse</a> und <a href="http://www.eclipse.org/egit/" target="_blank">EGit </a></li>
</ul>
<br />
<h2>
Umsetzung</h2>
<h3>
Kurzübersicht aller Schritte</h3>
<ol>
<li>Apache Archiva konfigurieren (Magnolia Remote Repository hinzufügen) (~5min)</li>
<li>In Eclipse ein Maven Basis Projekt erstellen (ein s.g. parent module einer multi-module Struktur) (~5min)</li>
<li>Magnolia Webapp als Projekt erstellen (als s.g. Maven submodule im Basis Projekt) (~5min)</li>
<li>Apache Tomcat in Eclipse integrieren (~10min)</li>
<li>Magnolia Webapp Maven Projekt auf Tomcat deployen (~15min)</li>
<li>Ein zentrales Git bare repository erstellen (~3min)</li>
<li>In Eclipse unser Maven Projekt unter Git Versionskontrolle stellen (~5min)</li>
</ol>
<h4>
1. Apache Archiva konfigurieren</h4>
Rufen Sie Apache Archiva im Browser auf und loggen Sie sich mit Ihrem Administrator Benutzer ein, z.B.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-zadBTveduoA/URfvx-ex5gI/AAAAAAAAAQQ/xRcpSqSzdgU/s1600/screenshot.1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="195" src="http://3.bp.blogspot.com/-zadBTveduoA/URfvx-ex5gI/AAAAAAAAAQQ/xRcpSqSzdgU/s400/screenshot.1.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-htTJFmq3C5o/URfvwL_-RqI/AAAAAAAAAQI/00AfvuYRFZY/s1600/screenshot.2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="309" src="http://3.bp.blogspot.com/-htTJFmq3C5o/URfvwL_-RqI/AAAAAAAAAQI/00AfvuYRFZY/s320/screenshot.2.png" width="320" /></a></div>
Klicken Sie auf Repositories und wenn Sie parallel Eclipse geöffnet haben, sollten Sie in der <b>Eclipse View</b> "<i>Maven Repositories</i>" unter Global Repositories das eingerichtete Archiva als "internal-blogger" sehen, wenn Sie den <a href="http://sw-technik.blogspot.de/p/blog-page_21.html" target="_blank">vorherigen Artikel</a> durchgearbeitet habe:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-sy2r1s89yK8/URfv4Kse-NI/AAAAAAAAAQo/qsseU0rSUoU/s1600/screenshot.3.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="169" src="http://4.bp.blogspot.com/-sy2r1s89yK8/URfv4Kse-NI/AAAAAAAAAQo/qsseU0rSUoU/s320/screenshot.3.png" width="320" /></a></div>
Sie
sehen, dass aktuell 2 remote repositories konfiguriert sind. Diese sind
in Apache Archiva bereits vorkonfiguriert gewesen. Wir benötigen nun
ein weiteres remote repository, worüber wir das Magnolia CMS beziehen
können.<br />
Klicken Sie dazu auf "Add" und füllen Sie die Felder mit folgenden Werden aus:<br />
<ul>
<li>URL: http://nexus.magnolia-cms.com/content/repositories/magnolia.public.releases/</li>
<li>Sonstige Feldwerte sehen Sie im Screenshot</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-n-hOVynRENY/URfv4gZ9fdI/AAAAAAAAAQw/MyxfLHl5bjc/s1600/screenshot.4.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="194" src="http://1.bp.blogspot.com/-n-hOVynRENY/URfv4gZ9fdI/AAAAAAAAAQw/MyxfLHl5bjc/s320/screenshot.4.png" width="320" /></a></div>
Speichern Sie das Repository mit "Add Repository":<br />
<div style="text-align: center;">
<a href="http://2.bp.blogspot.com/-3qioCtY0KoA/URfv6LnopAI/AAAAAAAAAQ4/drk7Omru_P8/s1600/screenshot.7.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="294" src="http://2.bp.blogspot.com/-3qioCtY0KoA/URfv6LnopAI/AAAAAAAAAQ4/drk7Omru_P8/s320/screenshot.7.png" width="320" /></a> </div>
Jetzt
fehlt noch die Proxy Konfiguration damit das neue Repository auch
verwendet werden kann. Klicken Sie dazu auf "Proxy Connectors" und
anschließend direkt auf "Add":<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-oLLwRhNW_jo/URfv3nl7RmI/AAAAAAAAAQg/HOGXmrg1AaI/s1600/screenshot.6.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="294" src="http://2.bp.blogspot.com/-oLLwRhNW_jo/URfv3nl7RmI/AAAAAAAAAQg/HOGXmrg1AaI/s320/screenshot.6.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-3qioCtY0KoA/URfv6LnopAI/AAAAAAAAAQ4/drk7Omru_P8/s1600/screenshot.7.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="294" src="http://2.bp.blogspot.com/-3qioCtY0KoA/URfv6LnopAI/AAAAAAAAAQ4/drk7Omru_P8/s320/screenshot.7.png" width="320" /></a></div>
Sie
haben nun das Magnolia Repository hinzugefügt und können nun in einem
Maven Projekt Magnolia dependencies benutzen, die von diesem Repository
heruntergeladen werden.<br />
<br />
<h4>
2. Maven multi-module Projekt erstellen</h4>
Starten Sie Eclipse und klicken Sie auf "File" -> "New" -> "Other":<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-qp96A3rqJ8Y/URf4y6ejWII/AAAAAAAAARg/YRGNO2T_G_4/s1600/screenshot.8.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-qp96A3rqJ8Y/URf4y6ejWII/AAAAAAAAARg/YRGNO2T_G_4/s320/screenshot.8.png" width="265" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-IVH4lEwb360/URf4x5FtiWI/AAAAAAAAARY/Qkb_lvcK4AU/s1600/screenshot.9.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-IVH4lEwb360/URf4x5FtiWI/AAAAAAAAARY/Qkb_lvcK4AU/s320/screenshot.9.png" width="306" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-N5yu-Dyb0Fg/URf4wKp0hrI/AAAAAAAAARQ/DE6a8aLOoXY/s1600/screenshot.10.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-N5yu-Dyb0Fg/URf4wKp0hrI/AAAAAAAAARQ/DE6a8aLOoXY/s320/screenshot.10.png" width="308" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-bnpc6KnD5Mw/URf4zxR4NkI/AAAAAAAAARo/8JWhZinuvuk/s1600/screenshot.11.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="170" src="http://4.bp.blogspot.com/-bnpc6KnD5Mw/URf4zxR4NkI/AAAAAAAAARo/8JWhZinuvuk/s320/screenshot.11.png" width="320" /></a></div>
Achten Sie darauf, dass Sie als <b>Packaging</b> Typ "<i>pom</i>" ausgewählt haben. Dies macht ein Maven Projekt zu einem Basis Projekt einer Maven <b>multi-module Projektstruktur</b>.<br />
<br />
<br />
<h4>
3. Maven submodule als Projekt erstellen</h4>
Ein parent Projekt hat
die Aufgabe mehrere Unterprojekte zu verwalten, d.h. man kann Maven
Goals auf das parent Projekt ausführen und es wird auch auf alle
Unterprojekte ausgeführt.<br />
<br />
Um ein submodule zu erstellen sind nur 3 Dinge notwendig:<br />
<ol>
<li>Ein Unterverzeichnis im parent Projekt als Modulverzeichnis</li>
<li>Ein <span style="font-family: "Courier New",Courier,monospace;"><module></span> Eintrag in der parent pom.xml </li>
<li>Eine eigene pom.xml im neuen Unterprojekt/Modulverzeichnis</li>
</ol>
In folgendem Screenshot sehen Sie das Ergebnis nach 1. und 2.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/--Btyvubut8k/URf7yKLnxsI/AAAAAAAAARw/v_uKPvv4cbg/s1600/screenshot.12.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="121" src="http://4.bp.blogspot.com/--Btyvubut8k/URf7yKLnxsI/AAAAAAAAARw/v_uKPvv4cbg/s320/screenshot.12.png" width="320" /></a></div>
Jedes
Maven Projekt hat eine eigene pom.xml Datei. Für das neue Unterprojekt
wollen wir Magnolia als Webapp Projekt einrichten. Dazu starten wir mit
folgender pom.xml (3.):<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-cblbnyYel-0/URf71LfOx9I/AAAAAAAAASA/NMG6zCmI_yE/s1600/screenshot.13.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="164" src="http://4.bp.blogspot.com/-cblbnyYel-0/URf71LfOx9I/AAAAAAAAASA/NMG6zCmI_yE/s320/screenshot.13.png" width="320" /></a></div>
Wir
können nun das Untermodul als separates Eclipse Projekt importieren.
Dies ändert nichts an der Verzeichnisstruktur, lediglich in Eclipse wird
sich die Anzeige anpassen.<br />
Klicken Sie auf "File" -> "Import...":<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-js7-rYn-FCQ/URf7z8dJ1BI/AAAAAAAAAR4/Ah1VstU8i9M/s1600/screenshot.14.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/-js7-rYn-FCQ/URf7z8dJ1BI/AAAAAAAAAR4/Ah1VstU8i9M/s320/screenshot.14.png" width="305" /></a></div>
Anschließend
wählen Sie das Maven submodule aus. Der Eclipse Wizard wird es
erkennen, da im Modulverzeichnis eine pom.xml existiert:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-8UFTYTsNzN0/URf71KeDMFI/AAAAAAAAASE/cqzJrs9dP-I/s1600/screenshot.15.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-8UFTYTsNzN0/URf71KeDMFI/AAAAAAAAASE/cqzJrs9dP-I/s320/screenshot.15.png" width="316" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-9jJg705TTjY/URf72fS1dqI/AAAAAAAAASQ/449rb-I1ZXQ/s1600/screenshot.16.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-9jJg705TTjY/URf72fS1dqI/AAAAAAAAASQ/449rb-I1ZXQ/s320/screenshot.16.png" width="316" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-yPauXEqYXlY/URf72nmCu1I/AAAAAAAAASY/o4HKGNROqtI/s1600/screenshot.17.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-yPauXEqYXlY/URf72nmCu1I/AAAAAAAAASY/o4HKGNROqtI/s320/screenshot.17.png" width="260" /></a></div>
Nun
sehen Sie zwei Projekte in Eclipse, das Maven submodule ist als
eigenständiges Projekt importiert worden. Das Dateisystem hat sich aber
nicht verändert.<br />
<br />
Als nächstes können Sie einfach mal
das Projekt bauen und zwar mit dem Maven Goal "install". Gehen Sie dazu
per Rechtsklick auf das Projekt auf Run As und anschließend auf Maven
install:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-fj64ouuR7yE/URgELlCk5YI/AAAAAAAAAS0/oqUczYkUQXs/s1600/screenshot.18.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="224" src="http://1.bp.blogspot.com/-fj64ouuR7yE/URgELlCk5YI/AAAAAAAAAS0/oqUczYkUQXs/s320/screenshot.18.png" width="320" /></a></div>
Es wird ein WAR Archiv im target Verzeichnis erzeugt. Dies können Sie nun auf einem Tomcat Server deployen.<br />
Für
alle die an dieser Stelle keinen Tomcat Server zur Verfügung haben, wir
werden direkt im Anschluss einen lokalen Tomcat installieren und in
Eclipse integrieren, sodass Tomcat direkt aus Eclipse heraus gestartet
und gestoppt werden kann.<br />
<br />
<h4>
4. Apache Tomcat in Eclipse integrieren</h4>
Wir benötigen zur Integration in Eclipse die Web Tools Platform (WTP), die wir über <i>Help </i>-> <i>Install New Software</i> installieren können:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-4Ow53iW4-Vk/URlJAap_FeI/AAAAAAAAATQ/Z8gHT5lc9Cg/s1600/screenshot.22.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="299" src="http://4.bp.blogspot.com/-4Ow53iW4-Vk/URlJAap_FeI/AAAAAAAAATQ/Z8gHT5lc9Cg/s320/screenshot.22.png" width="320" /></a></div>
Nach der erfolgreichen Installation hat man die <b>Servers View</b> in Eclipse zur Verfügung.<br />
<br />
Laden Sie nun ein <a href="http://tomcat.apache.org/download-70.cgi" target="_blank">Tomcat Binary zip Paket</a> herunter und entpacken Sie es in ein Verzeichnis Ihrer Wahl. Das Ergebnis sollte ungefähr so aussehen:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-CU5ViwtQoSI/URlJqSK3yNI/AAAAAAAAATY/cnVXjqcAm-s/s1600/screenshot.23.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="164" src="http://4.bp.blogspot.com/-CU5ViwtQoSI/URlJqSK3yNI/AAAAAAAAATY/cnVXjqcAm-s/s320/screenshot.23.png" width="320" /></a></div>
Jetzt ist es an der Zeit die Eclipse Servers View anzuzeigen. Gehen Sie zu <i>Window </i>-> <i>Show View</i> -> <i>Other</i> und wählen Sie <b>Servers</b> aus:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-U7WMV-UpTHc/URlMAqC01CI/AAAAAAAAAT0/bzXOMhwqJDU/s1600/screenshot.28.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-U7WMV-UpTHc/URlMAqC01CI/AAAAAAAAAT0/bzXOMhwqJDU/s320/screenshot.28.png" width="181" /></a></div>
Anschließend sehen Sie das Servers Window:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ID9GTuOgBa0/URlMjwPkkRI/AAAAAAAAAT8/VxWNqrdmEog/s1600/screenshot.29.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="167" src="http://4.bp.blogspot.com/-ID9GTuOgBa0/URlMjwPkkRI/AAAAAAAAAT8/VxWNqrdmEog/s320/screenshot.29.png" width="320" /></a></div>
Klicken Sie in diesem Fenster auf den Link "<i>new server wizard</i>" und wählen Sie unter <b>Apache</b> den Tomcat Eintrag mit der <b>passenden Version</b> aus:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-zbe5JUi4fEo/URlNA5DxsMI/AAAAAAAAAUE/nPJJR0T22bU/s1600/screenshot.30.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-zbe5JUi4fEo/URlNA5DxsMI/AAAAAAAAAUE/nPJJR0T22bU/s320/screenshot.30.png" width="237" /></a></div>
Klicken Sie auf <i>Next</i> und wählen Sie Ihr Tomcat Verzeichnis aus:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-QkMq_E6kHos/URlNfnU4oOI/AAAAAAAAAUM/or9Hk0yk8yU/s1600/screenshot.31.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="259" src="http://4.bp.blogspot.com/-QkMq_E6kHos/URlNfnU4oOI/AAAAAAAAAUM/or9Hk0yk8yU/s320/screenshot.31.png" width="320" /></a></div>
Im
nächsten Schritt bietet Eclipse Ihnen an sofort ein Projekt dem Server
hinzuzufügen. Falls Sie bis hierher das Tutorial durchgearbeitet haben,
dann wird hier nichts zur Auswahl stehen:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-a6b8mouhNBI/URlPQ45y_JI/AAAAAAAAAUY/rC_RNwu61xo/s1600/screenshot.32.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="259" src="http://2.bp.blogspot.com/-a6b8mouhNBI/URlPQ45y_JI/AAAAAAAAAUY/rC_RNwu61xo/s320/screenshot.32.png" width="320" /></a></div>
Wir werden auch später diese <i>Hot-Deployment</i> Möglichkeit nicht nutzen, sondern unser Webapp Projekt über das <b>Maven Cargo Plugin</b>
per "Knopfdruck" deployen. Das ist zwar kein hot-deploy, aber ich
persönlich finde es auch gar nicht schlecht, wenn man zuerst mehrere
Dateien bearbeiten kann bevor das Projekt veröffentlicht (deployt?
deployed?) wird.<br />
Nach einem Klick auf <i>Finish </i>sollte unser Tomcat in der Servers View integriert sein:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-9PBEBl93VtE/URlR6fOg04I/AAAAAAAAAVE/1Fjw_fJdKEQ/s1600/screenshot.33.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="166" src="http://4.bp.blogspot.com/-9PBEBl93VtE/URlR6fOg04I/AAAAAAAAAVE/1Fjw_fJdKEQ/s320/screenshot.33.png" width="320" /></a></div>
Starten Sie den Tomcat Server nun per <i>Rechtsklick auf den Server</i> und dann auf <i>Start</i>:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-zlFyshu4F8o/URlTXNslNII/AAAAAAAAAVQ/rE0ZSdK11W0/s1600/screenshot.34.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-zlFyshu4F8o/URlTXNslNII/AAAAAAAAAVQ/rE0ZSdK11W0/s320/screenshot.34.png" width="261" /></a></div>
Unser Tomcat Server ist nun gestartet, allerdings wird die Tomcat Administrationsoberfläche noch nicht aufrufbar sein:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-wQdYFHqAkD4/URlT50-DB_I/AAAAAAAAAVY/AxDouk0YoUc/s1600/screenshot.35.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="199" src="http://1.bp.blogspot.com/-wQdYFHqAkD4/URlT50-DB_I/AAAAAAAAAVY/AxDouk0YoUc/s320/screenshot.35.png" width="320" /></a></div>
Stoppen
Sie den Server und machen dann einen Doppelklick auf den Tomcat Server
Eintrag. Eclipse öffnet anschließend die Konfigurationsübersicht. Wählen
Sie unter <i>Server Locations</i> den Radio Button "<i>Use Tomcat installation</i>" aus:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ixedfHhNyrE/URlVD9vHjsI/AAAAAAAAAV0/cKqSRHqxYYs/s1600/screenshot.38.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="http://4.bp.blogspot.com/-ixedfHhNyrE/URlVD9vHjsI/AAAAAAAAAV0/cKqSRHqxYYs/s320/screenshot.38.png" width="320" /></a></div>
Danach nutzt unser Tomcat das webapps Verzeichnis im lokalen Dateisystem:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-U7VpU98G_X4/URlVfxgomZI/AAAAAAAAAV8/R4z8MPBdh6w/s1600/screenshot.39.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="114" src="http://3.bp.blogspot.com/-U7VpU98G_X4/URlVfxgomZI/AAAAAAAAAV8/R4z8MPBdh6w/s320/screenshot.39.png" width="320" /></a></div>
Hier
landen alle veröffentlichten (deployten?) Webapp Projekte. Bevor wir
aber den Server erneut starten müssen wir noch einen Benutzer anlegen.
Öffnen Sie mit einem Texteditor folgende <b>tomcat-users.xml</b> Datei:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-8y1PQ9iNbp0/URlWV-aLRiI/AAAAAAAAAWU/75LD4h7HI0A/s1600/screenshot.40.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="117" src="http://3.bp.blogspot.com/-8y1PQ9iNbp0/URlWV-aLRiI/AAAAAAAAAWU/75LD4h7HI0A/s320/screenshot.40.png" width="320" /></a></div>
Konfigurieren Sie einen Benutzer mit Passwort und den folgenden Rollen:<br />
<pre class="brush:xml;"><role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user password="tomcat" roles="manager-gui,manager-script" username="tomcat"/>
</pre>
<br />
<br />
Speichern Sie die Datei und starten den Tomcat Server erneut.<br />
<br />
Rufen
Sie nochmal die Tomcat URL im Browser auf, diesmal sollte ein HTTP
Basic Auth Fenster öffnen. Geben Sie Ihre gerade angelegten
Benutzerdaten ein:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-OglqkTYLosg/URla-c-HB6I/AAAAAAAAAWw/9oNFFBQHGmY/s1600/screenshot.41.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="294" src="http://2.bp.blogspot.com/-OglqkTYLosg/URla-c-HB6I/AAAAAAAAAWw/9oNFFBQHGmY/s320/screenshot.41.png" width="320" /></a></div>
Anschließend sollte nun die Tomcat Administrationsoberfläche angezeigt werden:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-4T_rRa8I06I/URlbUlq9lxI/AAAAAAAAAW4/MMNOH9JJOQ8/s1600/screenshot.42.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="294" src="http://2.bp.blogspot.com/-4T_rRa8I06I/URlbUlq9lxI/AAAAAAAAAW4/MMNOH9JJOQ8/s320/screenshot.42.png" width="320" /></a></div>
Wir
nutzen nun die Gelegenheit, um unser WAR Projekt, welches wir am Ende
von Schritt 3 erzeugt haben, auf diesem Tomcat Server zu
veröffentlichen. Dieser manuelle Weg dient in erster Linie nur zum
Testen von WAR Dateien, während der Entwicklung ist das natürlich ein zu
aufwändiger Weg.<br />
<br />
Klicken Sie unter "<i>WAR file to deploy</i>" auf den Button "<i>Datei auswählen</i>". Im anschließend geöffneten Dialog wählen Sie die WAR Datei aus dem Projektverzeichnis (rechts):<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-vtaHzCinaAE/URldH0fheUI/AAAAAAAAAXE/eqaBxNF7QfM/s1600/screenshot.43.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="121" src="http://3.bp.blogspot.com/-vtaHzCinaAE/URldH0fheUI/AAAAAAAAAXE/eqaBxNF7QfM/s320/screenshot.43.png" width="320" /></a></div>
Klicken Sie im Anschluss auf den Button "<i>Deploy</i>". Sie sollten dann die Webapp in der Liste "<i>Applications</i>" sehen:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-LvVTlPlUQR0/URldvOe5izI/AAAAAAAAAXc/vB5PdkAaviQ/s1600/screenshot.44.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="158" src="http://1.bp.blogspot.com/-LvVTlPlUQR0/URldvOe5izI/AAAAAAAAAXc/vB5PdkAaviQ/s320/screenshot.44.png" width="320" /></a></div>
Die Webapp sollte gestartet sein und wenn Sie auf den Path Link klicken, wird sich in unserem Fall die <b>Magnolia Installation</b> öffnen, da es der erste Aufruf ist:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-j9tyy3Afvpg/URleZEMJ1CI/AAAAAAAAAXk/LmpEMG2LHkY/s1600/screenshot.45.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="233" src="http://1.bp.blogspot.com/-j9tyy3Afvpg/URleZEMJ1CI/AAAAAAAAAXk/LmpEMG2LHkY/s320/screenshot.45.png" width="320" /></a></div>
Sie sollten nun auch im Tomcat webapps Verzeichnis diese Applikation sehen:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-87L8BuZ8cOg/URle26p5NBI/AAAAAAAAAXs/1In2iP-mLC8/s1600/screenshot.46.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="114" src="http://3.bp.blogspot.com/-87L8BuZ8cOg/URle26p5NBI/AAAAAAAAAXs/1In2iP-mLC8/s320/screenshot.46.png" width="320" /></a></div>
Nach diesem ersten Teilerfolg, werden wir jetzt Maven nutzen, um das Projekt auf unserem Tomcat zu veröffentlichen.<br />
<br />
<h4>
5. Webapp mit Maven auf Server veröffentlichen</h4>
Wir benötigen das Maven Cargo Plugin, dazu müssen wir lediglich die pom.xml Datei unseres Webapp Projekts erweitern:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-1Vp9QFXVvik/URlkAsqVVGI/AAAAAAAAAYI/m5GrOSEOWLQ/s1600/screenshot.47.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="262" src="http://2.bp.blogspot.com/-1Vp9QFXVvik/URlkAsqVVGI/AAAAAAAAAYI/m5GrOSEOWLQ/s320/screenshot.47.png" width="320" /></a></div>
Hier die pom.xml als Text zwecks Copy&Paste:<br />
<pre class="brush:xml;">
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.blogspot.sw-technik</groupId>
<artifactId>myMagnoliaCmsProject</artifactId>
<version>4.5.7</version>
<packaging>war</packaging>
<properties>
<magnolia.version>${project.version}</magnolia.version>
<cargo.version>1.2.4</cargo.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>${cargo.version}</version>
<!-- Cargo Tomcat -->
<configuration>
<container>
<containerId>tomcat7x</containerId>
<type>remote</type>
</container>
<configuration>
<type>runtime</type>
<properties>
<!-- /text requires the tomcat-users.xml user/role config with manager-script -->
<cargo.tomcat.manager.url>http://localhost:8080/manager/text</cargo.tomcat.manager.url>
<cargo.remote.username>tomcat</cargo.remote.username>
<cargo.remote.password>tomcat</cargo.remote.password>
</properties>
</configuration>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-core-container-tomcat</artifactId>
<version>${cargo.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>info.magnolia</groupId>
<artifactId>magnolia-empty-webapp</artifactId>
<version>${magnolia.version}</version>
<type>war</type>
</dependency>
</dependencies>
</project>
</pre>
<br />
Jetzt benötigen wir nur noch eine Run Konfiguration, um auch wirklich per "Knopfdruck" das Projekt veröffentlichen zu können.<br />
Gehen Sie im Hauptmenü von Eclipse auf <i>Run </i>-> <i>Run Configurations...</i> und erstellen Sie eine neue <b>Maven Build</b> Konfiguration:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-OEb60E_Kvzw/URlmWNSDCXI/AAAAAAAAAYk/1EGn_4Frs-8/s1600/screenshot.48.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="164" src="http://2.bp.blogspot.com/-OEb60E_Kvzw/URlmWNSDCXI/AAAAAAAAAYk/1EGn_4Frs-8/s320/screenshot.48.png" width="320" /></a></div>
Klicken Sie nun auf Run und sehen Sie in der Console View, wie die Webapp gebaut und deployed wird.<br />
<br />
<h4>
6. Git bare repository erstellen</h4>
Ein Git bare repository ist ein
spezielles Repository, welches üblicherweise auf einem zentralen Server
eingerichtet wird. Ein Git bare repository kann man nicht als Working
Copy nutzen, also nicht als Entwicklungsprojekt einrichten. Der Sinn
eines bare repository ist, dass man ein zentrales Repository für alle
Entwickler hat. Jeder Entwickler klont dieses bare repository und pusht
die Änderungen wieder zurück. Somit hält das bare repository den
aktuellen Projektstand und kann für Deployments verwendet werden.<br />
<br />
In
zentralen Versionskontrollsystemen wie Subversion ist der Workflow sehr
ähnlich. Der Vorteil von verteilten Versionskontrollsystemen wie Git
oder Mercurial ist, dass so ein zentrales Repository optional und sehr
leicht einzurichten ist. Und das machen wir jetzt!<br />
<br />
Melden Sie sich per SSH auf Ihrem Linux Server an und öffnen Sie die Kommandozeile. Installieren Sie erstmal Git:<br />
<pre class="brush:plain;">apt-get install git
</pre>
<br />
Nach erfolgreicher Installation geben Sie folgende Befehle ein:
<br />
<pre class="brush:plain;">mkdir /var/www/parentproject
cd /var/www/parentproject
git --bare init
</pre>
<br />
Prüfen Sie, ob das Repository erstellt wurde. Es sollte folgende Struktur haben:
<br />
<pre class="brush:plain;">root@debianVM:/var/www/repository/parentproject# ls
branches config description HEAD hooks info objects refs
</pre>
<br />
Als Vorbereitung für die Nutzung von Gitweb müssen wir noch einen URL Alias in den VHost von Apache eintragen:
<br />
<pre class="brush:plain;">Alias /parentproject "/var/www/repository/parentproject"
</pre>
<br />
Anschließend einfach noch folgende Befehle auf der Konsole nacheinander ausführen:
<br />
<pre class="brush:plain;">git update-server-info
cd hooks
mv post-update.sample post-update
/etc/init.d/apache2 restart
</pre>
<br />
Somit ist auf der Server-Side alles für ein zentrales Git bare repository eingerichtet. Jetzt werden wir dieses <b>parentproject</b> Repositoryper Eclipse EGit klonen, um damit arbeiten zu können.<br />
<br />
Klicken Sie in der <i>Git Repositories</i> View auf den Link "Clone a Git repository":<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-3e9B7hDnAfU/URlxAt7FFuI/AAAAAAAAAZA/u0gzg1LfKCc/s1600/screenshot.51.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="http://1.bp.blogspot.com/-3e9B7hDnAfU/URlxAt7FFuI/AAAAAAAAAZA/u0gzg1LfKCc/s320/screenshot.51.png" width="320" /></a></div>
Füllen Sie die Felder mit den passenden Daten aus:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-quzW7hKKr44/URlyb-TSjII/AAAAAAAAAZI/bpUxOXzRgic/s1600/screenshot.52.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-quzW7hKKr44/URlyb-TSjII/AAAAAAAAAZI/bpUxOXzRgic/s320/screenshot.52.png" width="315" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-VMsCT0FaJQI/URly5ThnlNI/AAAAAAAAAZQ/xx8Ed3s6bXo/s1600/screenshot.53.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-VMsCT0FaJQI/URly5ThnlNI/AAAAAAAAAZQ/xx8Ed3s6bXo/s320/screenshot.53.png" width="315" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-a9tc9l9bFrQ/URly_g5OmnI/AAAAAAAAAZY/Eba111KMrkg/s1600/screenshot.54.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/-a9tc9l9bFrQ/URly_g5OmnI/AAAAAAAAAZY/Eba111KMrkg/s320/screenshot.54.png" width="315" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-lAMtf0ubmGU/URlzTXEtWpI/AAAAAAAAAZg/A8DhR8v1xPI/s1600/screenshot.55.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="http://1.bp.blogspot.com/-lAMtf0ubmGU/URlzTXEtWpI/AAAAAAAAAZg/A8DhR8v1xPI/s320/screenshot.55.png" width="320" /></a></div>
Sie
sehen, dass das Repository noch keinen master Branch hat und
dementsprechend auch noch keinen HEAD hat. Dies werden wir nun ändern.<br />
<br />
<h4>
7. Eclipse Projekt unter Git Versionskontrolle stellen</h4>
Wir fügen nun das Eclipse <b>parentproject</b> dem Git Repository <b>parentproject</b> hinzu und damit unter Versionskontrolle.<br />
Gehen Sie folgendermaßen vor: Rechtsklick auf das Projekt -> <i>Team</i> -> <i>Share Project... </i><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-TB9_IYQ0OUk/URl2T5x2jbI/AAAAAAAAAZ8/_bFK0dY_b0Q/s1600/screenshot.56.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="263" src="http://3.bp.blogspot.com/-TB9_IYQ0OUk/URl2T5x2jbI/AAAAAAAAAZ8/_bFK0dY_b0Q/s320/screenshot.56.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-yrILEuGVl-s/URl2auyWi0I/AAAAAAAAAaE/BhihQyJSE8E/s1600/screenshot.57.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="202" src="http://1.bp.blogspot.com/-yrILEuGVl-s/URl2auyWi0I/AAAAAAAAAaE/BhihQyJSE8E/s320/screenshot.57.png" width="320" /></a></div>
Nach einem Klick auf Finish sollte das parentproject mit gelben Säulen markiert sein:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/--WZaM0ZCMa8/URl2roi_Y2I/AAAAAAAAAaM/LLEqFPQT70k/s1600/screenshot.58.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="277" src="http://3.bp.blogspot.com/--WZaM0ZCMa8/URl2roi_Y2I/AAAAAAAAAaM/LLEqFPQT70k/s320/screenshot.58.png" width="320" /></a></div>
Nun machen wir unseren ersten Git commit. Klicken Sie wieder per Rechtsklick auf das Projekt -> <i>Team</i> -> <i>Commit</i>:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/--3QNXmE7BE8/URl3vWl7W7I/AAAAAAAAAaY/_twrmHU8rA4/s1600/screenshot.59.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/--3QNXmE7BE8/URl3vWl7W7I/AAAAAAAAAaY/_twrmHU8rA4/s320/screenshot.59.png" width="294" /></a></div>
Sobald
der Commit durchgeführt wurde können wir die Änderungen auch pushen,
d.h. in unser zentrales Git bare repository einspielen.<br />
Dazu gehen wir wie folgt vor: Rechtsklick Projekt -> <i>Team </i>-> <i>Push to Upstream</i><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-xuTFsWJbpss/URl4xwkbZGI/AAAAAAAAAak/-JCevvKkzYo/s1600/screenshot.61.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="219" src="http://1.bp.blogspot.com/-xuTFsWJbpss/URl4xwkbZGI/AAAAAAAAAak/-JCevvKkzYo/s320/screenshot.61.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-yDawbV69maM/URl5J8_GoLI/AAAAAAAAAas/6CeDL0QnKtM/s1600/screenshot.62.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="193" src="http://4.bp.blogspot.com/-yDawbV69maM/URl5J8_GoLI/AAAAAAAAAas/6CeDL0QnKtM/s320/screenshot.62.png" width="320" /></a></div>
Jetzt sehen wir auch, dass wir den master Branch "<i>ausgecheckt</i>" (checkout) haben. Das Häkchen markiert den aktuell ausgecheckten Branch.<br />
<br />
Wir
sollten nun der besseren Entwicklung wegen auch das Webapp Projekt
unter Versionskontrolle stellen. Das machen wie wie zuvor mit dem
parentproject:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-VGnhDr6tlZo/URl6H5rsjpI/AAAAAAAAAbM/-uzRaW9FDPs/s1600/screenshot.63.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="172" src="http://4.bp.blogspot.com/-VGnhDr6tlZo/URl6H5rsjpI/AAAAAAAAAbM/-uzRaW9FDPs/s320/screenshot.63.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-hda8eJfYwi0/URl6M0XQz4I/AAAAAAAAAbU/OhBcWBTRVPc/s1600/screenshot.64.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="282" src="http://2.bp.blogspot.com/-hda8eJfYwi0/URl6M0XQz4I/AAAAAAAAAbU/OhBcWBTRVPc/s320/screenshot.64.png" width="320" /></a></div>
Diesmal müssen wir keinen Commit mehr durchführen, da die Dateien des Webapp Projekts im <b>parentproject</b> Verzeichnis liegen und dies ist ja bereits versioniert.<br />
<br />
Leider haben wir einen kleinen Fehler gemacht...<br />
<br />
Das
kommt hin und wieder auch mal vor, das sollte Sie nicht beunruhigen.
Unser Fehler war, dass das target Verzeichnis unter Versionskontrolle
von Git steht. Das target Verzeichnis enthält ausschließlich temporär
generierte Dateien und Verzeichnisse und diese werden bei jedem Build
geändert.<br />
<br />
Als kleine Übung im Umgang mit Git überlasse
ich die Behebung dieses Fehlers ihnen. Als Hinweis: Sie müssen das
target Verzeichnis aus dem Git Index entfernen und anschließend per
.gitignore Datei aus der Versionierung ausschließen.<br />
<br />
<h2>
Zusammenfassung</h2>
Herzlichen Glückwunsch an dieser Stelle, wenn Sie
das Tutorial erfolgreich durchgearbeitet haben. Sie haben nun eine sehr
gute Infrastruktur zur Entwicklung unter produktiven Bedingungen durch
die Hilfe einer virtuellen Maschine für die Server-Side Installationen.<br />
<br />
Sie
haben mit Apache Archiva einen Repository Manager mit dem Sie zentral
die notwendigen remote Repositories verwalten können und auch JAR
Artefakte direkt hochladen können, z.B. wenn es in keinem öffentlichen
remote Repository existiert.<br />
<br />
Mit dem Maven Cargo Plugin
können Sie nicht nur auf einem lokalen Tomcat (oder auch anderen
Servern) Ihr Projekt auf einfache Weise veröffentlichen, sondern auch
auf einem beliebigen entfernten Server. Sie müssen dazu lediglich die
Server Daten in der pom.xml anpassen und natürlich sicherstellen, dass
der Server auch entsprechend konfiguriert ist.<br />
<br />
Und zu
guter letzt haben wir mit Git sowohl auf Client Seite mit Eclipse und
EGit, als auch auf der Server-Side mit einem Git bare repository eine
solide Versionskontrolle aufgesetzt.<br />
<br />
Diese
Infrastruktur hat aus meiner Sicht in dieser Form nur einen einzigen
Nachteil. Man hat noch kein Berechtigungssystem für die Git
Repositories. Jeder der das Repository klonen kann hat auch alle Rechte
auf dem Projekt. Das kann manchmal nicht gewünscht sein. <br />
<br />
<h2>
Weitere Schritte</h2>
<br />
Git hat von Haus aus keine Zugriffskontrolle. In einem Unternehmen kann
es aber notwendig werden bestimmten Entwicklern, z.B. Freelancer,
eingeschränkten Zugriff auf bestimmte Projekte zu geben. Für diesen Fall
gibt es <a href="http://git-scm.com/book/en/Git-on-the-Server-Gitolite" target="_blank">Gitolite</a> oder noch besser <a href="http://code.google.com/p/gerrit/" target="_blank">Gerrit</a>. Letzteres ist eigentlich kein reines ACL System für Git, sondern ein komplettes Review System. Allerdings bringt Gerrit ein ACL System von Haus aus mit und lässt sich über eine Web GUI auch recht nutzerfreundlich konfigurieren. Ich würde jedem sofort zu Gerrit statt Gitolite raten, auch wenn man erstmal kein Review System benötigt. Gerrit kann man auch an ein Active Directory anbinden, somit steht einer sauberen Integration in eine Enterprise Infrastruktur nichts mehr im Weg.<br />
<br />
<br />Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-6086851661951052231.post-45274249572895500262013-01-27T14:57:00.001+01:002013-10-03T14:13:19.028+02:00K2.2 - Professionelle Entwicklung mit Git und Maven unter Eclipse und mit Apache Archiva<h2>
Einleitung</h2>
<br />
Wir richten ein zentrales Git Repository, sowie eine Maven Repository Management Software zur Verwaltung eines zentralen Repository bzw. als Proxy zwischen allgemeinen Maven remote repositories.<br />
Anschließend werden wir die Client Installationen von Git und Maven angehen. <br />
<br />
Der aufmerksame Leser wird sich vielleicht 2 Dinge fragen:<br />
<ol>
<li>Git ist ein verteiltes Versionskontrollsystem, warum und wozu also ein zentrales Repository?</li>
<li>Wozu ein Maven Repository Manager?</li>
</ol>
Man benötigt letztlich beides nicht, um mit Git oder Maven zu arbeiten. Es wird jedoch ab einer Teamgröße von 2 Entwicklern schon schwierig ohne einem zentralen Git Repository, wo beide Entwickler ihre Änderungen pushen können. Ein zentrales bzw. öffentliches Repository nennt man in Git ein Bare Repository.<br />
In einem Unternehmen macht es durchaus Sinn ein Bare Repository einzurichten, da es die gemeinsame Entwicklung, das Release Management und auch Deployments vereinfachen kann.<br />
Ein Grund für ein Bare Repository in einem Projekt an dem man alleine arbeitet ist die Backup Funktionalität eines Git Bare Repository.<br />
In diesem <a href="http://git-scm.com/book/ch4-6.html" target="_blank">Blog Post</a> (englisch) wird kurz und knapp erklärt, welche Möglichkeiten man mit Git repositories hat.<br />
<br />
Ein Maven Repository Manager wie z.B. <a href="http://archiva.apache.org/" rel="nofollow" target="_blank">Apache Archiva</a> oder <a href="http://www.sonatype.org/nexus/" rel="nofollow" target="_blank">Sonatype Nexus</a>, hat ebenso Vorteile ab einer Teamstärke die größer ist als zwei, aber vorallem im Unternehmen hat man eine saubere Repository Verwaltung, die als Proxy für remote repositories dient.<br />
<br />
Daher ist der erste Teil dieses Artikels eher für IT Verantwortliche relevant, z.B. Qualitäts- oder Releasemanager. Der zweite Teil ist auf jeden Fall für alle Entwickler wichtig, die mit Git oder Maven arbeiten wollen.<br />
<br />
<h2>
Motivation</h2>
<br />
Mir geht es in diesem Artikel darum zu zeigen, wie eine Infrastruktur im Unternehmensumfeld aufgesetzt werden kann, die sich an den Bedürfnissen eines Entwickler Teams orientiert und auch in Prozesse wie Qualitätssicherung und Releasemanagement sauber integrieren lässt.<br />
<br />
Es gibt neben Git natürlich noch einige andere Versionskontrollsysteme, die auch in der Praxis etabliert sind. Ich persönlich habe ca. 3 Jahre mit Subversion gearbeitet, einige Monate mit dem alten CVS und zu Beginn meiner IT Karriere sogar ganz ohne Versionskontrolle, und das leider in einem Team aus 2-3 Entwicklern.<br />
<br />
Mittlerweile bin ich aber voll von Git überzeugt und kann auch niemandem mehr empfehlen ein anderes VCS einzusetzen. Ich hatte durchaus meine Bedenken und Schwierigkeiten, während der Übergangsphase von SVN auf Git. Ich hatte mich gefragt, warum Git in der Presse und in den Foren so populär geworden ist. Die Vergleiche mit SVN waren stets unglaublich gut für Git ausgefallen und als ich das <a href="http://www.youtube.com/watch?v=4XpnKHJAok8" target="_blank">Video von Git Erfinder Linus Torvalds</a> gesehen hatte, musste ich Git unbedingt testen. Es gibt letztlich nur 2 Kleinigkeiten, die ich etwas umständlich bei Git finde, und zwar rekursive Pulls, wenn man mit Submodules arbeitet, sowie die fehlende Unterstützung von Authorisierung und Authentifikation out-of-the-box, wie es z.B. SVN hat.<br />
<br />
Im Bereich Build Management gibt es ebenfalls einige mehr Tools als Ant oder Maven. Meine Kenntnisse mit Apache Ant sind nicht besonders tief, aber ich würde auch hier niemandem mehr empfehlen mit Ant ein Projekt zu starten. Es ist zwar eine gewisse Einarbeitungszeit in Maven notwendig, und der Prozess des Umdenkens ist ähnlich aufwendig, wie von SVN zu Git, aber man wird sich schon nach kurzer Zeit fragen, warum man nicht schon früher umgestiegen ist. Zumindest ging das mir so vor nicht allzu langer Zeit.<br />
<br />
Ein wichtiger Punkt ist natürlich die Rolle beider Technologien im Enterprise Umfeld. Ich kenne kaum ein Unternehmen, dass nicht den Umstieg auf beide Tools vollziehen möchte oder bereits getan hat. Auch in Stellenausschreibungen haben Git und Maven seit einiger Zeit schon mehr Präsenz als SVN und Ant.<br />
<br />
<br />
<h2>
Voraussetzungen</h2>
Wir benötigen diverse Software, die wir entsprechend konfigurieren werden, um eine professionelle Infrastruktur mit Eclipse, Git und Maven aufzubauen.<br />
<br />
<h3>
Server-Side (Linux Debian)</h3>
<ul>
<li><a href="http://sw-technik.blogspot.de/2013/01/k21-workstation-pc-mit-der-virtualbox.html" target="_blank">Virtuelle Maschine mit Linux Debian</a></li>
<li>APT - Paketmanager unter Debian Systemen zur einfachen Installation von Software unter Linux</li>
</ul>
<br />
<h3>
Workstation PC (Windows 7)</h3>
<ul>
<li><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank">JDK</a></li>
<li><a href="http://maven.apache.org/download.cgi" target="_blank">Apache Maven 3 </a></li>
<li><a href="http://www.eclipse.org/downloads/" target="_blank">Eclipse</a></li>
<li><a href="http://eclipse.org/m2e/download/" target="_blank">m2eclipse</a></li>
<li><a href="http://www.eclipse.org/egit/" target="_blank">EGit </a></li>
<li><a href="http://www.putty.org/" rel="nofollow" target="_blank">PuTTY</a> (optional, man kann auch das Terminal von VirtualBox nutzen, was allerdings nicht so komfortabel ist wie PuTTY)</li>
<li><a href="http://winscp.net/eng/download.php" target="_blank">WinSCP</a> (optional, WinSCP ist ein SSH File Browser) </li>
</ul>
<br />
<h2>
Umsetzung</h2>
<h3>
Kurzübersicht aller Schritte</h3>
<ol>
<li>WinSCP herunterladen, installieren und konfigurieren (~15min)</li>
<li>Server-Side Installationen durchführen, z.B. JDK und Apache Archiva (~30min)</li>
<li>JDK für Windows herunterladen und installieren (ohne Anleitung)</li>
<li>Apache Maven herunterladen und installieren (~15min)</li>
<li>Eclipse herunterladen und installieren (ohne Anleitung)</li>
<li>Eclipse Plugins EGit) und m2eclipse installieren (~15min)</li>
</ol>
<h4>
1. WinSCP mit PuTTY</h4>
Bitte WinSCP herunterladen und installieren. Wer PuTTY aus WinSCP heraus öffnen möchte muss auch PuTTY herunterladen. Eine Installation ist bei PuTTY nicht notwendig, einfach die EXE in einem Verzeichnis ablegen.<br />
<br />
Starten Sie WinSCP und geben Sie die Verbindungsdaten des Servers ein:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-_ZLY3yTbio8/UP8R7LL76MI/AAAAAAAAAKI/Pqc3KpMM1oQ/s1600/WinSCP-New-Session-Config.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="285" src="http://3.bp.blogspot.com/-_ZLY3yTbio8/UP8R7LL76MI/AAAAAAAAAKI/Pqc3KpMM1oQ/s400/WinSCP-New-Session-Config.png" width="400" /></a></div>
<span id="goog_1727662717"></span><span id="goog_1727662718"></span><br />
<span id="goog_1727662717">Klicken Sie auf <span style="font-family: "Courier New",Courier,monospace;">Save...</span> um die Verbindung für den späteren Schnellzugriff zu speichern oder klicken Sie direkt auf <span style="font-family: "Courier New",Courier,monospace;">Login</span>. Anschließend sind Sie im Benutzerverzeichnis von root:</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-L-_wD9i_yqQ/UP8ULc5O_aI/AAAAAAAAAKo/hVs8KXHtJII/s1600/WinSCP-Connected.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="170" src="http://1.bp.blogspot.com/-L-_wD9i_yqQ/UP8ULc5O_aI/AAAAAAAAAKo/hVs8KXHtJII/s400/WinSCP-Connected.png" width="400" /></a></div>
<br />
<span id="goog_1727662717">Jetzt konfigurieren wir PuTTY, um per Button direkt eine Konsole öffnen zu können. Der PuTTY Button ist der 8. von links (2 Monitore).</span><br />
<span id="goog_1727662717">Klicken Sie im Menü auf "<span style="font-family: "Courier New",Courier,monospace;">Options -> Preferences...</span>" oder per Shortcut <span style="font-family: "Courier New",Courier,monospace;">Strg + Alt + P</span> und anschließend auf <span style="font-family: "Courier New",Courier,monospace;">Applications</span>:</span><br />
<span id="goog_1727662717"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-B1kh1q2asEM/UP8UJolZ6gI/AAAAAAAAAKc/tNlCQFJtQDU/s1600/WinSCP-PuTTY-Integration.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="332" src="http://1.bp.blogspot.com/-B1kh1q2asEM/UP8UJolZ6gI/AAAAAAAAAKc/tNlCQFJtQDU/s400/WinSCP-PuTTY-Integration.png" width="400" /></a></div>
<span id="goog_1727662717"><br /></span>
<span id="goog_1727662717">Tragen Sie den Pfad zu Ihrer PuTTY EXE ein und bestätigen <span style="font-family: "Courier New",Courier,monospace;">OK</span>.</span><br />
<br />
Wer möchte kann noch einen Texteditor konfigurieren mit dem Dateien aus WinSCP geöffnet werden:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-DEk1nLfHgTk/UP8UKylBTnI/AAAAAAAAAKk/O9j3TFeC5zE/s1600/WinSCP-Texteditor-Integration.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="330" src="http://2.bp.blogspot.com/-DEk1nLfHgTk/UP8UKylBTnI/AAAAAAAAAKk/O9j3TFeC5zE/s400/WinSCP-Texteditor-Integration.png" width="400" /></a></div>
<br />
<h4>
2. Server-Side Installationen</h4>
<br />
<h3>
Installation JDK 7</h3>
<br />
Unter Linux Debian ist der APT Paketmanager Standard. Leider gibt zum Zeitpunkt als ich diesen Artikel geschrieben habe keine Möglichkeit mehr die Java SE Version 7 per <span style="font-family: "Courier New",Courier,monospace;">apt</span> zu installieren, da <a href="http://www.heise.de/open/meldung/Debian-und-Ubuntu-schmeissen-Oracle-Java-raus-1397718.html" target="_blank">Oracle die Lizenz aufgekündigt</a> hatte.<br />
<br />
Mit folgendem Kommando kann man unter Linux Debian die verfügbaren Java Versionen wechseln:<br />
<pre class="brush:plain;">update-alternatives --config java
</pre>
Mit diesem Kommando kann man die aktuell aktive Java Version ermitteln:<br />
<pre class="brush:plain;">java -version
</pre>
Beginnen wir mit dem Herunterladen des JDK Installationspakets. Sie finden die passende Variante (32bit, 64bit) auf der <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank">Oracle Website</a>.<br />
<br />
Sie müssen das Paket leider ohne <span style="font-family: "Courier New",Courier,monospace;">wget</span> herunterladen, da Oracle eine Bestätigung per Radiobutton vor dem Download benötigt. Nach dem Download können Sie mit WinSCP die Datei auf die virtuelle Maschine laden und zwar nach <span style="font-family: "Courier New",Courier,monospace;">/usr/src</span>.<br />
<br />
Entpacken Sie das Java Paket:<br />
<pre class="brush:plain;">tar -xzvf jdk-7u11-linux-i586.tar.gz
</pre>
Anschließend verschieben Sie das entpackte Verzeichnis:<br />
<pre class="brush:plain;">mkdir /usr/lib/jvm
mv /usr/src/jdk1.7.0_11 /usr/lib/jvm/
ln -s /usr/lib/jvm/jdk1.7.0_11/ /usr/lib/jvm/java-7-oracle
</pre>
Das Erzeugen des symbolischen Links vereinfacht die Verwlatung der Java Installationen und spätere Updates auf neue Versionen.<br />
Anschließend aktivieren wir die Java Version auf dem System: <br />
<pre class="brush:plain;">update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/java-7-oracle/bin/java" 1
</pre>
Mit java -version sollten Sie nun die neue Java Version angezeigt bekommen:<br />
<pre class="brush:plain;">java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) Client VM (build 23.6-b04, mixed mode)
</pre>
Einige Java Anwendungen setzen die Umgebungsvariable <span style="font-family: "Courier New",Courier,monospace;">JAVA_HOME</span> voraus. Diese setzen wir mit folgenden Befehlen:<br />
<pre class="brush:plain;">nano /etc/profile</pre>
Geben Sie die folgenden 2 Zeilen an das Ende der Datei ein:
<br />
<pre class="brush:plain;">JAVA_HOME="/usr/lib/jvm/java-7-oracle"
export JAVA_HOME
</pre>
Speichern Sie die Datei mit Strg+O und verlassen Sie den nano Editor mit Strg+X. Anschließend aktivieren Sie noch diese Änderung und testen die Ausgabe der Umgebungsvariable:
<br />
<pre class="brush:plain;">source /etc/profile
echo $JAVA_HOME
</pre>
<br />
<h3>
Installation Apache Archiva</h3>
<b>Hinweis vom 06.06.2013:</b><br />
<br />
<i>Mittlerweile gibt es Archiva in Version 1.4 und diese Anleitung basiert noch auf der Version 1.3.5. Die Schritte haben sich nicht geändert, aber die Screenshots sind nun veraltet, da Archiva auch ein etwas anderes Design bekommen hat.</i><br />
<br />
Laden Sie das Installationspaket von Apache Archiva herunter, diesmal mit <span style="font-family: "Courier New",Courier,monospace;">wget</span>:<br />
<pre class="brush:plain;">cd /usr/src </pre>
<pre class="brush:plain;">wget http://mirror.derwebwolf.net/apache/archiva/[VERSION]/binaries/apache-archiva-[VERSION]-bin.tar.gz</pre>
Entpacken Sie die Datei:<br />
<pre class="brush:plain;">tar -xvzf apache-archiva-[VERSION]-bin.tar.gz</pre>
Ändern Sie am besten den Standard Port :8080 auf :8098 oder einen anderen Port Ihrer Wahl. Diese Konfiguration können Sie in der Datei <span style="font-family: "Courier New",Courier,monospace;">/usr/src/apache-archiva-[VERSION]/conf/jetty.xml</span> in folgender Zeile vornehmen:<br />
<pre class="brush:plain;"><Set name="port"><SystemProperty name="jetty.port" default="<b>8098</b>"/></Set></pre>
Starten Sie Apache Archiva:<br />
<pre class="brush:plain;">/usr/src/apache-archiva-[VERSION]/bin/archiva start</pre>
Nach ein paar Sekunden ist Archiva gestartet und Sie erreichen Archiva unter folgender URL:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Gsp_M37Bwr8/UQRIa7nprBI/AAAAAAAAALA/x7JlRjtqcB4/s1600/Apache-Archiva-Welcome.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="182" src="http://1.bp.blogspot.com/-Gsp_M37Bwr8/UQRIa7nprBI/AAAAAAAAALA/x7JlRjtqcB4/s400/Apache-Archiva-Welcome.png" width="400" /></a></div>
Nun füllen Sie die Pflichtfelder aus und klicken auf den Button "Administrator anlegen". Danach werden Sie auf folgende Seite weitergeleitet:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-BMK4lTUa1os/UQRKpACuyHI/AAAAAAAAALU/1lU1MqcAArY/s1600/Apache-Archiva-Admin-Screen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="387" src="http://1.bp.blogspot.com/-BMK4lTUa1os/UQRKpACuyHI/AAAAAAAAALU/1lU1MqcAArY/s400/Apache-Archiva-Admin-Screen.png" width="400" /></a></div>
<br />
Sie haben damit nun einen Repository Manager für Maven Projekte. Diesen richten wir noch als Proxy repository auf dem Workstation PC ein, um eine einheitliche Verwaltung der Artefakte über alle Entwickler Workstation PCs zu gewährleisten, z.B. muss ein Artefakt nur einmal aus dem Internet heruntergeladen werden, da Apache Archiva das zentrale Repository für alle Workstation PCs ist.<br />
<br />
Hier ein <a href="http://docs.codehaus.org/display/MAVENUSER/Maven+Repository+Manager+Feature+Matrix" target="_blank">Vergleich von Repository Management Tools</a>.<br />
<br />
<h4>
4. Installation Apache Maven 3</h4>
<br />
Laden Sie ein Binary Paket von der <a href="http://maven.apache.org/download.cgi" target="_blank">offiziellen Apache Maven Homepage</a> herunter. Entpacken Sie das Paket in ein Verzeichnis Ihrer Wahl - eine Installation ist unter Windows nicht notwendig. Das Ergebnis sieht so aus:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-YkuTBvZzR1M/UQUOJlGIi8I/AAAAAAAAALw/hkUSOmtBROA/s1600/Binary-package-Maven-unpacked.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="227" src="http://2.bp.blogspot.com/-YkuTBvZzR1M/UQUOJlGIi8I/AAAAAAAAALw/hkUSOmtBROA/s400/Binary-package-Maven-unpacked.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
Als nächstes sollten wir sicherstellen, dass das Java Development Kit (JDK) richtig installiert ist. Wir haben zuvor bereits auf der Server-Side das JDK eingerichtet inklusive JAVA_HOME Umgebungsvariable, und nun müssen wir das selbe auf der Client-Side/Workstation konfgurieren. In meinem Fall ist das eine Windows 7 Umgebung.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Mvd3csFoU4I/UQUQhIrxkfI/AAAAAAAAAMI/mwdE9la1_0I/s1600/Windows-Env-Java-Home.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://4.bp.blogspot.com/-Mvd3csFoU4I/UQUQhIrxkfI/AAAAAAAAAMI/mwdE9la1_0I/s400/Windows-Env-Java-Home.png" width="361" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-zizhauYhqCE/UQUQi9tFU_I/AAAAAAAAAMQ/-fwAMTFIQ5E/s1600/Windows-Env-Path.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://4.bp.blogspot.com/-zizhauYhqCE/UQUQi9tFU_I/AAAAAAAAAMQ/-fwAMTFIQ5E/s400/Windows-Env-Path.png" width="361" /></a></div>
<br />
Für Maven 3 muss man wie auch für Maven 2 eine Umgebungsvariable <b><span style="font-family: "Courier New",Courier,monospace;">MAVEN_HOME</span></b> (kann auch umbenannt werden) einrichten:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-M8a_fAcxoxk/UQUWUDjO9vI/AAAAAAAAANk/fsNdJU5c-5A/s1600/Maven3-New-Env-Var.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="168" src="http://3.bp.blogspot.com/-M8a_fAcxoxk/UQUWUDjO9vI/AAAAAAAAANk/fsNdJU5c-5A/s400/Maven3-New-Env-Var.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-coHVWK9GAJk/UQUWSk1LcmI/AAAAAAAAANY/rRyziy8aT8g/s1600/Maven3-Home-Env-Var.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://4.bp.blogspot.com/-coHVWK9GAJk/UQUWSk1LcmI/AAAAAAAAANY/rRyziy8aT8g/s400/Maven3-Home-Env-Var.png" width="361" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-iumcFvz4rLk/UQUWUdXkqFI/AAAAAAAAANg/R5vgo_2Heo4/s1600/Maven3-Path-Env.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://2.bp.blogspot.com/-iumcFvz4rLk/UQUWUdXkqFI/AAAAAAAAANg/R5vgo_2Heo4/s400/Maven3-Path-Env.png" width="361" /></a></div>
<br />
Nun sollten Sie noch testen, ob die Maven Konfiguration auf Ihrem System erkannt wird. Dazu öffnen Sie die Kommandozeile von Windows und geben <span style="font-family: "Courier New",Courier,monospace;">mvn -v</span> ein. Dann sollte die Ausgabe ungefähr so aussehen:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-zMqgluAyH8I/UQUXtK10kpI/AAAAAAAAAOA/1k5BQnjmWL8/s1600/Windows-Maven-Command.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="201" src="http://2.bp.blogspot.com/-zMqgluAyH8I/UQUXtK10kpI/AAAAAAAAAOA/1k5BQnjmWL8/s400/Windows-Maven-Command.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
Jetzt haben Sie Maven 3 korrekt "installiert".<br />
<br />
Falls Sie bereits Apache Archiva aufgesetzt haben können Sie es jetzt in der Maven Konfiguration als zentrales/globales Repository eintragen. Dazu öffnen Sie die Datei <b>.m2/settings.xml</b> in Ihrem Benutzerverzeichnis, z.B. unter<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-GVO00OpUgK0/UQUlSCZL1vI/AAAAAAAAAPw/f0idF6DOJGo/s1600/Maven-M2-SettingsXml.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-GVO00OpUgK0/UQUlSCZL1vI/AAAAAAAAAPw/f0idF6DOJGo/s1600/Maven-M2-SettingsXml.png" /></a></div>
<br />
Konfigurieren Sie Ihren Archiva Server als Mirror in der settings.xml, z.B.<br />
<pre class="brush:xml;"><mirrors>
<mirror>
<id>internal-blogger</id>
<mirrorof>*</mirrorof>
<name>Internal Apache Archiva</name>
<url>http://192.168.0.111:8098/archiva/repository/internal</url>
</mirror>
</mirrors></pre>
Wir werden dieses Repository später in Eclipse unter <i>Global Repositories</i> wiedersehen. Doch erstmal müssen wir die dafür notwendigen Eclipse Plugins installieren.<br />
<br />
<h4>
<b>6. Installation EGit und m2eclipse</b></h4>
<br />
<span style="font-family: inherit;">Hier die URLs zur Installation in Eclipse über <span style="font-family: "Courier New",Courier,monospace;">Help -> Install new software...</span></span><span style="font-family: "Courier New",Courier,monospace;"> </span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">http://download.eclipse.org/egit/updates</span><br />
<span style="font-family: "Courier New",Courier,monospace;">http://download.eclipse.org/technology/m2e/releases</span><br />
<br />
Wählen Sie folgende Komponenten aus:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-FO2ONBF-JrQ/UQUbb3fy7aI/AAAAAAAAAOg/QR5lM7XArOU/s1600/Eclipse-M2E-Plugin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://1.bp.blogspot.com/-FO2ONBF-JrQ/UQUbb3fy7aI/AAAAAAAAAOg/QR5lM7XArOU/s400/Eclipse-M2E-Plugin.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/--zjlw4NJsjs/UQUbamkdqjI/AAAAAAAAAOY/_gbjaArdz9E/s1600/Eclipse-EGit-Plugin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="245" src="http://1.bp.blogspot.com/--zjlw4NJsjs/UQUbamkdqjI/AAAAAAAAAOY/_gbjaArdz9E/s400/Eclipse-EGit-Plugin.png" width="400" /></a></div>
<br />
Klicken Sie sich durch und bestätigen Sie die Lizenzbestimmungen. Sie werden nach der ersten Installation von Eclipse gefragt, ob Sie den notwendigen Neustart durchführen möchten. Antworten Sie mit Nein und installieren das zweite Plugin. Danach können Sie Eclipse neustarten lassen.<br />
<br />
Nach dem Neustart haben Sie neue Perspektiven und Sichten in Eclipse zur Verfügung. Hier die neuen Sichte, die Sie über <span style="font-family: "Courier New",Courier,monospace;">Window -> Show View - Other...</span> erreichen:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-09AOda4AryU/UQUfzKtIypI/AAAAAAAAAO4/qCM8kbE_BkI/s1600/Eclipse-EGit-Maven-Views.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://4.bp.blogspot.com/-09AOda4AryU/UQUfzKtIypI/AAAAAAAAAO4/qCM8kbE_BkI/s400/Eclipse-EGit-Maven-Views.png" width="220" /></a></div>
Ich zeige hier beispielhaft die Java <i>Perspective</i> (angezeigt durch das Icon oben rechts) mit der neuen <i>View</i> <b>Maven Repositories</b>:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-IXrbdDtC-AY/UQUjZHi8u4I/AAAAAAAAAPY/uFPHmNR7p-Q/s1600/Eclipse-Maven-Repositories-View.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="http://2.bp.blogspot.com/-IXrbdDtC-AY/UQUjZHi8u4I/AAAAAAAAAPY/uFPHmNR7p-Q/s400/Eclipse-Maven-Repositories-View.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
Sie sehen, dass das Plugin unter Local Repositories das Verzeichnis <b>.m2/repository</b> erkannt hat. Maven erwartet und erstellt das <b>.m2 Verzeichnis</b> im aktuellen <i>Benutzerverzeichnis</i>. Der Pfad kann also bei Ihrer Installation etwas anders aussehen.<br />
<br />
Ebenso sieht man unter Global Repositories einen internal Eintrag, der das Apache Archiva Repository konfiguriert hat. Diese Einstellung kommt durch die <span style="font-family: "Courier New",Courier,monospace;">mirror</span> Konfiguration in der <i>settings.xml</i> unter <b>.m2/settings.xml</b>, die Sie am Ende der Maven Installation evtl. durchgeführt haben.<br />
<br />
Übrigens...<br />
da wir Git auf der Workstation nur über die IDE (hier Eclipse) anwenden und keinen Bedarf an der Benutzung über die Konsole haben, müssen wir Git nicht direkt installieren. Das Eclipse Plugin reicht in diesem Fall völlig aus.<br />
<br />
<h2>
Zusammenfassung</h2>
<br />
Sie haben nun eine Worksation für die Entwicklung von Java Projekten mit Git, Maven und Eclipse. Die Plugins EGit und m2eclipse sind aktuell die besten Plugins für Git und Maven unter Eclipse.<br />
<br />
Auf der Server-Side läuft ein Apache Archiva als Proxy Repository. Dieses ermöglicht eine professionellere Organisation von abhängigen Bibliotheken in der Java Entwicklung. Insbesondere für IT Verantwortliche aus den Bereichen Qualitätssicherung, Releasemanagement und Deployment ist das eine hilfreiche Lösung.<br />
<br />
<h2>
Weitere Schritte</h2>
<br />
In den nächsten Artikeln werde ich auf dieser Basis zeigen, wie man Apache Archiva weiter konfigurieren kann, wie man ein Git Bare Repository auf der Server-Side erstellt und anschließend auf der Workstation klont, und ich werde ein erstes Java Projekt mit Maven aufsetzen, welches natürlich unter Versionskontrolle von Git steht. <br />
<br />
Git hat von Haus aus keine Zugriffskontrolle. In einem Unternehmen kann es aber notwendig werden bestimmten Entwicklern, z.B. Freelancer, eingeschränkten Zugriff auf bestimmte Projekte zu geben. Für diesen Fall gibt es <a href="http://git-scm.com/book/en/Git-on-the-Server-Gitosis" target="_blank">Gitosis</a> oder das aktuellere <a href="http://git-scm.com/book/en/Git-on-the-Server-Gitolite" target="_blank">Gitolite</a>, aber auch <a href="http://code.google.com/p/gerrit/" target="_blank">Gerrit</a>.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6086851661951052231.post-80702624109261350732013-01-19T11:41:00.000+01:002013-06-06T21:21:51.633+02:00K2.1 - Workstation PC mit der VirtualBox von Oracle als virtuelle Maschine für die Entwicklung<h2>
Einleitung</h2>
Wir werden die Oracle VirtualBox als Server Umgebung
aufsetzen, d.h. wir können jegliche Server Systeme, wie z.B. den Apache
Webserver und zentrale Repositories für Git und Maven, in dieser
virtuellen Umgebung installieren. Als Gastsystem werden wir Linux Debian
einrichten und eine statische IP Adresse konfigurieren. Am Ende werden
wir eine virtuelle Maschine haben auf die Sie sich mit einem SSH Client,
z.B. PuTTY verbinden können.<br />
<br />
<h2>
Motivation</h2>
Diese lokale Umgebung mit einer Virtual Machine ist
leicht erweiterbar. Die Virtualisierung ermöglicht das einfache Testen
von Server Tools ohne den lokalen Rechner mit unnötigen
De-/Installationen zu belasten. Außerdem hat man professionelle
Entwicklungsbedingungen, da man produktive Bedingungen effektiv
simulieren kann mit nur einem Rechner.<br />
Und schließlich ist das
einfache "Backup & Recovery" einer virtuellen Umgebung ein großer
Vorteil. So kann man auch mal Konfigurationen testen, die evtl. das
System zerschießen, doch innerhalb von Minuten hat man wieder den
zuletzt funktionierenden Stand hergestellt.<br />
<br />
<h2>
Voraussetzungen</h2>
Wir benötigen einen Rechner mit ausreichend
Arbeitsspeicher (Empfehlung: 4GByte) und als Betriebsystem werde ich
Windows 7 Professional 64bit einsetzen. Ein Linux oder Mac System ist
genauso möglich.<br />
<br />
<h3>
Verwendete Software</h3>
<br />
<h4>
Workstation</h4>
<ul>
<li><a href="https://www.virtualbox.org/" rel="nofollow" target="_blank">Oracle VirtualBox</a></li>
<li><a href="http://www.putty.org/" rel="nofollow" target="_blank">PuTTY</a> (optional, man kann auch das Terminal von VirtualBox nutzen, was allerdings nicht so komfortabel ist wie PuTTY)</li>
</ul>
<h4>
Virtual Machine</h4>
<ul>
<li><a href="http://www.debian.org/distrib/netinst" rel="nofollow" target="_blank">Linux Debian Image</a> </li>
<li>SSH Dienst</li>
</ul>
<br />
<h2>
Umsetzung<code class="xml" data-result="[object Object]" data-second_best="[object Object]"><span class="tag"> </span></code></h2>
<h3>
Wir installieren Linux in einer virtuellen Maschine</h3>
<br />
<h4>
Kurzübersicht aller Schritte</h4>
<ol>
<li>Herunterladen von VirtualBox und einer aktuellen Linux Debian ISO Datei. (~10min)</li>
<li>Installation von VirtualBox. (~5min)</li>
<li>Erstellung einer neuen virtuellen Maschine (VM) mit Linux Debian als Gastsystem. (~60min)</li>
<li>Konfiguration einer statischen IP für die VM. (~5min)</li>
</ol>
Die Schritte 1 und 2 sollten keine Erklärung benötigen. Schritt 3
wird in den ersten Schritten durch Screenshots im Folgenden erklärt:<br />
<br />
Klicken Sie auf <i>Neu</i>
und folgen Sie den nächsten Screenshots. Sie können die Werte natürlich
an Ihre Bedürfnisse anpassen, z.B. würde ich mindestens 2GB RAM
empfehlen, wenn Sie die VM wirklich als ständigen virtuellen
Entwicklungserver nutzen.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-UtLdARBzzc0/UPnCLPtEc-I/AAAAAAAAAB8/LUDxgrjskVg/s1600/screenshot.1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="371" src="http://4.bp.blogspot.com/-UtLdARBzzc0/UPnCLPtEc-I/AAAAAAAAAB8/LUDxgrjskVg/s400/screenshot.1.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-qyFxLuE7TSU/UPnCM-p1OPI/AAAAAAAAACE/2voqNUEp9vY/s1600/screenshot.2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="371" src="http://1.bp.blogspot.com/-qyFxLuE7TSU/UPnCM-p1OPI/AAAAAAAAACE/2voqNUEp9vY/s400/screenshot.2.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-rjnO9tjjMqM/UPnCQAOvZLI/AAAAAAAAACU/hedWhcHLJFU/s1600/screenshot.3.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="http://2.bp.blogspot.com/-rjnO9tjjMqM/UPnCQAOvZLI/AAAAAAAAACU/hedWhcHLJFU/s400/screenshot.3.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Jt8lJctrBU0/UPnCS8Wu9DI/AAAAAAAAACk/jCnu-fS6NoU/s1600/screenshot.4.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="308" src="http://3.bp.blogspot.com/-Jt8lJctrBU0/UPnCS8Wu9DI/AAAAAAAAACk/jCnu-fS6NoU/s400/screenshot.4.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-fm0WxX460MY/UPnCO4hWTWI/AAAAAAAAACM/laHMu30ic6I/s1600/screenshot.5.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="307" src="http://2.bp.blogspot.com/-fm0WxX460MY/UPnCO4hWTWI/AAAAAAAAACM/laHMu30ic6I/s400/screenshot.5.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-nCym_8M4fbw/UPnCRGoegrI/AAAAAAAAACc/MyOW0fTPCRA/s1600/screenshot.6.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="307" src="http://4.bp.blogspot.com/-nCym_8M4fbw/UPnCRGoegrI/AAAAAAAAACc/MyOW0fTPCRA/s400/screenshot.6.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Ar6eaUZfQaA/UPnCUdx52-I/AAAAAAAAACs/p4buql2LsPY/s1600/screenshot.7.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="367" src="http://3.bp.blogspot.com/-Ar6eaUZfQaA/UPnCUdx52-I/AAAAAAAAACs/p4buql2LsPY/s400/screenshot.7.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-M9MTpbPLj7g/UPnCixlPOiI/AAAAAAAAADo/yAZXKMDevzI/s1600/screenshot.8.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="333" src="http://3.bp.blogspot.com/-M9MTpbPLj7g/UPnCixlPOiI/AAAAAAAAADo/yAZXKMDevzI/s400/screenshot.8.png" width="400" /></a></div>
<br />
Nun klicken Sie auf Start und sehen folgenden Screen:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-c3EC-FWBlLg/UPnCigZYpYI/AAAAAAAAADk/83xyh2owHjw/s1600/screenshot.9.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="341" src="http://2.bp.blogspot.com/-c3EC-FWBlLg/UPnCigZYpYI/AAAAAAAAADk/83xyh2owHjw/s400/screenshot.9.png" width="400" /></a></div>
<br />
Wählen Sie anschließend die Linux Debian ISO Datei von Ihrem Rechner aus durch Klick auf das rechte Verzeichnis Symbol:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-JS7C-3kmEM4/UPnCe-v_w_I/AAAAAAAAAC4/VwKtOyhe8fA/s1600/screenshot.10.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="226" src="http://2.bp.blogspot.com/-JS7C-3kmEM4/UPnCe-v_w_I/AAAAAAAAAC4/VwKtOyhe8fA/s400/screenshot.10.png" width="400" /> </a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-ieYZa4h-Ruw/UPnCeavrReI/AAAAAAAAAC0/ncqwPv7gUCk/s1600/screenshot.11.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="http://1.bp.blogspot.com/-ieYZa4h-Ruw/UPnCeavrReI/AAAAAAAAAC0/ncqwPv7gUCk/s400/screenshot.11.png" width="400" /></a></div>
<br />
Nach dem Sie auf Starten geklickt haben wählen Sie eine Installationsroutine aus: <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-K4iTc_-dHmw/UPnCfpMCOvI/AAAAAAAAADM/ZTipXftbKRI/s1600/screenshot.12.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="342" src="http://3.bp.blogspot.com/-K4iTc_-dHmw/UPnCfpMCOvI/AAAAAAAAADM/ZTipXftbKRI/s400/screenshot.12.png" width="400" /></a></div>
<br />
Die restlichen Schritte/Klicks habe ich in weiteren über 60 Screenshots dokumentiert. Die Bilddateien kann man sich als<br />
<br />
<div style="text-align: center;">
<a href="https://docs.google.com/file/d/0BwBlXQsr_e6IZ0o4dl95Z09vQ3M/edit" rel="nofollow" target="_blank">Zip Archiv</a> </div>
<br />
herunterladen.<br />
<br />
Machen
wir weiter mit Schritt 4, und konfigurieren nun eine private statische
IP Adresse für die virtuelle Maschine. Damit stellen wir sicher, dass
wir nicht nach jedem Neustart der VM eine andere IP bekommen,
schließlich werden wir einige Bookmarks oder auch andere
Verbindungskonfigurationen mit der Zeit einrichten.<br />
Jetzt melden Sie sich mit dem erstellten Benutzer (hier: root) über das VirtualBox Terminal an:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-_E0iIVlMLkU/UPnaJA97LwI/AAAAAAAAAI0/V5YVDjqyl4E/s1600/screenshot.2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="260" src="http://4.bp.blogspot.com/-_E0iIVlMLkU/UPnaJA97LwI/AAAAAAAAAI0/V5YVDjqyl4E/s400/screenshot.2.png" width="400" /></a></div>
<br />
Im
täglichen Gebrauch ist das Terminal etwas umständlich, weil es z.B.
keine bunte Farben kennt und in der Displaygröße auch nicht veränderbar
ist. Nach der Anmeldung geben Sie folgenden Befehl ein:<br />
<pre class="brush:plain;">nano /etc/network/interfaces</pre>
Geben Sie die folgende Konfiguration ein:
<br />
<pre class="brush:plain;"># This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.0.XXX
broadcast 192.168.0.255
netmask 255.255.255.0
gateway 192.168.0.1
</pre>
<br />
Speichern Sie die Datei mit <span style="font-family: "Courier New",Courier,monospace;">Strg+O</span> und <span style="font-family: "Courier New",Courier,monospace;">ENTER</span>, und verlassen Sie den Nano Editor mit <span style="font-family: "Courier New",Courier,monospace;">Strg+X</span>.<br />
<br />
Führen Sie nun einen Neustart der VM durch:
<br />
<pre class="brush:plain;">reboot</pre>
Melden Sie sich wieder mit <i>root</i> an und prüfen Sie mit
<br />
<pre class="brush:plain;">ifconfig</pre>
ob die neue IP Adresse übernommen wurde.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-YCHcn2d1iZM/UPnftD9qSOI/AAAAAAAAAJY/tbpF9ajGixw/s1600/screenshot.4.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="261" src="http://1.bp.blogspot.com/-YCHcn2d1iZM/UPnftD9qSOI/AAAAAAAAAJY/tbpF9ajGixw/s400/screenshot.4.png" width="400" /></a></div>
<br />
Die
VM ist nun aufgesetzt und wir werden demnächst weitere Programme und
Tools installieren und konfigurieren, z.B. Git und Apache Archiva.<br />
<br />
Es
gibt nur noch eine Sache die man in VirtualBox noch testen sollte, und
zwar die Netzwerkadapter Einstellung. Falls diese nicht passend
konfiguriert ist können Sie sich nicht mit einem SSH Client, z.B. PuTTY,
auf die VM verbinden und das wäre nach all der Arbeit recht
beschissen...<br />
<br />
Gehen Sie im Hauptmenü von VirtualBox auf <span style="font-family: "Courier New",Courier,monospace;">Geräte -> Netzwerkadapter...</span> und testen Sie z.B. <i>Netzwerkbrücke</i>:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-IhcXW63NW48/UPnm3LQJZVI/AAAAAAAAAJs/zaPH4wVF4PQ/s1600/screenshot.6.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="282" src="http://2.bp.blogspot.com/-IhcXW63NW48/UPnm3LQJZVI/AAAAAAAAAJs/zaPH4wVF4PQ/s400/screenshot.6.png" width="400" /></a></div>
<br />
Nachdem Sie hier eine passende Konfiguration gefunden haben sollten Sie sich mit einem SSH Client auf die VM verbinden können.<br />
<br />
<h2>
Zusammenfassung</h2>
<br />
Wir haben nun eine virtuelle Maschine
auf unserem lokalen Rechner laufen. Dies ermöglicht uns mit nur einem
physikalischen Rechner einen remote Server zu simulieren und benötigen
dafür auch keine Internetverbindung.<br />
Die VirtualBox sollte man
regelmäßig sichern bzw. Sicherungspunkte erstellen. Wir können die VM
vielseitig nutzen, z.B. um irgendwelche Installationen (Datenbanken,
etc.) zu testen, zentrale Repositories (Git, Subversion, Maven, etc.)
für die Entwicklung aufzusetzen oder auch um einen Continuous
Integration Server zu betreiben wie den Jenkins, Hudson oder Apache
Continuum.<br />
<br />
<h2>
Weitere Schritte</h2>
<br />
In einem nächsten Artikel werde ich
hier anknüpfen und mit der Einrichtung eines zentralen
Maven Repository mit Apache Archiva, sowie Installationen (Git, Maven 3,
etc.) auf der lokalen Workstation weitermachen.Unknownnoreply@blogger.com0