2013-04-19 13 views
5

Ich versuche, eine Java-Anwendung als Linux-Dienst mit jsvc auszuführen. Ich fand How to convert a java program to daemon with jsvc?, die mir den größten Teil des Weges bringen konnte, aber ich kämpfe immer noch darum, den Klassenpfad herauszufinden.Mehrere Jars im Jsvc-Klassenpfad verwenden

Ich erhalte die folgenden Fehler auf stderr:

19/04/2013 10:43:18 12233 jsvc.exec error: Cannot find daemon loader org/apache/commons/daemon/support/DaemonLoader

19/04/2013 10:43:18 12231 jsvc.exec error: Service exit with a return value of 1

Es scheint, dass die Laufzeit nicht in der Lage ist, die commons-daemon.jar zu finden.

Meine Anwendung ist so strukturiert, dass mit der Anwendung selbst in einer einzigen JAR-Datei, mit Abhängigkeiten, einschließlich Commons-Daemon in einem Lib-Verzeichnis.

  • daemon-script.sh
  • myapp.jar
  • lib/commons-daemon.jar
  • lib/other-Gläser

Hier sind die jeweiligen Teile meines daemon- script.sh:

LIB_DIR=$(pwd)/lib/*

CLASS_PATH=$(pwd)/myapp.jar

$EXEC -home $JAVA_EXEC -cp $CLASS_PATH:$LIB_DIR -outfile $LOG_OUT -errfile $LOG_ERR -pidfile $PID $1 $CLASS

Ich habe zahlreiche Variationen ausprobiert: relativer Pfad, speci auf lib/commons-daemon.jar verweisen, kein Wildcard, etc. Hat jemand eine Idee wie man das richtig macht?

Auch myapp.jar ist eine selbst-ausführbare jar (meist zu Testzwecken, und ja, ich brauche es immer noch als Dienst ausführen), so dass die manifest.mf enthält die Klassen-Pfad und Main- Klassenattribute Gibt es eine Möglichkeit, jsvc dazu zu bringen, das Manifest zu erkennen?

Antwort

2

Sie können mehrere Jars mit JSVC unter Verwendung von : zwischen ihnen verwenden.

Für Ihr besonderes Problem, wäre die Lösung, die die CLASS_PATH Variable dies sich ändern:

CLASS_PATH=$(pwd)/myapp.jar:$(pwd)/lib/commons-daemon.jar:$(pwd)/lib/other-jars 

Alternativ können Sie alle Gläser in einem Verzeichnis enthalten durch Platzhalter wie folgt aus:

CLASS_PATH=$(pwd)/myapp.jar:$(pwd)/lib/*.jar 

Hoffnung dieses hilft

+0

Meine Laufleistung variiert mit jsvc 1.0.8 (Ubuntu). jsvc würde die Platzhalter nicht berücksichtigen oder einfach die lib/dir angeben. Stattdessen musste ich den Klassenpfad explizit mit "CLASS_PATH = $ (echo" $ LIB_PATH "/ *. Jar | tr '' ':')" konstruieren. Ich lief auch in einen Haken, der versucht, -Dlog4j.configuration anzugeben. Normalerweise gebe ich nur einen absoluten Pfad zur Eigenschaftendatei an, aber um es mit jsvc zu arbeiten, musste ich es als URL mit dem Präfix file: /// schreiben. Ich werde bald auf RHEL testen. – ayang