Programmatically connect
As described in the users guide, Apache Karaf supports remote access to both the console (by embedding a SSHd server) and the management layer.
To the console
You can write a Apache Karaf remote console client in Java (or other language).
Accessing to a remote Apache Karaf console means writing a SSH client. This SSH client can be in pure Java or in another language.
For instance, the bin/client
script starts a SSH client written in Java.
The following code is a simple code to create a SSH client:
import org.apache.sshd.ClientChannel; import org.apache.sshd.ClientSession; import org.apache.sshd.SshClient; import org.apache.sshd.client.future.ConnectFuture; public class Main { public static void main(String[] args) throws Exception { String host = "localhost"; int port = 8101; String user = "karaf"; String password = "karaf"; SshClient client = null; try { client = SshClient.setUpDefaultClient(); client.start(); ConnectFuture future = client.connect(host, port); future.await(); ClientSession session = future.getSession(); session.authPassword(user, password); ClientChannel channel = session.createChannel("shell"); channel.setIn(System.in); channel.setOut(System.out); channel.setErr(System.err); channel.open(); channel.waitFor(ClientChannel.CLOSED, 0); } catch (Throwable t) { t.printStackTrace(); System.exit(1); } finally { try { client.stop(); } catch (Throwable t) { } } System.exit(0); } }
To the management layer
The Apache Karaf management layer uses JMX. Apache Karaf embeds a JMX MBeanServer that you can use remotely.
In order to use the MBeanServer remotely, you have to write a JMX client.
The following example shows a simple JMX client stopping Apache Karaf remotely via the JMX layer:
javax.management.*; public class Main { public static void main(String[] args) throws Exception { JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/karaf-root"); JMXConnector connector = JMXConnectorFactory.connect(url, null); MBeanServerConnection mbeanServer = connector.getMBeanServerConnection(); ObjectName systemMBean = new ObjectName("org.apache.karaf:type=system,name=karaf-root"); mbeanServer.invoke(systemMBean, "halt", null, null); connector.close(); } }