SCM: CVS, SVN, Git hilfreich auch für den einzelnen Entwickler

SCM – Source Control Management wie SVN oder Git können sich auch für einzelne Entwickler bezahlt machen. Ein paar Alternativen werden hier vorgestellt.

Wie das Leben so spielt

Vor kurzem konnte ich wieder am eigenen Leib verspüren, wie wertvoll Source Controll Management sein kann. Bei der Auftrennung eines Softwareprojekts habe ich Klassen eines Maven Moduls, in ein anderes neues Modul verschoben, oder besser verschieben lassen. Eclipse bietet dafür eine “Move…” Funktion. Beim Test der Auftrennung fand das Hauptprojekt jedoch das neue Modul nicht mehr. Wie immer zuerst auf der falschen Fährte, habe ich erst den Build Prozess in Zweifel gezogen und Maven des Missmanagements verdächtigt. Als sich dort keine Unstimmigkeit finden lies, habe ich doch tatsächlich in die Verzeichnisse des neuen Modul gesehen. Die Lehr aus der Geschicht, traue Automatismen nicht. Die Klassen waren zwar erfolgreich aus dem ursprünglichen Modul entfernt worden, scheinen aber nie im neuen Modul angelegt worden zu sein. Die Arbeit der letzten Woche im Kübel!

Wäre da nicht mein SCM! So war der Missstand in ein paar Klicks erledigt, indem ich die fehlenden Klassen aus dem Projekt-SVN wieder herstellte. Als hätte ich eine Vorahnung gehabt, sicherte ich den gesamten veränderten Code über das Versionierungstool, bevor ich die Klassen von Eclipse verschieben lies.

Ob good old CVS, weitverbreitetes SVN, das aktuelle iSCM: Git oder sonstige Alternativen wie zB Mercurial oder Perforce, sie alle hätten mir in dieser Situation den Hals gerettet. Neben dem kollaborativen Nutzen, der sich ist vor allem bei größeren Projekten bemerkbar macht, ist vor allem die Sicherung der Arbeitsleistung ein wesentlicher Aspekt von Versionsverwaltungs Software, solange man einen wichtigen Punkt nicht vergisst: Man muss Änderungen auch einchecken, und das regelmäßig!

Versionsverwaltung für alle

Es gibt zahlreiche Dienstleister die Versionsverwaltungssoftware gegen mehr oder weniger Geld zur Verfügung stellen. Hier möchte ich drei der bekanntesten vorstellen.

Sourceforge

In meinem Fall konnte ich auf die Strukturen des auf Open Source Projekte spezialisierten Sourceforge bauen und meinen Code dort ins SVN committen, aber auch die alternativen Versionsverwaltungstools bietet Sourceforge zur Auswahl an. Für Open Source Projekte findet man hier neben einer oder mehreren Versionsverwaltungen alles was ein Projekt sich wünschen kann, und das umsonst.

http://www.sourceforge.net

Google Code

Etwas abgespeckt im Funktionsumfang, im Vergleich zu Sourceforge, ist Google Code, welches jedoch immer noch ein solides Rundumpaket zum Projekthosting anbietet.

http://code.google.com

Github

Der Renner aktuell, vorallem unter Ruby und Javascript Entwicklern, ist Github, welches sich, wie der Name aufzeigt, auf Git spezialisert hat. Auch Github bietet für Open Source Projekte seine Dienste gratis an. Der Code ist dann jederzeit für alle zugänglich und kann für alle geforked werden. Für einen monatlich zu entrichtenden Aufpreis sind hier jedoch private Repositories zu erhalten.

http://www.github.com

Host it yourself

Subversion, Git und Co können meist kostenlos bezogen werden und auch selbst gehostet werden. Hat man einen eigenen Server muss man seinen Sourcecode nicht mehr in die Hände dritter geben. Ohne Server rentiert es sich immernoch die Versionsverwaltung lokal auf dem Entwicklungsrechner abzuhandeln. Wenn auch meist mit ein paar Einschränkungen in der Handhabung.

http://subversion.tigris.org/

http://git-scm.com/

Happy coding!

Ähnliche Artikel:

TrayRSS 1.0.1 is here!

TrayRSS 1.0.1 is here, with some bugfixes and improvements in performance. Track your RSS feeds in the systemtray and get noticed on changes.

