220 likes | 386 Views
Wintersemester 2004 Lehrstuhl für Wirtschaftsinformatik Technische Universität München. Projektorganisation mit [ CVS/Subversion, ] Eclipse und Apache Ant. Michael Baumann. 30.11.2004. Agenda. Hintergrund Eclipse Was ist Eclipse? Anlage eines Java-Projekts Imports
E N D
Wintersemester 2004 Lehrstuhl für Wirtschaftsinformatik Technische Universität München Projektorganisation mit[CVS/Subversion, ]Eclipse und Apache Ant Michael Baumann 30.11.2004
Agenda • Hintergrund • Eclipse • Was ist Eclipse? • Anlage eines Java-Projekts • Imports • .project, .classpath • Ant in Eclipse • Ant • Was ist Ant? • Wofür benötigt man/wir Ant? • Installation (ANT_HOME, PATH) • Arbeitsprinzip • Aufbau einer build.xml • Project • Targets • Tasks • Ant tasks • <javac>, <copy>, <war>, <jar>, <unwar>, <unjar> • Beispiele • Literatur
Hintergrund Java-Entwicklung mit Open-Source-Tools, für • professionelles und effizientes Arbeiten • Entwicklung guter und wartbarer Software • Unterstützung von Projektarbeit (Gruppen) • etc. Entwicklungswerkzeuge gibt es u.a. für das • Source Code Management (Zentrale Ablage, Änderungsgeschichte, Versionierungsinformationen, parallele Entwicklung) CVS – Concurrent Version System • Bug Tracking System (Fehler erfassen/bearbeiten/beseitigen/abfragen/auswerten) Bugzilla • Build Management Tool (inkrementelle Builds, Automatisierbarkeit, möglichst portabel) Apache Ant • Testing Framework (paralleles Entwickeln und testen, automatisiertes Testen) JUnit • Integrierte Entwicklungsumgebung [IDE] (leistungsfähiger Editor, Projektübersicht, Integration weiterer Tools) Eclipse
Was ist Eclipse? Eclipse ist eine sprachunabhängige, plattformunabhängige, integrierte Entwicklungsumgebung (IDE = Integrated Design/Development Environment) • beinhaltet bzw. integriert weitere hilfreiche Komponenten zur Versionsverwaltung, Projektmanagement, etc. • ist also Editor, Compiler, Debugger, etc. in einem. Diese Anwendungen werden in Form von Plugins zur Verfügung gestellt und von der Eclipse-Plattform meist automatisch erkannt und integriert. Eclipse bietet weiterhin Funktionalitäten zum Verwalten von Ressourcen (normalerweise Dateien) auf der Festplatte. Diese befinden sich im Workspace, einem speziellen Verzeichnis im Dateisystem. Der Benutzer arbeitet dabei immer in der Workbench, dem grafisch sichtbaren Teil der Eclipse-Plattform, die durch Perspektiven und/oder individuelle Einstellungen gestaltet werden kann.
Anlage eines Java-Projects I „File“ >„New“ > „Project“ > „Java-Project“ Next >
Anlage eines Java-Projekts II • Auswahl von verwandten Projekten und benötigten Bibliotheken • Exporteinstellungen z.B. für verwandte Projekte „Finish“
.project, .classpath In jedem Eclipse-Projektordner des Workspace befinden sich eine .project- und .classpath-Dateien. Die .classpath und .project Dateien für Eclipse enthalten stets relative Pfade, entweder direkt ins Projektverzeichnis oder über Eclipse Classpath-Variablen (z.B. JAVA_HOME, JRE_LIB, JUNIT_HOME, …). [Man setzt die Eclipse Classpath-Variablen über das Menü Windows Preferences Java Build Path Classpath Variables.] Sie sind in XML-Struktur aufgebaut und sehen wie folgt aus: .project: <?xml version="1.0" encoding="UTF-8"?> <projectDescription> <name>Test</name> <comment></comment> <projects> </projects> <buildSpec> <buildCommand> <name>org.eclipse.jdt.core.javabuilder</name> <arguments> </arguments> </buildCommand> </buildSpec> <natures> <nature>org.eclipse.jdt.core.javanature</nature> </natures> </projectDescription> .classpath: <? xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="var" path="JUNIT_HOME"/> <classpathentry exported="true" kind="src" path="/JCo"/> <classpathentry kind="output" path="bin"/> </classpath> Bzw. <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path=""/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="lib" path="D:/UNI/Praktikum_SAP_JCo/Code/sapjco.jar"/> <classpathentry kind="output" path=""/> </classpath>
Ant in Eclipse • Eclipse liefert Ant 1.6.1 als Plug-in. • Ändern des Ant runtime classpath: • Window > Preferences > Ant > Runtime. Die JARs von Ant 1.6.1 sind unter Ant Home Entries zusammengefasst. Um diesen zu ändern, klickt man den Ant Home...-Button und wählt das entsprechende Installationsverzeichnis. • Ant lässt sich in Eclips durch Run Ant… oder mit View > Ant konfigurieren und aktivieren • … hierfür benötigen wir jedoch zunächst etwas mehr Informationen zu ANT…
Was ist Ant? • Abkürzung für "Another Neat Tool" • "Ant" steht auch dafür, dass es, vergleichbar mit Ameisen, als relativ kleines Programm, Großes leisten kann • erste Version von James Duncan Davidson der 1999 (Vater von Jakarta Tomcat) • Build-Tool • Werkzeug zum automatisierten Erzeugen von Programmen aus Quell-Code (vgl. „make“), bzw. • automatisierte Erstellung von installierbaren Software-Paketen aus existierendem Quell-Code, Bibliotheken und sonstigen Dateien • Insbesondere für die Entwicklung von Java-Anwendungen
Wofür Ant? Ant… • macht aus unseren Quelldateien Webapplikationen • schiebt Dateien auf TomCat • hat Mechanismen zum Daten sammeln und deployen • archiviert • kompiliert • (ent-)packt • kopiert • verschiebt • etc. und das alles automatisiert.
Installation von Ant • Download von http://ant.apache.org/ • Entpacken in das gewünschte Verzeichnis ( ANT_HOME) • Setzen der Umgebungs- und Path-Variablen:
Arbeitsprinzip von Ant • Gesteuert durch eine XML-Datei (build.xml) Vorteil: • Bedeutung unabhängig von div. Schriftzeichen sowie Pfadtrennzeichen und damit vom Betriebssystem • Diese definiert zunächst ein Projekt (z.B. JCo) • Das Projekt enthält Targets, die vergleichbar sind mit Funktionen. • Targets enthalten u.a. Aufrufe von Tasks (=untrennbarer Arbeitsschritt) • Weiterhin können Properties gesetzt werden, die als Werte von Attribute verwendet werden können • Es gibt globale und target-spezifische properties • Alle 4 Instanzen besitzen verschiedene Attribute (später mehr)
Aufbau einer build.xml <?xml version="1.0" encoding="UTF-8"?> <projectname="JCo"default="dist"basedir="."> <description> Beschreibung </description> <!-- globale properties --> <propertyname="src"location="."/> <propertyname="build"location="build"/> <propertyname="dist"location="dist"/> <targetname="compile"depends="init„ description="compile the source"> <!-- Compiliere den Java-Code von ${src} nach ${build} --> <javacsrcdir="${src}"destdir="${build}"/> </target> </project>
Project Ein Projekt hat 3 Attribute: Jedes Projekt definiert mindestens ein Target!
Targets • Zwischen Targets sollten Abhängigkeiten definiert werden • Das default-Target hat direkte oder indirekte Abhängigkeiten zu allen anderen Targets, wird zum Start ausgeführt und ruft so nach und nach alle weiteren Targets auf • Bsp.: <target name="A"/><target name="B" depends="A"/><target name="C" depends="B"/><target name="D" depends="C,B,A"/> • Targets können unter Bedingung einer vorhandenen Property ausgeführt werden • TIP: Es ist praktisch den „Timestamp“ im Initalisierungstarget zu platzieren
Tasks • Eine Task ist ein Stück Code, der ausgeführt werden soll • Eine Task kann eine Vielzahl von Attributen besitzen • Die Struktur einer Task: <name attribute1="value1" attribute2="value2" ... /> • Manchmal ist es hilfreich Tasks mit einer eindeutigen ID zu versehen: <taskname id="taskID" ... /> • So kann man zum Beispiel von extern Attribute ändern: <script ... > task1.setFoo("bar");</script> (gibt dem Attribut „foo“ den Wert „bar“) • Oder man kann auf die Instanz mit Java zugreifen: project.getReference("task1") • Ant verfügt über eine ganze Reihe von „built-in“-Tasks (Ant, AntCal, AntStructure, Apply/ExecOn, Available, Basename, BuildNumber, BUnzip2, BZip2, Checksum, Chmod, Concat, Condition, Supported conditions, Copy, Copydir, Copyfile, Cvs, CvsChangeLog, CvsVersion, CVSPass, CvsTagDiff, Defaultexcludes, Delete, Deltree, Dependset, Dirname, Ear, Echo, Exec, Fail, Filter, FixCRLF, GenKey, Get, GUnzip, GZip, Import, Input, Jar, Java, Javac, Javadoc/Javadoc2, LoadFile, LoadProperties, Mail, MacroDef, Manifest, Mkdir, Move, Nice, Parallel, Patch, PathConvert, PreSetDef, Property, Record, Rename, Replace, Rmic ,Sequential, SignJar, Sleep, Sql, Style, Subant, Sync, Tar, Taskdef, Tempfile, Touch, TStamp, Typedef, Unjar, Untar, Unwar, Unzip, Uptodate, Waitfor, War, WhichResource,XmlProperty, Xslt, Zip) und weiteren optionalen Tasks, es besteht aber auch die Möglichkeit, selbst Tasks zu schreiben. • Die wichtigsten für uns, die wir näher betrachten wollen sind javac, copy, war/unwar, jar/unjar:
Tasks: copy, javac <copy> • Beschreibung: Kopiert eine Datei, oder ein zu definierendes FileSet in eine neue Datei oder Verzeichnis. Standarmäßig werden nur Dateien kopiert, die neuer sind also die Zieldatei. Mit dem “overwrite”-Attribut lässt sich das ändern. Um ein FileSet zu benutzen muss das Attribut “todir” gesetzt sein. • Attribute: file, preservelastmodified, tofile, todir, overwrite, filtering, flatten, includeEmptyDirs, failonerror, verbose, encoding, outputencoding, enablemultiplemappings, granularity <javac> • Beschreibung: Kompiliert Java-Dateien. Das Quell- und Zielverzeichnis werden gescannt. Nur Dateien, die noch keine oder eine ältere .class-Datei besitzen, werden kompiliert. • Attribute: srcdir, destdir, includes, includesfile, excludes, excludesfile, classpath, sourcepath, bootclasspath, classpathref, sourcepahtref, bootclasspathref, encoding, extdirs, nowarn, debug, debuglevel, opimize, deprecation, target, verbose, depend, includeAntRuntime, includeJavaRuntime, fork, executable, memoryInitialSize, memoryMaximumSize, failonerror, source, compiler, listfiles, tempdir
Tasks: jar/unjar, war/unwar <jar> • Beschreibung: Packt die Javaquelldateien aus dem “basedir”-Verzeichnis in eine Java-Archiv-Datei. Mit dem “update”-Attribut können existierende jars bearbeitet werden. • Attribute: destfile, basedir, compress, keepcompression, encoding, filesonly, extdirs, , includes, includesfile, excludes, excludesfile, defaultexclude, manifest, filesetmanifest, update, whenemtpy, duplicate, index, manifestencoding, roundup <war> • Beschreibung: Eine Erweiterung der Jar-Task, speziell für Dateien, die in ein Verzeichnis (WEB-INF/lib, WEB-INF/classes or WEB-INF) für ein Web Application Archive gehören. Diese Task ist eine Vereinfachung für die Spezifikation eines bestimmten Layouts einer WAR-Datei. • Attribute: s. <jar> <unwar>/<unjar> • Beschreibung: Entpackt eine WAR- bzw. JAR-Datei. • Attribute: src, dest, overwrite, compression, encoding
Beispiel I (war) <!– Packt die Dateien für eine Webseite in der entsprechenden Struktur --> <wardestfile="myapp.war„ webxml="src/myapp.xml"> <filesetdir=„de/winfobase/test/DeinHTML"/> <filesetdir=" de/winfobase/test/DeinServlet"/> <libdir="libs"> <excludename=„JCo.jar"/> </lib> <classesdir="build"/> <zipfilesetdir=" de/winfobase/test/images/gifs" prefix="images"/> </war>
Beispiel II - 1 <?xml version="1.0" encoding="UTF-8"?> <projectname="JCo"default="clean"basedir="."> <description> simpleexamplebuildfile </description> <!-- set global properties for this build --> <propertyname="src"location="."/> <propertyname="build"location="build"/> <propertyname="dist"location="dist"/> <propertyname="backup"location="backup"/> <targetname="init"> <!-- TimeStamp --> <tstamp/> <!-- Verzeichnisse anlegen --> <mkdirdir="${build}"/> <mkdirdir="${backup}"/> </target> . .
Beispiel II - 2 <targetname="compile"depends="init" description="compile the source"> <!-- Javacode von ${src} nach ${build} kompiliern --> <javacsrcdir="${src}"destdir="${build}"/> </target> <targetname="dist"depends="compile" description="generate the distribution"> <!-- Verzeichnis anlegen --> <mkdirdir="${dist}/lib"/> <!-- Alles aus ${build} in die JCo-${DSTAMP}.jar packen --> <jarjarfile="${dist}/lib/JCo-${DSTAMP}.jar"basedir="${build}"/> </target> <targetname="copy"depends="dist, compile, init"> <copyfile="logon.ini"todir="${backup}"/> </target> <targetname="clean" description="clean up"depends="copy"> <!-- Lösche die Verzeichnisse ${build} und ${dist}--> <deletedir="${build}"/> <deletedir="${dist}"/> </target> </project>
Literatur • Ant-Manual • Eclipse-Hilfe