Intégration rapide d'Apache Karaf (Linux / UNIX)

Intégration d'Apache Karaf OSGi Runtime 4.4.x (Linux / UNIX)

Cette page décrit les étapes pour démarrer rapidement avec Apache Karaf 4.4.11. Les autres versions devraient fonctionner de manière similaire.

Karaf a mis en place une méthode pour fonctionner avec le Java Service Wrapper depuis un certain temps, mais il utilise actuellement une version très obsolète qui ne prend pas en charge de nombreux systèmes d'exploitation et architectures modernes. Le Wrapper a considérablement évolué depuis, et une mise à niveau est fortement recommandée. Consultez les instructions du Service Wrapper par défaut si cela vous intéresse, mais nous ne les utiliserons pas ici. Suivre ces instructions ajouterait des fichiers supplémentaires qui pourraient prêter à confusion.

Télécharger Karaf

Téléchargez Karaf OSGi Runtime au format tar.gz depuis leur page de téléchargement. Nous travaillerons avec apache-karaf-4.4.11.tar.gz.

Extraire l'archive pour obtenir un répertoire apache-karaf-4.4.11, et éventuellement le renommer selon vos préférences de travail.

Télécharger le Wrapper

Les étapes suivantes sont conçues pour fonctionner avec la version 3.7.0 du Java Service Wrapper. L'utilisation de versions antérieures est possible, mais nécessitera probablement quelques modifications.

Décidez de l'édition à utiliser (Professional, Standard ou Community), et sélectionnez la plateforme cible, le nombre de bits et l'architecture. Puis téléchargez l'installateur ou l'archive et installez-le ou extrayez-le. Nous supposerons que vous utilisez l'édition Professional 64 bits sous Linux x86.

Intégration du Wrapper

Pour faciliter le placement des fichiers Wrapper requis, créez le script shell suivant dans votre répertoire apache-karaf-4.4.11 extrait, sous le nom updateWrapper.sh. Mettez à jour l'emplacement où vous avez installé ou extrait le Wrapper ci-dessus. N'oubliez pas de le rendre exécutable.

#!/bin/sh
WRAPPER_HOME=../wrapper-linux-x86-64-3.7.0-pro
KARAF_HOME=.
WRAPPER_SCRIPT=karaf-service

mkdir -p ${KARAF_HOME}/lib/wrapper
if [ -d ${WRAPPER_HOME}/lang ]
then
    cp -n ${WRAPPER_HOME}/lang/wrapper_*.mo ${KARAF_HOME}/lib/wrapper/.
    cp -n ${WRAPPER_HOME}/lang/wrapperjni_*.mo ${KARAF_HOME}/lib/wrapper/.
fi
if [ -f ${WRAPPER_HOME}/src/conf/wrapper-license-time.conf ]
then
    cp -n ${WRAPPER_HOME}/src/conf/wrapper-license-time.conf ${KARAF_HOME}/etc/wrapper-license.conf
fi

cp ${WRAPPER_HOME}/bin/wrapper ${KARAF_HOME}/bin/wrapper
cp ${WRAPPER_HOME}/lib/wrapper.jar ${KARAF_HOME}/lib/wrapper/.
cp ${WRAPPER_HOME}/lib/libwrapper.* ${KARAF_HOME}/lib/wrapper/.
cp ${WRAPPER_HOME}/src/bin/App.sh.in ${KARAF_HOME}/bin/${WRAPPER_SCRIPT}

sed -i '' -e 's/@app\.name@/karaf/g' ${KARAF_HOME}/bin/${WRAPPER_SCRIPT}
sed -i '' -e 's/@app\.long\.name@/Karaf Server/g' ${KARAF_HOME}/bin/${WRAPPER_SCRIPT}
sed -i '' -e 's/\.\.\/conf\/wrapper.conf/\.\.\/etc\/wrapper.conf/g' ${KARAF_HOME}/bin/${WRAPPER_SCRIPT}
chmod +x ${KARAF_HOME}/bin/${WRAPPER_SCRIPT}

Exécutez le script :

./updateWrapper.sh

La configuration utilise la méthode d'intégration 1.

NOTE

- La variable JAVA_HOME doit être définie, mais elle prendra par défaut la valeur de l'environnement système si elle y est définie. La série Karaf 4.4.x nécessite qu'un minimum de Java 11 soit spécifié.