Hi there,

i’d like to announce the new Bugfixrelease of Trayrss! Besides bugfixing, I made some pretty interesting changes

Changes in 1.0.1
* performance refactoring
* event-dispatcher threads for gui
* log4j updated
* refactored the useage of log4j
+ task 00035: implementing maven
* fix 00033: timesets starttimes where set as endtime
+ task 00035: packaging by maven
+ task 00035: buildnumber
– task 00044: SWIXML menu removed

You can download the new relesase here.

Changes

I’ve fixed some bugs in the event-dispatcher thread of the gui, so trayrss is now more stable. Also there was an error when monitoring feeds with an invalid timeframe. TrayRSS stopped monitoring without telling the user if the format of the timeframe could not be parsed correctly.

Besides the logging feature was updated too. This and some additional changes within the source should lead to a little performance increase.

Bugtracker

TrayRSS relied on Trac for about two years. But Trac has its limitations. Now MantisBT is used to track all the tasks that are required to improve the application. The relation between a sourcecode change and a task will be noticed in the changelog in future by adding the tasknumber. Also Trac was binded to sourceforge. Now it isn’t necessary to have a sourceforge-account anymore to report an bug or request.

In MantisBT there are some additional possibilites to create reports. Also better notifications and a easier way to manage milestones are provided by the new bugtracker.

Maven

Additionally TrayRSS developement steps ahead to the next major release 1.1 Some major changes will be part of this release and the first step was also shipped with this Bugfixrelease: TrayRSS moved from ant to maven to manage the build process and to collect all the dependencies. That offers TrayRSS some important possibilities for the future such as managing multimodule projects, improves reusability, convention over configuration and so on. Some details about the migration will be described in future on nullpointer.at.

Hope you enjoy the new release

Kind regards!

Ähnliche Artikel:

Maven Repository auf Sourceforge

Ein projektinternes Maven Repository auf Sourceforge ist schnell eingerichtet und erleichtert die Arbeit mit Maven. Wie es geht wird in diesem Artikel erklärt. Das Konzept ist auch leicht auf ein eigenes privates Projekt ohne Sourceforge umlegbar.

Projektabhängigkeiten

Entwickelt man ein Software-Projekt, kommt man wie ich zu dem Punkt, an dem die eigene Software von fremden Bibliotheken abhängig ist. Im Falle von TrayRSS ist das zum Beispiel: hibernate, jdom, rom, junit, log4j. Lauter namhafte Bibliotheken, die auch in den öffentlichen Repositories von Maven verfügbar sind. TrayRSS setzt seit kurzem auf Maven um alle Abhängigkeiten zu sammeln. Doch TrayRSS setzt auch auf Bibliotheken die vielleicht weniger bekannt sind:

Leider sind beide Librarys in keinem Repository vertreten, sodass diese Abhängigkeiten nicht ohne weiteres über Maven aufgelöst werden können.

Damit es nun einem dem Projekt Fremden dennoch möglich ist den Code aus dem Versionierungssystem beziehen und das Projekt zu bauen, kann man ihm natürlich die Bibliotheken oder die Links dazu zur Verfügung stellen. So ist jeder für sich in der Lage die fehlenden Sourcen nachzuziehen und manuell ins lokale Repository zu laden. Ein Aufwand, der dank den Möglichkeiten eines eigenen Webspaces, wie ihn auch Sourceforge bietet, vermieden werden kann.

Aufbau eines Maven Repository

Ein Maven Repository ist eigentlich nichts anderes als ein Haufen Ordner mit ein paar Dateien, die nach folgendem Schema aufgebaut sind:

/gruppe/artefakt/version/artefakt-version.jar

Dabei entspricht die Gruppe den Regeln, die wir schon von Java Packages kennen. Jedes Unterpaket getrennt durch einen Punkt entspricht einem eigenen Verzeichnis. Der Bezeichner Artefakt entspricht der ArtefaktID welches im POM der jeweiligen Bibliothek definiert ist. Versionsnummer und Artefakt kombiniert ergibt die Benennung des Jar Files, welches darin enthalten ist.

Für die Auflösung der Abhängigkeiten des jeweiligen Artefakts liegt neben der Jar Datei auch eine POM Datei auf, in der die entsprechenden Informationen bereitgestellt werden. Beispielhaft der Inhalt einer solchen POM Datei:

