How run a simple Java program with the client/server Nailgun (on Debian Stretch)?

1.5k Views Asked by At

I'm try to use Nailgun on Debian GNU/Linux 9 (stretch).

"Nailgun is a client, protocol, and server for running Java programs from the command line without incurring the JVM startup overhead. Programs run in the server (which is implemented in Java), and are triggered by the client (written in C), which handles all I/O."

Some documentation found:

I use Oracle Java version 10.0.2 (I also tried with GraalVM 1.0.0-rc9 Java 1.8.0_192).

A simple Java program to test: TestVarargs.java. (At the end I want to run a JAR file, but I had tried with this simple example because that doesn't work.)

$ wget https://bitbucket.org/OPiMedia/hellanguages/raw/default/Java/standard/TestVarargs/TestVarargs.java
$ javac TestVarargs.java
$ java TestVarargs

This program runs correctly.

First try, with the Debian nailgun package (version 0.9.1-3)

Installation:

$ sudo apt-get remove nailgun

Launch the server:

$ java -jar /usr/share/java/nailgun-server.jar &
NGServer 0.9.1 started on all interfaces, port 2113.

Run the client (/usr/bin/ng-nailgun):

$ ng-nailgun ng-version
NailGun server version 0.9.1

But the following doesn't work:

$ ng-nailgun ng-cp
java.lang.ClassCastException: java.base/jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to java.base/java.net.URLClassLoader
    at com.martiansoftware.nailgun.builtins.NGClasspath.nailMain(NGClasspath.java:65)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at com.martiansoftware.nailgun.NGSession.run(NGSession.java:280)

$ ng-nailgun TestVarargs
java.lang.ClassNotFoundException: TestVarargs
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:291)
    at com.martiansoftware.nailgun.NGSession.run(NGSession.java:242)

$ ng-nailgun ng-alias TV TestVarargs
java.lang.ClassNotFoundException: TestVarargs
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:291)
    at com.martiansoftware.nailgun.builtins.NGAlias.nailMain(NGAlias.java:79)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at com.martiansoftware.nailgun.NGSession.run(NGSession.java:280)

The stop command runs correctly:

$ ng-nailgun ng-stop
com.martiansoftware.nailgun.builtins.NGAlias: 2/0
com.martiansoftware.nailgun.builtins.NGClasspath: 5/0
com.martiansoftware.nailgun.builtins.NGServerStats: 0/0
com.martiansoftware.nailgun.builtins.NGStop: 1/1
com.martiansoftware.nailgun.builtins.NGVersion: 1/0
NGServer shut down.

Second try, building from GitHub sources

$ wget https://github.com/facebook/nailgun/archive/master.zip
$ unzip master.zip
$ cd nailgun-master

Compile the server with Maven:

$ mvn clean install
...
[INFO] BUILD SUCCESS
...

Compile the client:

$ make

Launch the server:

$ java -jar nailgun-server/target/nailgun-server-1.0.0.jar &
NGServer 1.0.0 started on all addresses, port 2113.

Run the client:

$ nailgun-client/target/ng ng-version
NailGun server version 1.0.0

But the following doesn't work:

$ nailgun-client/target/ng ng-cp

(Neither output nor error message.)

$ cd ..
$ nailgun-master/nailgun-client/target/ng TestVarargs

(Neither output nor error message.)

$ nailgun-master/nailgun-client/target/ng ng-alias TV TestVarargs

(Neither output nor error message.)

The stop command runs correctly:

$ nailgun-master/nailgun-client/target/ng ng-stop
NGServer shut down.

So, in conclusion, I can install and launch the server. But I can't run any Java program.

1

There are 1 best solutions below

0
On

Assume that your HelloWorld.class exists in the following directory:

/home/28041/ng-sample/com/crazyboy/HelloWorld.class

Before running the class, you need to tell where the class locates by using the following command:

ng ng-cp /home/28041/ng-sample

and then

ng com.crazyboy.HelloWorld