- La variable KARAF_VERSION doit correspondre à la version spécifique de Karaf en cours d'exécution.

Créez le fichier de configuration du Wrapper sous le nom etc/wrapper.conf avec le contenu suivant :

@encoding=UTF-8
# The configuration file must begin with a line declaring its encoding.

# Default mode for file inclusions
@include.default_mode=required

# Include file problems can be debugged by removing '#' at the beginning
#  of the following line:
#@include.debug

#********************************************************************
# Wrapper License Properties (Ignored by Community Edition)
#********************************************************************
# Professional and Standard Editions of the Wrapper require a valid
#  License Key to start.  Licenses can be purchased or a trial license
#  requested on the following pages:
# https://wrapper.tanukisoftware.com/purchase
# https://wrapper.tanukisoftware.com/trial

# The Wrapper will look for either of the following optional files for a
#  valid License Key.  License Key properties can optionally be included
#  directly in this configuration file.
@include.optional %WRAPPER_CONF_DIR%/wrapper-license.conf
@include.optional %WRAPPER_CONF_DIR%/wrapper-license-%WRAPPER_HOST_NAME%.conf

# The following property will output information about which License Key(s)
#  are being found, and can aid in resolving any licensing problems.
#wrapper.license.debug=TRUE

#********************************************************************
# Environment
#********************************************************************
set.default.JAVA_HOME=(SetMe)
set.KARAF_VERSION=4.4.11
set.KARAF_HOME=%WRAPPER_BIN_DIR%/..
set.KARAF_BASE=%WRAPPER_BIN_DIR%/..
set.KARAF_DATA=%KARAF_BASE%/data
set.KARAF_ETC=%KARAF_BASE%/etc
set.KARAF_LOG=%KARAF_BASE%/data/log

# Change the working dir used by java so Karaf is in its expected location.
#  Setting KARAF_BASE relative to the fixed WRAPPER_BIN_DIR location helps make their meaning clear and avoid confusion when changing the working dir.
wrapper.working.dir=%KARAF_BASE%

#********************************************************************
# Wrapper Localization
#********************************************************************
# Specify the language and locale which the Wrapper should use.
#wrapper.lang=en_US # en_US or ja_JP

# Specify the location of the language resource files (*.mo).
wrapper.lang.folder=%KARAF_HOME%/lib/wrapper

#********************************************************************
# Wrapper Java Properties
#********************************************************************
# Java Application
wrapper.java.command=%JAVA_HOME%/bin/java

# Tell the Wrapper to log the full generated Java command line.
#wrapper.java.command.loglevel=INFO

# Wrapper Jar file
wrapper.jarfile=%KARAF_HOME%/lib/wrapper/wrapper.jar

# Java Version control
wrapper.java.version.output=true
wrapper.java.version.min=11
#wrapper.java.version.max=

# Log level for notices about missing Java Classpath entries.
wrapper.java.classpath.missing.loglevel=WARN