<?xml version="1.0" encoding="ISO-8859-1"?>
  <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>at.nullpointer</groupId>
  <artifactId>paketname</artifactId>
  <version>0.0.1</version>
  <packaging>jar</packaging>
  <name>paketname</name>
  <description>
    Beschreibung des Pakets
  </description>

  <dependencies>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.4.3</version>
      <type>jar</type>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

Hier lässt sich auch die Information zur Ordnerstruktur hervorragend auslesen.

Zusätzlich können noch diverse zusätzliche Datein vorhanden sein um zB die md4 Checksum zu verifizieren oder ähnliches.

Internes Repository im Projekt Web

TrayRSS ist ein Open Source Projekt und wird auf Sourceforge gehostet. Damit wir nun unsere Bibliotheken allen Usern zur Verfügung stellen können greifen wir auf die Möglichkeiten von Sourceforge zurück. Hier wird unter anderem Webspace zum Hosten der Projektseite angeboten, auf den man projektrelevante Daten ablegen kann. Also auch unser Repository.

Wie man sich über SFTP dorthin verbindet wird in folgendem Wikieintrag von Sourceforge aufgezeigt: http://sourceforge.net/apps/trac/sourceforge/wiki/Project%20web

SFTP fähige Clients unter Windows sind z.B. WinSCP und Filezilla. Wenn noch nicht installiert findet man unter Linux ein entsprechendes Commandline Tool in der Paketverwaltung der bevorzugten Distribution.

Nun wird einfach ein Verzeichnis unter htdocs angelegt z.B. mit dem Namen repository. In dieses Verzeichnis spielen wir nun wie oben dargestellt eine entsprechende Maven Verzeichnisstruktur ein.

Hier die Beispielhafte Verzeichnis- und Dateistruktur für jNotification:

repository
----de
--------jutzig
------------jnotification
----------------0.3
--------------------jnotification-0.3.jar
--------------------jnotification-0.3.pom

Zugang zum Repository

Dann fehlt nur noch ein Eintrag ins POM des Projektes nach folgendem Beispiel:

<repositories>
  <repository>
    <id>projekt-repository</id>
    <name>projekt Repository</name>
    <url>http://projekt.sourceforge.net/repository/</url>
  </repository>
</repositories>

Nun noch die Abhängigkeiten ganz normal in Maven eingetragen und Maven kann diese nun z.B. mit mvn eclipse:eclipse aus dem Internen Repository auslesen und das Projekt erfolgreich bauen.

Ähnliche Artikel:

Ein Blick über den Tellerrand: RSSOwl

Ein Blick über den Tellerrand: Der Aufbau des Open Source Projektes RSSOwl. Wie ist der Source organisiert und wird die Entwicklung unterstützt.

Beim Blick über den Tellerrand liegt der Fokus nicht auf der Funktionalität der Software, sondern auf der Organisation der Entwicklung und am Aufbau des Sourcecodes. Hier geht es darum von anderen Projekten zu lernen und die eigene Organisation zu verbessern. Daher erfolgt der hier präsentierte Blick auf die Software protokollartig durch meine Augen und entlang meiner Lernkurve.

Überblick

RSS Owl versteht sich selbst als komfortable Software um RSS, RDF und Atom News Feeds zu organisieren, zu suchen und zu lesen. Als besondere Stärken führt man die gemerkten Suchen, die Benachrichtigung aus dem Tray, schnelle Volltextsuche und die übersichtliche und saubere GUI ins Feld.

Auch ich hatte RSS Owl bereits eingesetzt und kann diese Stärken bestätigen. Damit steht es in direkter Konkurrenz zu dem Google Reader, der plattformunabhängig übers Web jederzeit den aktuellen Datenbestand zur Verfügung stellt.

Erhältlich ist RSS Owl unter der Eclipse Public License unter folgender URL: http://www.rssowl.org

Nun aber schnell mal per SVN die zuletzt veröffentlichte Version 2.0.6 auf die Platte ausgechecken!

Facts

