Usage

Remote Machine (Raspberry Pi or Headless Remote Server)

On remote machine start the agent with:

java -jar remotevmlauncher-agent.jar

from any directory you would like cache directory to be created in. Home directory is ideal place. If no "--listen" option is specified it will listen on default 0.0.0.0 address on port 8999. For more details you can always used --help:

$ java -jar remotevmlauncher-agent.jar --help
Remote VM Launch Agent usage:

java -jar remotevmlauncher-agent.jar {options}

Options:

  -l|--listen [address:]port  listen on defined address and port. Default: 0.0.0.0:8999
  -e|--executable path        path to java executable. Default: java (it must be in path)
  -d|--debug level            debug level from 0 to 4. Default: 1
  -h|--help                   this help.

The latest version of the agent can be downloaded from here or check downloads agent section.

Development Machine (The Client)

New, remote JVMs can be started from the development machine (the client) by adding client jar to launcher's classpath and invoking org.ah.java.remotevmlauncher.client.LaunchRemote main class, passing remote machine's address and port (8999), application's main class name and application's arguments.

First argument of org.ah.java.remotevmlauncher.client.LaunchRemote is remote machine's address and port. The agent must be already running on that machine. Default port value is 8999.

Second argument is your application's main class.

Following is "--" and then all are passed and your application's arguments.

Classpath of JVM running org.ah.java.remotevmlauncher.client.LaunchRemote is going to be pushed to the remote machine (through the agent) - so if your application's classpath is needed to be defined as you would normally as org.ah.java.remotevmlauncher.client.LaunchRemote will read it of parent URLClassLoader.

If there is anything specially to be added to the classpath on the remote machine, that portion of the classpath can be set through "--remote-classpath" (or "-rcp") options of org.ah.java.remotevmlauncher.client.LaunchRemote. Those options are to be specified before any arguments. Each "--remote-classpath" (or "-rcp") option represents only one classpath segment, so if you need more then use that option as many times you need it.

Development Machine (The Client)

If you need to debug your remote application, you can use "--remote-debug-port" (or "-rdp") argument. WHen port is specified, remote JVM is going to be started with

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=(y|n),address=<port>

where "suspend" is set to "y" if you specify "--remote-debug-suspend" (or "-rds") option (alternatively it will stay "n"). So, for example, your set of arguments passed to org.ah.java.remotevmlauncher.client.LaunchRemote, if you want remote JVM to be started in suspended debug mode, on port 5001 could look like:

<remote-machine-ip-or-hostname>:8999
<your-main-class-name>
--remote-debug-port 5001
--remote-debug-suspend
--
arg1
arg2
arg3

Development (Eclipse) Launcher Example

For example in Eclipse, create new launcher for main class org.ah.pi.test.Clock which is going to display temperature using "/sys/bus/w1/devices/28-000004d41cd5/w1_slave" (argument passed to the main class), on machine with hostname "pi2" of default port of 8999:

/images/remotevm/eclipse-launch-mainclass.png

Set arguments:

/images/remotevm/eclipse-launch-arguments.png

And add remote launcher jar:

/images/remotevm/eclipse-launch-classpath.png

Note: Project clock, in this case, has all needed dependencies in the classpath (pi4j for instance) and they are, in this case, passed from development machine to the Raspberry Pi. That included all the native jars and .so libraries (included in pi4j project). To achieve that I needed to copy portion of pi4j .m2/repository dir to my development machine's .m2/repository.

Development (Remote Launcher's Help)

For more details you can always used --help:

$ java -jar remotevmlauncher-client/target/remotevmlauncher-client.jar --help
Remote VM Launcher usage:

java -jar remotevmlauncher-client.jar {options} [address:]port mainClass

Options:

  -rcp|--remote-classpath classpath-entry
                      classpath entry as seen from remote machine
                      where agent is running.
  -ecp|--exclude-classpath classpath-entry");
                      classpath entry not to be send to the remote
                      machine where agent is running.
  -d|--debug level    debug level from 0 to 4. Default: 0
  -rdp|--remote-debug-port port
                      If port is specified remote VM will be launched
                      in debug mode at the specified port.
  -rds|--remote-debug-suspend
                      If port is specified and if this flag as well
                      remote VM will be suspended.
  -h|--help           this help.

If launcher is used from an IDE, and
   org.ah.java.remotevmlauncher.client.LaunchRemote class is directly used as
main class, then supplied classpath will automatically used (provided that it
is defined as URLClassLoader or descendant class) on the remote side.

Note: if remote debug port is specified launcher's VM is started with:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=(y|n),address=<port>
depending on port and if suspend is specified or not.

The lastest version of the client or remote launcher can be downloaded from here or remote launcher section of downloads.