# Java Classpath.  Add class path elements as needed starting from 1
wrapper.java.classpath.1=%KARAF_BASE%/lib/boot/*.jar
wrapper.java.classpath.2=%KARAF_BASE%/lib/jdk9plus/*.jar

# Java Modulepath. (Requires Java 9 or above)
#  Add module path elements as needed starting from 1
#wrapper.java.module_path.1=

# Java Module list. (Requires Java 9 or above)
#  Add module names as needed starting from 1
#wrapper.java.module.1=

# Java Library Path (location of wrapper.dll or libwrapper.so)
wrapper.java.library.path.1=%KARAF_HOME%/lib/wrapper

# Java Bits.  On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
wrapper.java.additional.auto_bits=TRUE

# Java Additional Parameters

#  Module configuration
wrapper.java.additional.1=--add-reads=java.xml=java.logging
wrapper.java.additional.2=--add-exports=java.base/org.apache.karaf.specs.locator=java.xml,ALL-UNNAMED
wrapper.java.additional.3=--patch-module java.base=%KARAF_HOME%/lib/endorsed/org.apache.karaf.specs.locator-%KARAF_VERSION%.jar
wrapper.java.additional.4=--patch-module java.xml=%KARAF_HOME%/lib/endorsed/org.apache.karaf.specs.java.xml-%KARAF_VERSION%.jar
wrapper.java.additional.5=--add-opens java.base/java.security=ALL-UNNAMED
wrapper.java.additional.6=--add-opens java.base/java.net=ALL-UNNAMED
wrapper.java.additional.7=--add-opens java.base/java.lang=ALL-UNNAMED
wrapper.java.additional.8=--add-opens java.base/java.util=ALL-UNNAMED
wrapper.java.additional.9=--add-opens java.naming/javax.naming.spi=ALL-UNNAMED
wrapper.java.additional.10=--add-opens java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED
wrapper.java.additional.11=--add-exports=java.base/sun.net.www.protocol.file=ALL-UNNAMED
wrapper.java.additional.12=--add-exports=java.base/sun.net.www.protocol.ftp=ALL-UNNAMED
wrapper.java.additional.13=--add-exports=java.base/sun.net.www.protocol.http=ALL-UNNAMED
wrapper.java.additional.14=--add-exports=java.base/sun.net.www.protocol.https=ALL-UNNAMED
wrapper.java.additional.15=--add-exports=java.base/sun.net.www.protocol.jar=ALL-UNNAMED
wrapper.java.additional.16=--add-exports=java.base/sun.net.www.content.text=ALL-UNNAMED
wrapper.java.additional.17=--add-exports=jdk.xml.dom/org.w3c.dom.html=ALL-UNNAMED
wrapper.java.additional.18=--add-exports=jdk.naming.rmi/com.sun.jndi.url.rmi=ALL-UNNAMED
wrapper.java.additional.19=--add-exports=java.rmi/sun.rmi.registry=ALL-UNNAMED
wrapper.java.additional.20=--add-exports=java.security.sasl/com.sun.security.sasl=ALL-UNNAMED
wrapper.java.additional.21=--add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED 

#  Additional java configuration
wrapper.java.additional.30=-Djava.io.tmpdir=%KARAF_DATA%/tmp
wrapper.java.additional.31=-Djava.util.logging.config.file=%KARAF_ETC%/java.util.logging.properties

# Uncomment to enable jmx
#wrapper.java.additional.40=-Dcom.sun.management.jmxremote.port=1616
#wrapper.java.additional.41=-Dcom.sun.management.jmxremote.authenticate=false
#wrapper.java.additional.42=-Dcom.sun.management.jmxremote.ssl=false

# Uncomment to enable YourKit profiling
#wrapper.java.additional.43=-Xrunyjpagent

# Uncomment to enable remote debugging
#wrapper.java.additional.44=-Xdebug -Xnoagent -Djava.compiler=NONE
#wrapper.java.additional.45=-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005

# Initial Java Heap Size (in MB)
#wrapper.java.initmemory=3

# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=512

# Application System Properties passed via the backend.
#  Core Java System Properties must be passed using wrapper.java.additional.<n>.
wrapper.app.property.1=karaf.instances=%KARAF_HOME%/instances
wrapper.app.property.2=karaf.home=%KARAF_HOME%
wrapper.app.property.3=karaf.base=%KARAF_BASE%
wrapper.app.property.4=karaf.data=%KARAF_DATA%
wrapper.app.property.5=karaf.etc=%KARAF_ETC%
wrapper.app.property.6=karaf.log=%KARAF_LOG%
wrapper.app.property.7=karaf.restart.jvm.supported=true
wrapper.app.property.10=karaf.startLocalConsole=false
wrapper.app.property.11=karaf.startRemoteShell=true

# Java Main class.  This class must implement the WrapperListener interface
#  or guarantee that the WrapperManager class is initialized.
#  Helper classes are provided to do this for you.
#  See the following page for details:
#  https://wrapper.tanukisoftware.com/doc/english/integrate.html
#wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperStartStopApp
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

# Application parameters.
#  Pass parameters via the backend instead of the command line.
#wrapper.app.parameter.backend=TRUE

#  Add parameters as needed starting from 1
wrapper.app.parameter.1=org.apache.karaf.main.Main
wrapper.app.parameter.2=start

#********************************************************************
# Wrapper Logging Properties
#********************************************************************
# Enables Debug output from the Wrapper.
# wrapper.debug=TRUE

# Format of output for the console.  (See docs for formats)
wrapper.console.format=PM

# Log Level for console output.  (See docs for log levels)
wrapper.console.loglevel=INFO

# Log file to use for Wrapper output logging.
wrapper.logfile=%KARAF_LOG%/wrapper.log

# Format of output for the log file.  (See docs for formats)
wrapper.logfile.format=LPTM

# Log Level for log file output.  (See docs for log levels)
wrapper.logfile.loglevel=INFO

# Roll mode of the log file.
#  SIZE_OR_WRAPPER causes the file to be rolled whenever its size exceeds the
#  value defined by wrapper.logfile.maxsize, or whenever the Wrapper is
#  launched.
wrapper.logfile.rollmode=SIZE_OR_WRAPPER

# Maximum size that the log file will be allowed to grow to before
#  the log is rolled. Size is specified in bytes.  The default value
#  of 0 disables log rolling.  May abbreviate with the 'k' (kb) or
#  'm' (mb) suffixes.  For example: 10m = 10 megabytes.
wrapper.logfile.maxsize=10m

# Maximum number of rolled log files which will be allowed before old
#  files are deleted.  The default value of 0 implies no limit.
wrapper.logfile.maxfiles=9

# Log Level for sys/event log output.  (See docs for log levels)
wrapper.syslog.loglevel=NONE

#********************************************************************
# Wrapper General Properties
#********************************************************************
# Allow for the use of non-contiguous numbered properties
wrapper.ignore_sequence_gaps=TRUE

# Do not start if the pid file already exists.
wrapper.pidfile.strict=TRUE

# Title to use when running as a console
wrapper.console.title=Apache Karaf

#********************************************************************
# Wrapper JVM Checks
#********************************************************************
# Detect DeadLocked Threads in the JVM. (Requires Standard Edition)
wrapper.check.deadlock=TRUE
wrapper.check.deadlock.interval=60
wrapper.check.deadlock.action=RESTART
wrapper.check.deadlock.output=FULL

# Out Of Memory detection.
#  Ignore -verbose:class output to avoid false positives.
wrapper.filter.trigger.1000=[Loaded java.lang.OutOfMemoryError
wrapper.filter.action.1000=NONE
#  Ignore -Xlog:class+load=level output to avoid false positives.
wrapper.filter.trigger.1001=[class,load] java.lang.OutOfMemoryError
wrapper.filter.action.1001=NONE
# (Simple match)
wrapper.filter.trigger.1002=java.lang.OutOfMemoryError
# (Only match text in stack traces if -XX:+PrintClassHistogram is being used.)
#wrapper.filter.trigger.1002=Exception in thread "*" java.lang.OutOfMemoryError
#wrapper.filter.allow_wildcards.1002=TRUE
wrapper.filter.action.1002=RESTART
wrapper.filter.message.1002=The JVM has run out of memory.

#********************************************************************
# Wrapper Email Notifications. (Requires Professional Edition)
#********************************************************************
# Common Event Email settings.
#wrapper.event.default.email.debug=TRUE
#wrapper.event.default.email.smtp.host=<SMTP_Host>
#wrapper.event.default.email.smtp.port=25
#wrapper.event.default.email.subject=[%WRAPPER_HOSTNAME%:%WRAPPER_NAME%:%WRAPPER_EVENT_NAME%] Event Notification
#wrapper.event.default.email.sender=<Sender email>
#wrapper.event.default.email.recipient=<Recipient email>

# Configure the log attached to event emails.
#wrapper.event.default.email.maillog=ATTACHMENT
#wrapper.event.default.email.maillog.lines=50
#wrapper.event.default.email.maillog.format=LPTM
#wrapper.event.default.email.maillog.loglevel=INFO

# Enable specific event emails.
#wrapper.event.wrapper_start.email=TRUE
#wrapper.event.jvm_prelaunch.email=TRUE
#wrapper.event.jvm_start.email=TRUE
#wrapper.event.jvm_started.email=TRUE
#wrapper.event.jvm_deadlock.email=TRUE
#wrapper.event.jvm_stop.email=TRUE
#wrapper.event.jvm_stopped.email=TRUE
#wrapper.event.jvm_restart.email=TRUE
#wrapper.event.jvm_failed_invocation.email=TRUE
#wrapper.event.jvm_max_failed_invocations.email=TRUE
#wrapper.event.jvm_kill.email=TRUE
#wrapper.event.jvm_killed.email=TRUE
#wrapper.event.jvm_unexpected_exit.email=TRUE
#wrapper.event.wrapper_stop.email=TRUE

# Specify custom mail content
wrapper.event.jvm_restart.email.body=The JVM was restarted.\n\nPlease check on its status.\n

#********************************************************************
# Wrapper Secure File Properties
#********************************************************************
# To enforce the principle of least privilege for files containing
#  sensitive data, the Wrapper requires that all permissions granted
#  to these files be explicitly allowed in the configuration.
#  Please read the documentation for the full list of properties.

# Allow specific accounts or groups on Windows.
#wrapper.secure_file.check.windows.allowed_account.1=NT AUTHORITY\SYSTEM
#wrapper.secure_file.check.windows.allowed_account.2=BUILTIN\Administrators

# Allow specific groups on Unix systems.
#wrapper.secure_file.check.unix.allowed_group.1=<Group_Of_Users>

# Additional files to check for permissions (Requires Standard Edition)
#wrapper.secure_file.additional.1=<Secured_File>

#********************************************************************
# Wrapper Windows Service Properties
#********************************************************************
# WARNING - Do not modify any of these properties when an application
#  using this configuration file has been installed as a service.
#  Please uninstall the service before modifying this section.
#  The service can then be reinstalled.

# Name of the service
wrapper.name=karaf

# Display name of the service
wrapper.displayname=Karaf

# Description of the service
wrapper.description=Apache Karaf OSGi Runtime

# Service dependencies.  Add dependencies as needed starting from 1
wrapper.ntservice.dependency.1=

# Mode in which the service is installed.
#  AUTO_START, DELAY_START (Requires Standard Edition) or DEMAND_START
wrapper.ntservice.starttype=AUTO_START

# Account to use when running the service.
#  The default blank value will use LocalSystem, which is highly privileged
#  account on Windows. Please read the documentation page for this property to
#  learn about other account types that can be used.
wrapper.ntservice.account=

# Allow the current user to perform certain actions without being prompted for
#  administrator credentials. (Requires Professional Edition)
#wrapper.ntservice.permissions.1.account=CURRENT_USER
#wrapper.ntservice.permissions.1.allow=START, STOP, PAUSE_RESUME

NOTE

Si vous utilisez la Standard Edition ou la Professional Edition, une licence par défaut de 15 minutes aura été copiée en tant que etc/wrapper-license.conf. Vous devrez la mettre à jour avec une licence Trial, Server ou Development pour l'exécuter plus longtemps.

Exécution

Lorsque vous exécutez avec le Wrapper, vous n'aurez pas accès directement à la console Karaf car celle-ci s'exécutera en mode serveur. Vous devrez donc vous connecter à Karaf via le client ou directement via SSH. Pour ce faire, vous devrez d'abord configurer au moins un utilisateur administrateur dans le fichier etc/users.properties. Il vous suffit de décommenter l'utilisateur karaf et le groupe admingroup. Nous recommandons de modifier le mot de passe pour quelque chose de sécurisé. Comme pour tout ce qui est présenté ici, vous devrez probablement ajuster votre configuration pour une sécurité maximale.


Pour exécuter dans une console :

  • Exécutez : bin/karaf-service console

Pour exécuter en tant que daemon (service) :

  • Installez le service avec : bin/karaf-service install

  • Puis démarrez le service avec : bin/karaf-service start

  • Arrêtez le service avec : bin/karaf-service stop

  • Désinstallez le service avec : bin/karaf-service remove

Pour une liste des commandes disponibles :

  • Exécutez : bin/karaf-service

Lorsque Karaf s'exécute en mode serveur, il n'affiche rien d'utile sur sa console. Cela signifie que le fichier journal du Wrapper ne contiendra que des erreurs ou des sorties Java de bas niveau. La plupart des journaux de Karaf doivent être consultés dans data/log/karaf.log, tandis que le fichier journal du Wrapper se trouve dans data/log/wrapper.log.

Demande de commentaires

Si vous êtes un utilisateur avancé de Karaf et avez des suggestions pour améliorer ce document, veuillez nous en informer à l'adresse support@tanukisoftware.com.

Nous serions bien entendu intéressés par toute méthode permettant d'activer tout ou partie de la sortie console afin que ces informations puissent être enregistrées dans le fichier wrapper.log. Cela permettrait au système de déclencheurs du Wrapper de réagir à la sortie de l'application, d'envoyer des e-mails d'alerte, etc.