Während das passiert, ein paar Facts rund um die Entwicklung. RSS Owl ist seit Juli 2003 ein Projekt auf Sourceforge unter der Leitung von Benjamin Pasero. Neben Benjamin Pasero entwickelt derzeit noch ein weiterer Entwickler an dem Programm mit. Es hatte bereits Anfang 2005 die 10.000 Downloads/Monat Marke durchbrochen, welche es seither verteidigt. Letztes Jahr wuchs das Projekt mit 359 Commits (also fast täglich) und es wurden 3.310 Files dabei hochgeladen. Insgesamt steht RSS Owl zum Zeitpunkt des Verfassens meines Artikels bei 7538 Commits. Macht fast 95 Commits je Monat.

Organisation

Homepage

Die Homepage ist einfach gehalten, was ich als durchaus positiv werte. Als Benutzer kommt man so schnell zu dem was einem interessiert. Interessanter versteckter Hinweis: RSSOwl nutzt den YourKit Java Profiler um die eigene Software zu analysieren und Schwachstellen aufzudecken. Auch den RSS Feed zur Verfolgung der Veränderungen im Source finde ich eine gute Sache.

Bugtracker

Bei der Suche nach einem BugTracker stößt man leider auf kleinere Hürden, der alte Link http://dev.rssowl.org der immernoch in der Wiki zu finden ist, sperrt uns mit einer Passwortfrage aus. Der neuere Link http://project.rssowl.org auf dem die Software Ratioal Team Concert zur Verwaltung der Entwicklung diente ist mittlerweile ebenfalls nicht mehr erreichbar. Bei den Entwicklern nachgefragt stellte sich heraus, dass der RTC Server nicht mehr in Verwendung ist. Um trotzdem einen kleinen Überblick zu erhalten konnte ich auf Youtube ein Video entdecken, in dem der Entwickler das Zusammenspiel zwischen Projekt Verwaltung, User und Entwickler aufzeigt.:

Rational Team Concert for open source development: RSSOwl

Da es sich hierbei vermutlich nur um ein temporäres Problem handelt, würde es sich lohnen später nochmal vorbeizusehen um einen persönlichen Eindrück zu gewinnen.

Source

RSSOwl Package ExplorerBuild

Das Ding das erste mal selbst zu bauen wirkt gar nicht so trivial wie erhofft. Und schon bin ich auch in die erste kleine Falle gelaufen. Selbst Schuld kann man sagen, haben die Entwickler doch in der  Wiki den Build Prozess von RSSOwl ausreichend erklärt, wie man an ein funktionierendes Projekt Set kommt. Der vorgeschlagene Weg ist flott eingeschlagen und schon ist man mit einer Liste an Projekten konfrontiert. Noch die Launch Konfiguration für mein Eclipse angepasst und schon ist das Programm von Eclipse aus zu starten. Ein Problemloser Einstieg, eigentlich.

Tests

Auch die JUnit Tests laufen wie geschmiert. 842 Tests überprüfen die Funktionstüchtigkeit von RSSOwl, von denen 2 Failures gemeldet wurden. Mit einem raschen Blick auf die Fehler Ursache stellt sich heraus, dass hier die unterschiedliche Zeitzone die Schuld trägt. Mehrere Tests wurden auch ignoriert, viell. in Zusammenhang mit den Nullpointer Exceptions die beim Zugriff auf das Plugin „org.eclipse.equinox.common“ geworfen wurden. Dem gehe ich nun aber nicht weiter nach.

Die Tests sind umfangreich, großes Lob meinerseits! Auch sind die Testfälle ausreichend beschrieben und weisen Verweise auf gemeldete Bugs auf. Wie mit JUnit üblich existiert eine TestSuite mit mehreren Untergruppen. Dabei lässt sich bereits etwas über die Struktur des Programmes herauslesen. So gibt es Gruppen für den Core, für Funktionen die das Netzwerk benötigen und für welche die es nicht tun, für die Performance und für Spezialbereiche wie der PasswordProvider oder die JobQueue.

Packages/Module

Die eigentliche Anwendung selbst wurde aufgeteilt in die Komponenten Core und UI. Innerhalb der jeweiligen Subprojekte wurden die Klassen nach Funktionalität in verschiedenste Packages aufgeteilt. Hier sieht alles recht normal aus. Die relativ geringe Modularisierung wurde durch Programmierung gegen Interfaces ausgeglichen.

