Files
i2p.www/www.i2p2/pages/plugin_spec_de.html

478 lines
26 KiB
HTML

{% extends "_layout.html" %}
{% block title %}Technische Beschreibung I2P-Zusatzprogramme{% endblock %}
{% block content %}
<h2>
Technische Beschreibung, Version 0.16
26.7.2010
</h2>
<p>
Diese Seite wurde zuletzt im August 2010 aktualisiert und bezieht sich auf die Routerversion (I2P-Version) 0.8.
<h3>&Uuml;bersicht</h3>
<p>
Dieses Dokument beschreibt das XPI2P-Dateiformat (in Anlehnung an die XPI-Dateien von Firefox, aber mit einer einfachen
Beschreibungsdatei namens plugin.config statt der XML-Datei install.rdf).
Dieses Dateiformat kommt sowohl bei der Erstinstallation als auch beim Aktualisieren von Zusatzprogrammen zum
Einsatz.
<p>
Des weiteren wird in diesem Dokument erkl&auml;rt, wie der I2P-Router Zusatzprogramme installiert, sowie Richtlinien f&uuml;r
die Entwicklung neuer Zusatzprogramme aufgef&uuml;hrt.
<p>
Die Grundstruktur des XPI2P-Formats ist dieselbe wie bei der Datei i2pupdate.sud (der Routeraktualisierungsdatei);
Benutzer k&ouml;nnen aber Zusatzprogramme auch dann installieren, wenn dem Router der Signierschl&uuml;ssel noch nicht bekannt
ist.
<p>
Die hier beschriebene Verzeichnisstruktur (innerhalb der XPI2P-Datei) erlaubt es, folgende Arten von Zusatzprogrammen
zu installieren:
<ul>
<li>
Webanwendungen
<li>
Neue Eepsites mit cgi-bin und Webanwendungen
<li>
Konsolengestaltungen
<li>
Konsolen&uuml;bersetzungen
<li>
Java-Programme
<li>
Java-Programme, die in einer eigenen JVM laufen
<li>
Beliebiges Shellskripte oder Programme
</ul>
<p>
Zusatzprogramme installieren alle ihre Dateien in ~/.i2p/plugins/Name/ (%APPDIR%\I2P\plugins\Name\ unter Windows).
Der Router verwehrt Installationen in andere Verzeichnisse; es ist Zusatzprogramm jedoch nach dem Start m&ouml;glich,
auf Bibliotheken in anderen Verzeichnissen zuzugreifen.
<p>
Dies ist lediglich eine Ma&szlig;nahme, um die Installation, Deinstallation und Aktualisierung zu vereinfachen
und Konflikte zwischen Zusatzprogrammen zu verhindern.
<p>
Wenn jedoch ein Zusatzprogramm einmal l&auml;uft, ist praktisch keine Abschottung oder Absicherung zwischen
Zusatzprogrammen und dem Router gegeben. Zusatzprogramme laufen in derselben JVM und mit den gleichen Rechten wie
der Router; sie haben vollen Zugriff auf das Dateisystem, den Router, alle Rechte zur Programmausf&uuml;hrung usw.
<h3>Details</h3>
<p>
Beispiel.xpi2p ist eine SUD-Datei mit folgendem Inhalt:
<pre>
Ein Standard-SUD-Vorspann (<i>Header</i>), der den Zip-Daten vorangeht und folgenden Inhalt hat:
40 Byte: <a href="how_cryptography.html#DSA">DSA-Signatur</a>
16 Byte: Zusatzprogrammversion in UTF-8, wenn n&ouml;tig mit Nullen aufgef&uuml;llt
Eine Zip-Datei mit folgendem Inhalt:
plugin.config (PFLICHTDATEI) :
(Standard-I2P-Konfigurationsdatei in UTF-8, die Zeilen im Format Parameter=Wert enth&auml;lt; Kommentare beginnen mit #)
Enthält die folgenden Eintr&auml;ge:
(* = Pflichteintrag)
In einer Aktualisierungsdatei m&uuml;ssen die ersten drei Eintr&auml;ge denen in der Installionsdatei entsprechen.
*name: Name des Programms und gleichzeitig das Installationsverzeichnis
Bei betriebssystemabh&auml;ngigen Zusatzprogrammen werden entsprechende Namenszus&auml;tze empfohlen,
z.B. beispiel-windows und beispiel-linux
*key: <a href="how_cryptography.html#DSA">&Ouml;ffentlicher DSA-Schl&uuml;ssel</a> (172 B64-Zeichen mit einem '=' am Ende)
*signer: Signierer (Empfehlung: deinname@mail.i2p)
*version: Programmversion. Muss in einem Format, das der VersionComparator versteht, angegeben werden, z.B. 1.2.3-4)
- H&ouml;chstens 16 Byte (muss der Version im SUD-Vorspann entsprechen)
- Erlaubte Trennzeichen sind '.', '-' und '_'
- In Aktualisierungsdateien muss die Version h&ouml;her als die der bereits installierten Version sein
Folgende Eintr&auml;ge werden, falls vorhanden, auf der Seite configclients.jsp angezeigt:
- date: Java-Zeit als long-Zahl
- author: Autor; Empfehlung: deinname@mail.i2p
- websiteURL: Adresse der Zusatzprogrammwebseite (http://beispiel.i2p/)
- updateURL: Die Adresse der Aktualisierungsdatei (http://beispiel.i2p/beispiel.xpi2p)
Die Bytes 41-56 von dieser URL werden zur Pr&uuml;fung auf neue Versionen ausgelesen
( Sollte beim Laden der URL die installierte Versionsnummer z.B. in der Form ?currentVersion=1.2.3?... mitgesendet werden?
Nein, wenn die derzeitige Versionsnummer in der URL enthalten sein soll,
kann der Programmierer sie selber in der Konfigurationsdatei in die URL einbauen.
Bei einem Versionswechsel muss daran gedacht werden, auch die URL zu &auml;ndern)
description: Programmbeschreibung
description_xx: Programmebschreibung in der Sprache mit dem K&uuml;rzel xx
license: Die Lizenz, unter der das Zusatzprogramm vertrieben wird
disableStop=true
Voreinstellung ist &#8222;false&#8220;.
Der Wert &#8222;true&#8220; bewirkt, dass der Stoppknopf nicht angezeigt wird.
Diese Einstellung ist zu w&auml;hlen, wenn keine Webanwendungen und keine
anderen Programme mit Stoppargumenten enthalten sind
Folgende Eintr&auml;ge steuern die Darstellung eines Links im &Uuml;bersichtskasten in der Routerkonsole (oben links):
consoleLinkName: Dieser Name erscheint im &Uuml;bersichtskasten
consoleLinkName_xx: Name in der Sprache mit dem K&uuml;rzel xx
consoleLinkURL: Die URL, z.B. /appname/index.jsp
consoleLinkTooltip: Hilfeeinblendung &uuml;ber dem Konsolenlink (Seit I2P 0.7.12-6)
consoleLinkTooltip_xx: Hilfeeinblendung in der Sprache xx (Seit I2P 0.7.12-6)
Folgende Einstellungen beziehen sich auf die Installation:
type: Die Art des Zusatzprogramms oder Zusatzmoduls (Anwendung, Konsolengestaltung, Sprache, Webanwendung usw.). Dieser Parameter ist nicht implementiert und ist wahrscheinlich &uuml;berfl&uuml;ssig.
min-i2p-version
max-i2p-version
min-java-version
min-jetty-version
max-jetty-version
required-platform-OS: Ben&ouml;tigtes Betriebssystem. Nicht implementiert; wird evtl. in einer sp&auml;teren I2P-Version angezeigt, aber nicht &uuml;berpr&uuml;ft.
other-requirements: Andere Installationsvoraussetzungen (nicht implementiert; wird evtl. in einer sp&auml;teren I2P-Version angezeigt, aber nicht &uuml;berpf&uuml;ft)
dont-start-at-install: Bei false wird das Zusatzprogramm nach der Installation automatisch gestartet, bei true nicht. False ist die Standardeinstellung.
router-restart-required: Bei false erscheint nach der Installation eine Meldung, die dar&uuml;ber informiert, dass ein Routerneustart notwendig ist (der Router wird aber nicht automatisch neu gestartet). Bei true erscheint die Meldung nicht. Standardeinstellung ist false.
update-only: Bei true bricht der Installationsvorgang ab, wenn nicht bereits eine Installation vorhanden ist. Standardeinstellung ist false.
install-only: Bei true bricht der Installationsvorgang ab, wenn bereits eine Installation vorhanden ist. Standardeinstellung ist false.
min-installed-version: Mindestens installierte Version, wenn es sich um eine Aktualisierung handelt
max-installed-version: H&ouml;chstens installierte Version, wenn es sich um eine Aktualisierung handelt
depends=plugin1,plugin2,plugin3: Die Zusatzprogramme plugin1, plugin2 und plugin3 werden von diesem Zusatzprogramm vorausgesetzt. Diese Einstellung wurde von Sponge vorgeschlagen und ist nicht implementiert (evtl. schwierig)
depends-version=0.3.4,,5.6.7: Mindestversionen der vorausgesetzten Zusatzprogramme. Nicht implementiert.
Die folgende Einstellung wird von &Uuml;bersetzungs-Zusatzmodulen verwendet, ist aber noch nicht implementiert:
langs=xx,yy,Klingon,...: Gibt die bereitgestellten Sprachen an (xx und yy sind die Landesk&uuml;rzel)
Die folgenden Verzeichnisse sind optional, es muss aber mindestens eines angegeben sein, damit das Zusatzprogramm etwas bewirkt.
console/
locale/
Jar-Dateien mit neuen Resource-Bundles, die &Uuml;bersetzungen f&uml;r mit der I2P-Grundinstallation mitgelieferte Anwendungen enthalten.
Resource-Bundles f&uuml;r das Zusatzprogramm selber geh&ouml;ren in console/webapp/beispiel.war oder lib/beispiel.jar.
themes/
Neue Gestaltungen f&uuml;r die Routerkonsole,
jede in einem eigenen Unterverzeichnis
webapps/
(Bitte wichtige Bemerkungen zu Webanwendungen unten beachten)
War-Dateien
Die War-Dateien werden nach erfolgter Installation gestartet, sofern dies nicht in webapps.config deaktiviert ist.
Der Name der War-Datei muss nicht dem Zusatzprogrammnamen entsprechen.
Die Namen der in der I2P-Grundinstallation enthaltenen War-Dateien sind aber nicht erlaubt.
webapps.config
Diese Datei ist im selben Format wie die webapps.config des Routers.
Dar&uuml;berhinaus k&ouml;nnen hier zus&auml;tzliche Jar-Dateien in $PLUGIN/lib/ oder $I2P/lib dem Webanwendungs-Klassenpfad hinzugef&uuml;gt werden. Beispiel: webapps.warname.classpath=$PLUGIN/lib/beispiel.jar,$I2P/lib/irgendetwas.jar
Hinweis: Derzeit werden die Eintr&auml;ge in der Klassenpfadzeile nur geladen, wenn &lt;warname&gt; dem Namen des Zusatzprogramms entspricht.
Hinweis: Vor der Version 0.7.12-9 erwartete der Router plugin.warname.startOnLoad statt webapps.warname.startOnLoad.
Wird die Kompatibilit&auml;t mit &auml;teren Routerversionen gew&uuml;nscht, wird empfohlen beide Zeilen anzugeben (wenn der automatische Start deaktiviert werden soll).
eepsite/
(Bitte wichtige Bemerkungen zu Eepsites unten beachten)
cgi-bin/
docroot/
logs/
webapps/
jetty.xml
Der Installationscode muss hier Variablen ersetzen, um den Pfad zu setzen.
Der Ort und Name dieser Datei spielt keine Rolle, er muss nur in der clients.config gesetzt sein.
Evtl. ist es bequemer, ein Verzeichnis h&ouml;her zu gehen (so macht es das Zusatzprogramm zzzot).
lib/
Hier k&ouml;nnen Jar-Dateien abgelegt werden und in einem Klassenpfad in console/webapps.config und/oder
clients.config angegeben werden.
clients.config (Diese Datei ist im selben Format wie die clients.config des Routers)
Die hier angegebenen Anwendungen werden gestartet, wenn das Zusatzprogramm startet.
Die Numerierung ist bei 0 zu beginnen (clientApp.0) und jeweils um 1 zu erh&ouml;hen.
Neue Einstellung clientApp.0.stopargs=beispiel xxx stop yyy
Diese Einstellung bewirkt, falls vorhanden, dass die Klasse mit den angegebenen Argumenten aufgerufen wird,
um die Anwendung zu beenden.
Alle Stoppaufrufe erfolgen ohne Verz&ouml;gerung.
Bemerkung: Der Router kann nicht feststellen, ob eine Anwendung gerade l&auml;ft.
Alle Anwendungen m&uuml;ssen daher damit rechnen, gestoppt zu werden, auch wenn die Anwendung gar nicht l&auml;ft.
Selbiges gilt f&uuml;r Anwendungen, die bereits gestartet sind.
Neue Einstellung clientApp.0.uninstallargs=beispiel xxx uninstall yyy
Diese Einstellung bewirkt, falls vorhanden, dass die Klasse mit den angegebenen Argumenten unmittelbar
vor dem L&ouml;schen von $PLUGIN aufgerufen wird.
Alle Stoppaufrufe werden ohne Verz&ouml;gerung durchgef&uuml;hrt.
Neue Einstellung clientApp.0.classpath=$I2P/lib/beispiel.xxx,$PLUGIN/lib/yyy.jar
Der Router ersetzt Variablen in den args- und stopargs-Zeilen wie folgt:
$I2P => I2P-Installations-Grundverzeichnis;
$CONFIG => I2P-Konfigurationsverzeichnis (meist ~/.i2p)
$PLUGIN => Das Installationsverzeichnis des Zusatzprogramms (meist ~/.i2p/plugins/&lt;zusatzprogverzeichnis&gt;)
(Bitte wichtige Anmerkungen bzgl. der Ausf&uuml;hrung von Shellskripten und externen Programmen weiter unten beachten)
</pre>
<h3>Ablauf der Installation eines Zusatzprogrammes
</h3>
<ul>
<li>
Herunterladen der xpi2p-Datei
<li>
Pr&uuml;fen der SUD-Signatur anhand der gespeicherten Schl&uuml;ssel, oder falls kein Schl&uuml;ssel vorhanden:<br/>
- auspacken, &ouml;ff. Schl&uuml;ssel aus der Konfiguration lesen, &uuml;berpr&uuml;fen und Schl&uuml;ssel speichern
<li>
Pr&uuml;fen, ob die ZIP-Datei unversehrt ist
<li>
Die Datei plugin.config auspacken
<li>
Mindest- und H&ouml;chstversion usw. &uuml;berpr&uuml;fen
<li>
Pr&uuml;fung, ob eine der Webanwendungen mit einer in $I2P namensgleich ist
<li>
Vorhandenes Zusatzprogramm stoppen
<li>
Wenn update=false ist: Pr&uuml;fung, ob das Installationsverzeichnis bereits existiert; wenn ja, Benutzer fragen
<li>
Wenn update=true ist: Pr&uuml;fung, ob das Installationsverzeichnis bereits existiert; wenn nein, Benutzer fragen
<li>
In <tt>appDir/plugins/name/</tt> auspacken
<li>
Zu plugins.config hinzuf&uuml;gen
</ul>
<h3>
Ablauf des Startens eines Zusatzprogrammes
</h3>
Anhand plugins.config wird festgestellt, welche gestartet werden m&uuml;ssen.
Dann geschieht jeweils folgendes:
<ul>
<li>
Die Eintr&auml;ge der clients.config (des Zusatzprogramms) werden geladen und gestartet (Jar-Dateien werden in den Klassenpfad aufgenommen)
<li>
Die Eintr&auml;ge in console/webapp and console/webapp.config werden geladen und gestartet (Jar-Dateien werden in den Klassenpfad aufgenommen)
<li>
Falls vorhanden, wird console/locale/xxxxx.jar in den &Uuml;bersetzungs-Klassenpfad aufgenommen
<li>
Falls vorhanden, wird console/theme in den Suchpfad f&uuml;r Konsolengestaltungen aufgenommen
<li>
Im &Uuml;bersichtskasten (oben links in der Konsole) wird ein entspr. Link hinzugef&uuml;gt
</ul>
<h3>
Bemerkungen zu Konsolen-Webanwendungen
</h3>
<p>
Bei Konsolen-Webanwendungen mit Hintergrundverarbeitung wird angeraten, einen ServletContextListener zu implementieren
(siehe Seedless oder I2P-Bote als Beispiele) oder destroy() im Servlet zu &uuml;berschreiben,
so dass die Anwendung richtig beendet werden kann.
Seit der Routerversion 0.7.12-3 werden Konsolen-Webanwendungen immer gestoppt, bevor sie
neu gestartet werden. Man braucht sich daher als Programmierer &uuml;ber mehrfach laufende Anwendungen keine Gedanken machen,
wenn man den obigen Rat beherzigt.
Au&szlig;erdem werden seit der Routerversion 0.7.12-3 Konsolen-Webanwendungen vor dem Beenden des Routers gestoppt.
<p>
Jar-Bibliotheken nicht in die Webanwendung aufnehmen, sondern im Verzeichnis lib/ ablegen und in webapps.config den Klassenpfad entsprechend setzen.
Vorteil: Es kann eine Installations- und eine Aktualisierungsdatei bereitgestellt werden; die Aktualisierungsdatei kommt ohne die Jar-Bibliotheken aus.
<p>
Keine Java- oder JSP-Dateien einbinden, sonst kompiliert sie Jetty bei der Installation neu.
<p>
Derzeit m&uuml;ssen Webanwendungen den gleichen Namen wie das Zusatzprogramm (d.h. das gesamte Paket) haben, wenn Dateien im Verzeichnis $PLUGIN in den Klassenpfad sollen.
Zum Beispiel muss eine Webanwendung im Zusatzprogramm xyz den Dateinamen xyz.war haben.
<h3>
Bemerkungen zu Eepsites
</h3>
<p>
Es ist noch nicht gekl&auml;rt, wie ein Zusatzprogramm in einer bestehenden Eepsite installiert werden soll.
Der Router kann nicht ohne weiteres auf die Eepsite zugreifen, die Eepsite k&ouml;nnte gerade angehalten sein
und es k&ouml;nnten auch mehrere vorhanden sein.
Besser ist es, eine eigene Jetty- und I2PTunnel-Instanz zu starten und dadurch eine ganz neue Eepsite zu schaffen.
<p>
Der Router k&ouml;nnte zwar einen neuen I2PTunnel starten (&auml;hlich wie es die I2PTunnel-Kommandozeilenanwendung tut),
dieser w&uuml;rde aber nicht in der I2PTunnel-Weboberfl&auml;che auftauchen, da es sich um eine andere Instanz handelt.
Das st&ouml;rt aber nicht weiter, denn man kann dann I2PTunnel und Jetty zusammen starten und beenden.
<p>
Es ist also unwahrscheinlich, dass der Router irgendwann die F&auml;higkeit, eine Zusatz-Eepsite mit einer existierenden zu verbinden, erh&auml;lt.
Es wird dazu geraten, einen neuen I2PTunnel mitsamt Jetty aus der clients.config zu starten.
Die besten Beispiele daf&uuml;r sind die Zusatzprogramme zzzot und Pebble,
verf&uuml;gbar auf <a href="http://stats.i2p/i2p/plugins/">der Zusatzprogrammseite von zzz</a> (<i>englisch</i>).
<p>
F: Wie erreicht man, dass Pfade in jetty.xml ersetzt werden?
A: Siehe die Zusatzprogramme zzzot und Pebble als Beispiel.
<h3>
Bemerkungen zum Starten und Stoppen von Anwendungen
</h3>
<p>
Der Router kann nicht feststellen, ob eine Anwendung, die mittels clients.config gestartet wurde, gerade l&auml;ft.
Der Programmierer eines Zusatzprogramms muss daher darauf achten, dass mehrfache Start- oder Stoppaufrufe den Programmablauf nicht st&ouml;ren, sofern dies irgend m&ouml;glich ist.
Erreicht werden kann dies z.B. mit einer statischen Zustandstabelle, PID-Dateien ((PID = Prozessnummer) o.&auml;.
Logausgaben oder Fehlermeldungen bei mehrfachen Start- oder Stoppaufrufen sollten vermieden werden.
Gleiches gilt f&uuml;r Stoppaufrufe ohne vorherigen Startaufruf.
Seit der Routerversion 0.7.12-3 werden Konsolen-Webanwendungen vor dem Beenden des Routers gestoppt,
d.h. es werden alle Anwendungen, die in clients.config einen stopargs-Eintrag haben, beendet -
egal ob sie gestartet wurden.
<h3>
Bemerkungen zu Shellskripten und externen Programmen
</h3>
<p>
Zum Ausf&uuml;hren von Shellskripten und externen Programmen sei auf <a href="http://zzz.i2p/topics/141">zzz.i2p</a> (<i>englisch</i>) verwiesen.
<p>
Damit ein Skript sowohl unter Windows als auch Linux l&auml;ft, empfiehlt es sich,
eine kleine Java-Klasse, die den Betriebssystemtyp &uuml;berpr&uuml;ft und die BAT- bzw. SH-Datei mittels ShellCommand ausf&uuml;hrt, zu schreiben.
<p>
Externe Programme werden vom Router bei dessen Beendigung nicht gestoppt, und beim n&auml;chsten Routerstart
wird eine zweite Instanz gestartet. Um das zu verhindern, kann man das Programm von einer
Java-Klasse oder einem Shellskript ausf&uuml;hren lassen, die Prozessnummer (PID) in einer Datei speichern und
beim n&auml;chsten Start &uuml;berpr&uuml;fen.
<h3>
Weitere Richtlinien f&uuml;r Zusatzprogramme
</h3>
<ul>
<li>
Zum Erzeugen von XPI2P-Dateien siehe den MTN-Zweig i2p.scripts oder eines der Beispiele auf der Zusatzprogrammseite von zzz.
<li>
Das Komprimieren von Jar- und War-Dateien mit Pack200 ist sehr empfehlenswert. Zusatzprogramme werden dadurch im allgemeinen
60-65% kleiner.
Die Zusatzprogramme auf der Seite von zzz k&ouml;nnen hier als Beispiele dienen.
Das Dekomprimieren von Pack200-Dateien wird seit der Routerversion 0.7.11-5 unterst&uuml;tzt, d.h. praktisch alle Router,
die Zusatzprogramme unterst&uuml;tzen, kommen damit klar.
<li>
Zusatzprogramme sollten nicht im Verzeichnisbaum $I2P schreiben, da Schreibrechte nicht unbedingt vorhanden sind und dies
ohnehin grunds&auml;tzlich vermieden werden sollte.
<li>
Zusatzprogramme d&uuml;rfen in $CONFIG schreiben; es wird aber empfohlen, alle Daten in $PLUGIN abzulegen.
Alle Dateien in $PLUGIN werden bei der Deinstallation gel&ouml;scht.
Dateien in anderen Verzeichnissen werden bei der Deinstallation nur dann gel&ouml;scht, wenn das Zusatzprogramm mit einem
uninstallargs-Eintrag in clients.config selber daf&uuml;r sorgt.
Ggf. kann das uninstallargs-Programm den Benutzer fragen, ob die Daten erhalten bleiben sollen.
<li>
$CWD (das Arbeitsverzeichnis) kann &uuml;berall sein. Es ist also falsch, von einem bestimmten Arbeitsverzeichnis auszugehen
oder Dateien relativ zu $CWD zu lesen oder zu schreiben.
<li>
Um in Java-Programmen die verschiedenen Verzeichnisse ermitteln zu k&ouml;nnen, gibt es die get...Dir-Methoden in I2PAppContext.
<li>
Das Zusatzprogrammverzeichnis erh&auml;lt man mit <tt>I2PAppContext.getGlobalContext().getAppDir().getAbsolutePath() + "/plugins/" + appname</tt>,
oder indem man $PLUGIN als Argument in the args-Zeile in clients.config angibt.
Das I2P-Installationsverzeichnis, das Konfigurationsverzeichnis und das Zusatzprogrammverzeichnis lassen sich einzig &uuml;ber
die Kontext-Klassen in i2p.jar verl&auml;sslich ermitteln.
<li>
Zum Erzeugen von Signierschl&uuml;sseln, zum &Uuml;berpr&uuml;fen von Signaturen und zum Erzeugen von SUD-Dateien siehe <a href="http://zzz.i2p/topics/16">hier</a>.
<li>
Alle Konfigurationsdateien m&uuml;ssen in UTF-8 kodiert sein.
<li>
Um ein Programm in einer separaten JVM (Virtuelle Java-Maschine) laufen zu lassen, ruft man
<tt>ShellCommand</tt> mit <tt>java -cp xxx:yyy:zzz abc.beispiel.class arg1 arg2 arg3</tt> auf.
Das Beenden des Programms wird dadurch schwieriger; es empfiehlt sich hier wieder, die Prozessnummer in einer Datei
zu speichern.
<li>
Als Alternative zum stopargs-Parameter in clients.config gibt es f&uuml;r Java-Programme die M&ouml;glichkeit,
mittels I2PAppContext.addShutdownTask() bei der Routerbeendigung Aufr&auml;umarbeiten verrichten zu lassen und
externe Programme zu beenden.
Bei der Aktualisierung eines Zusatzprogrammes wird dieses aber dann nicht beendet, weshalb stopargs vorzuziehen ist.
Alle Ausf&uuml;hrungsstr&auml;nge (<i>Threads</i>) sollten im Daemon-Modus laufen.
<li>
Es ist darauf zu achten, keine Klassenbezeichner zu w&auml;hlen, die mit den Klassen- und Paketnamen in der Grundinstallation
kollidieren. Au&szlig;erdem sollte in der Grundinstallation vorhandene Funktionalit&auml;t nicht neu implementiert werden,
sondern die jeweilige(n) Klasse(n) vererbt werden.
<li>
Vorsicht mit Klassenpfaden in der wrapper.config, diese werden in alten Versionen anders behandelt. Siehe den Abschnitt &uuml;ber
Klassenpfade weiter unten.
<li>
Gleiche Signierschl&uuml;ssel mit abweichenden Namen werden abgewiesen, ebenso wie gleiche Namen f&uuml;r
unterschiedliche Schl&uuml;ssel und abweichende Schl&uuml;ssel / Namen in Aktualisierungspaketen.
Deshalb Signierschl&uuml;ssel sicher verwahren und sie nur einmal erzeugen.
<li>
Plugin.config nicht zur Laufzeit ver&auuml;ndern, da sie beim Aktualisieren &uuml;berschrieben wird.
Besser ist es, Laufzeitdaten in einer anderen Konfigurationsdatei im gleichen Verzeichnis zu speichern.
<li>
In der Regel ist es nicht notwendig, dass Zusatzprogramme auf $I2P/lib/router.jar zugreifen.
In einer sp&auml;teren Version wird der Router evtl. den Klassenpfad f&uuml;r Zusatzprogramme einschr&auml;nken und den Zugriff auf Routerklassen verhindern.
Deshalb sollte m&ouml;glichst nicht auf Routerklassen zugegriffen werden.
<li>
Wie erw&auml;hnt muss jede Version h&ouml;her als die vorherige sein. Zu diesem Zweck kann man im Kompilierskript eine fortlaufende Nummer an die Versionsbezeichnung anh&auml;ngen.
Das Testen wird dadurch erleichtert. Die meisten Zusatzprogramme von zzz verfahren so; als Beispiel kann man sich an der jeweiligen build.xml orientieren.
<li>
Zusatzprogramme d&uuml;rfen unter keinen Umst&auml;nden System.exit() aufrufen.
<li>
Wenn Fremdsoftware eingebunden wird, bitte die Lizenzbedingungen einhalten.
</ul>
<h3>
Klassenpfade
</h3>
Die folgenden Jar-Dateien in $I2P/lib sind bei allen I2P-Installationen im Standard-Klassenpfad vorhanden, egal wann I2P urspr&uuml;nglich installiert wurde:
<p>
i2p.jar, router.jar, jbigi.jar, sam.jar, mstreaming.jar, streaming.jar, i2ptunnel.jar,
org.mortbay.jetty.jar, javax.servlet.jar, jasper-compiler.jar, jasper-runtime.jar,
commons-logging.jar, commons-el.jar, wrapper.jar, systray.jar, systray4j.jar
<p>
Alles, was nicht in der obigen Liste aufgef&uuml;hrt ist, kann nicht allgemein als vorhanden vorausgesetzt werden, auch wenn es im eigenen Klassenpfad vorhanden ist.
Wenn eine Jar-Datei, die oben nicht aufgef&uuml;hrt ist, ben&ouml;tigt wird, f&uuml;gt man $I2P/lib/beispiel.jar in den Klassenpfad in der
clients.config oder webapps.config des Zusatzprogramms ein.
<p>
Anfangs waren Klassenpfadeintr&auml;ge in der clients.config in der ganzen JVM (der virtuellen Java-Maschine) verf&uuml;gbar.
Seit der Version 0.7.13-3 ist der Klassenpfad in der clients.config nur in dem entsprechenden Ausf&uuml;hrungsstrang (<i>Thread</i>)
verf&uuml;gbar, wie es auch urspr&uuml;nglich beabsichtigt war. Dies wird mittels eines speziellen Klassenladers erreicht.
Zu Details siehe auch den Abschnitt &uuml;ber JVM-Abst&uuml;rze weiter unten und <a href="http://zzz.i2p/topics/633">diesen Diskussionsstrang auf zzz.i2p</a>.
Es ist daher f&uuml;r jede Anwendung der volle Klassenpfad anzugeben.
<h3>
Bemerkungen zu Java-Versionen
</h3>
Die meisten Benutzer lassen I2P zwar unter Java 1.6 (auch unter dem Namen Java 6 bekannt),
I2P unterst&uuml;tzt aber auch Java 1.5 (Java 5).
Wenn keine 1.6-spezifische Funktionalit&auml;t ben&ouml;tigt wird, sollten Zusatzprogramme
so geschrieben werden, dass sie auch unter 1.5 laufen.
<p>
Wenn ein Zusatzprogramm <b>nicht auf 1.6 beschr&auml;nkt sein soll</b>,
<ul>
<li>
m&uuml;ssen alle Java- und JSP-Dateien mit der Einstellung <tt>source="1.5" target="1.5"</tt> kompiliert werden, und
<li>
alle eingebundenen Jar-Bibliotheken m&uuml;ssen ebenfalls f&uuml;r 1.5 kompiliert sein.
<li>
Wenn Pack200 eingesetzt wird, f&uuml;hren 1.6-Klassen in Jar-Dateien dazu, dass Pack200 das neuere 1.6-Packformat
verwendet und die Installation des Zusatzprogramms unter Java 1.5 mit der irref&uuml;hrenden Meldung &#8222;Zusatzprogramm ist korrupt&#8220;
scheitert.
</ul>
<p>
Wenn ein Zusatzprogramm <b>1.6 erfordert</b>,
<ul>
<li>
Sollte darauf auf der Seite, von der das Programm bezogen werden kann, hingewiesen werden, und
<li>
Die Einstellung <tt>min-java-version=1.6</tt> in der plugin.config gesetzt werden.
<li>
Wenn Pack200 eingesetzt wird, schl&auml;gt die Installation des Zusatzprogramms unter Java 1.5 mit der
irref&uuml;hrenden Meldung &#8222;Zusatzprogramm ist korrupt&#8220; fehl.
</ul>
<h3>
JVM-Abst&uuml;rze beim Aktualisieren
</h3>
Bemerkung: Dies m&uuml;sste inzwischen alles behoben sein.
<p>
Die JVM (virtuelle Java-Maschine) st&uuml;rzt gelegentlich ab, wenn in einem Zusatzprogramm enthaltene Jar-Dateien
aktualisiert werden und das Zusatzprogramm seit dem Start von I2P gestartet wurde (auch wenn es danach wieder
beendet wurde).
Dies ist m&ouml;glicherweise durch den neuen Klassenlader in 0.7.13-3 behoben worden, k&ouml;nnte aber auch weiterhin
bestehen und muss noch genauer untersucht werden.
<p>
Am sichersten ist es, wenn man im Zusatzprogramm die Jar-Datei in der War-Datei ausliefert (im Falle einer Webanwendung)
oder nach der Aktualisierung f&uuml;r einen Neustart sorgt, oder die Jar-Dateien des Zusatzprogramms gar nicht
aktualisiert.
<p>
Aufgrund der Funktionsweise von Klassenladern in Webanwendungen sind externe Jar-Dateien <b>vermutlich</b> ungef&auml;hrlich,
wenn der Klassenpfad in der webapps.config angegeben wird.
Um dar&uuml;ber eine sichere Aussage treffen zu k&ouml;nnen, sind aber weitere Tests n&ouml;tig.
Es wird davon abgeraten, den Klassenpfad mit einer Pseudoanwendung in clients.config anzugeben, wenn er nur f&uuml;r eine
Webanwendung ben&ouml;tigt wird; webapps.config ist in dem Fall der geeignete Ort.
<p>
Am problematischsten sind Anwendungen mit Jar-Dateien, die im Klassenpfad in der clients.config angegeben werden. Offenbar
verursacht das die meisten Abst&uuml;rze.
<p>
Bei der Erstinstallation tritt keines dieser Probleme auf, es ist also nicht n&ouml;tig, nach der Erstinstallation eines Zusatzprogramms
einen Neustart zu veranlassen.
{% endblock %}