Das Projekt setzt auf SWT zur GUI Erzeugung. Im Speziellen wird hier Eclipse als Rich Client Plattform eingesetzt und die Ähnlichkeit im laufenden Betrieb lässt sich auch kaum leugnen. Vorteil davon ist ein professionelles Erscheinungsbild, und viele Sorgen die einem die Plattform abnimmt.

Alleine der Core von RSS Owl umfasst 365 Klassen, und so ist die Einstiegshürde bereits recht hoch. Um dennoch einen Einblick zu gewinnen, liefern einem die Authoren eine entsprechende Übersicht: Architecture and Extension Points

Comments

Die Authoren haben ihren Code durchgehend mit Kommentaren (Javadoc und andere Erklärungen) versehen. Zahlreiche Kommentare dienen als Lesestütze für den Sourcecode. Dabei haben sie gute Arbeit getan, die die Einstiegshürde für weitere helfenden Hände verringert und auch den alten Hasen dienlich ist.

Libs

RSSOwl nutzt db4o als Datenbank, greift auf die RSS Feeds mithilfe von Apaches httpclient zu und wertet sie mittels JDOM aus. Die angepriesene flotte Volltextsuche realisiert RSSOwl mithilfe von Lucene, ebenfalls ein Apache Projekt.

Da ich bisher noch kein Eclipse RCP Projekt gesehen habe sind die Abhängigkeiten zwischen den Projekten noch etwas undurchsichtig für mich. Prinzipiell bleibt zu sagen dass für jede genutzte fremde Library ein eigenes (Sub-)Projekt, ein sogenanntes Plugin, angelegt wurde, in dem neben der Binary Jar und den Sourcen noch richtigerweise die Lizenz der jeweiligen Bibliothek. In dem Zusammenhang stellt sich mir unabhängig von RSSOwl die Frage, wie in Maven derartiges mit Open Source Abhängigkeiten behandelt wird, schließlich ist je nachdem mindestens die Lizenz ein muss!?

Distribution

Dank der Nutzung von Eclipse RCP steht einer Veröffentlichung für die gängigen Plattformen Linux, Windows und Mac OS X nichts im Wege, außer vielleicht die Suche nach dem wie. Hier lässt die Wiki aus und der Haufen an XML Datein ist nicht sprechend genug. Meine Vermutung ist, dass ich eines der Goals aus der build.xml des Projekts org.rssowl.build verwenden müsste. Auch hier hilft mir der Author weiter, und meine Vermuting war nahe dran. In org.rssowl.build liegt eine rssowl.product Datei über die man den Eclipse Export Wizard anschmeißen kann. Auch das ist recht schnell geschehen.

Fazit

Für meinen nächsten Tellerrand muss ich mir mehr Zeit nehmen. Eine Eclipse RCP Anwendung nur aus flüchtigen Blicken in einen Source heraus zu verstehen ist nicht so einfach, mehr Basics müssen her.

Trotzdem hat sich gezeigt, dass RSSOwl sehr gut organisiert ist. Strukturierter gut kommentierter Code helfen einem sich im Projekt zurecht zu finden. Wirkt nach einer soliden Basis, die das Programm auch in Zukunft gut dastehen lassen wird.

Ähnliche Artikel:

Timer und Timertasks – Aufgaben planen in Java

Hier wird gezeigt wie man mit den Klassen Timer & Timertasks zukünftige und/oder regelmäßige Aufgabenoder bequem umsetzen kann.

Oder wie man als Nachtwächter nicht mehr einschläft!

Achtung, dieser Blogeintrag könnte zu Konflikten mit Arbeitskollegen oder andere Personen in deinem näheren Umfeld führen! Zwinkerndes Smiley

Wer hat nicht schonmal als Nachtwächter im Museum für angewandte aber noch nicht wertvolle Kunst gearbeitet. Eine fordernde und nervenaufreibende Aufgabe! Dein Kollege hält nicht viel von Konversationen. Er sitzt neben dir mit einer Kaffeevergiftung, und wenn ihn permanent nachgefüllte Koffein nicht munter hält, dann der daraus resultierende Drang gewisse Örtlichkeiten zu – naja – inspizieren.

Während dein Kollege also im Eiltempo die Sitzgelegenheit wechselt, fasst du den Entschluss nicht so enden zu wollen. Dennoch musst du den Schlaf besiegen, um deinen Job zu behalten. Zum Glück hast du da den PC mit der Überwachungssoftware, auf dem ein JDK installiert ist. Da lässt sich sicher eine Lösung finden.

Beep!

Leider finden sich keine Sounddatein auf dem Rechner, so musst du dir selbst weiterhelfen. Daher erzeugst du einen Ton über das awt Toolkit.

import java.awt.Toolkit;

public class Beep {
	private static Beep singleton = null;
	private Toolkit defaultToolkit;

	public static Beep getInstance() {
		if (singleton == null) {
			singleton = new Beep();
		}
		return singleton;
	}

	private Beep() {
		this.defaultToolkit = Toolkit.getDefaultToolkit();
	}

	public void beep() {
		this.defaultToolkit.beep();
	}

	public static void main(String args[]) {
		Beep b = Beep.getInstance();
		b.beep();
	}

}

Jetzt hast du bereits ein Geräusch das dich munter halten kann, dein Kollege schaut dich schon verwundert an, nimmt einen Schluck Kaffee und beschließt dich wieder zu ignorieren. Doch wie schaffst du nun dass das Programm die ganze Schicht lang der Störfaktor ist, den du dir erhoffst? Die Rechte es als regelmäßiges Service laufen zu lassen hast du im Betriebssystem nicht. Aber auch hier gibt es dank Java einen Ausweg:

Timer und TimerTask

Diese wurden geschaffen um zeitgesteuerte Abläufe zu vereinfachen. TimerTask lässt uns Runnable, also einen eigenen Thread, implementieren und umfasst alle Geschehnisse die auszuführen sind. Timer hingegen bekommt den TimerTask übergeben und sorgt für dessen Ausführung in einem Verwaltungsthread.

import java.util.Timer;
import java.util.TimerTask;

public class KeepMeAwake {

	/**
	 * Schedules an annoying beep every 5 seconds to keep us awake
	 *
	 * @param args
	 */
	public static void main(String[] args) {

		TimerTask action = new TimerTask() {
			public void run() {
				Beep b = Beep.getInstance();
				b.beep();
			}

		};

		Timer caretaker = new Timer();
		caretaker.schedule(action, 1000, 5000);

	}
}

Als erstes wird ein TimerTask erzeugt, indem wir unser vorheriges Beep Objekt nutzen um das Geräusch wiederzugeben. Diesen Task starten wir dann in einem Timer. Dabei beginnen wir mit der Lärmattacke eine Sekunde nach starten des Programms, und lassen uns dann alle 5 Sekunden neu beschallen. Ob das unserem Kollegen gefällt? Egal, uns hält es munter.

Hier noch eine kurze Erklärung zur Timer Klasse:

Die Klasse Timer bietet 4 verschiedene schedule Methoden

  • schedule(TimerTask task, Date time) – startet einen Task zu einem gewissen Zeitpunkt
  • schedule(TimerTask task, long delay) – startet einen Task nach einer angegebenen Anzahl von Millisekunden
  • schedule(TimerTask task, Date firsttime, long period) – startet einen Task zu einem fixen Zeitpunkt und wiederholt ihn dann nach der zusätzlich angegebenen Anzahl von Millisekunden regelmäßig
  • schedule(TimerTask task, long delay, long period) – startet einen Task nach einer angegebenen Anzahl von Millisekunden und wiederholt ihn dann nach der zusätzlich angegebenen Anzahl von Millisekunden regelmäßig

Die letzten beiden Varianten gibt es noch zusätzlich als scheduleAtFixedRate Methoden, die sich um eine exaktere Ausführung bemühen. Dies ist notwendigk so Operationen über einen langen Zeitraum im exakt den gleichbleibenden Intervall ausgeführt werden müssen.

Ein gestarteter Timer kann dann mittels der Methode cancel() wieder beendet werden, wenn er nicht mehr gebraucht wird.

Eine feiner steuerbare Alternative ist der Quartz-Scheduler http://www.quartz-scheduler.org/ Dieser ist freilich Open Source und unter der Apache 2.0 Lizenz nutzbar. Er lässt eine Steuerung von variablen Ausführzeiten und ähnlichem zu und bietet daher ein breiteres Einsatzspektrum. Wenn euch das Thema interessiert, schaut euch diesen doch mal genauer an.

In diesem Sinne – dreht die Lautsprecher voll auf!

Ähnliche Artikel: