Simplest example with py4J

Amelio Vazquez-Reina picture Amelio Vazquez-Reina · Mar 13, 2014 · Viewed 10.8k times · Source

I installed py4J using pip on my conda virtual environment in Python. I wrote a super simple example AdditionApplication.java to test py4J, but it fails to compile, i.e.

javac AdditionApplication.java

fails complaining that GatewayServer is not defined.

I am knowledgeable in Python but unfortunately not in Java. What else do I need to provide?

public class AdditionApplication {

  public int addition(int first, int second) {
    return first + second;
  }

  public static void main(String[] args) {
    AdditionApplication app = new AdditionApplication();
    // app is now the gateway.entry_point
    GatewayServer server = new GatewayServer(app);
    server.start();
  }
}

In case it matters I have the following version of Java installed:

java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

Update 1

After I added: import py4j.GatewayServer; to the top of the file, I got a different error:

package py4j does not exist

Update 2

pip install py4j left a jar file under <PATH_TO_CONDA_ENVIRONMENT>/share/py4j/py4j0.8.1.jar. I have added it to my class path with:

javac -cp <PATH_TO_CONDA_ENVIRONMENT>/share/py4j/py4j0.8.1.jar AdditionApplication.java

and it output

AdditionApplication.class

How do I run it?

Final update and solution:

After applying the previous fixes, I finally run the code with:

java -cp <PATH_TO_CONDA_ENVIRONMENT>/share/py4j/py4j0.8.1.jar AdditionApplication 

the code runs in the background. To test it:

>>> from py4j.java_gateway import JavaGateway
>>> gateway = JavaGateway()                   # connect to the JVM
>>> random = gateway.jvm.java.util.Random()   # create a java.util.Random instance
>>> number1 = random.nextInt(10)              # call the Random.nextInt method
>>> number2 = random.nextInt(10)
>>> print(number1,number2)
(2, 7)
>>> addition_app = gateway.entry_point        # get the AdditionApplication instance
>>> addition_app.addition(number1,number2)    # call the addition method

Answer

Reimeus picture Reimeus · Mar 13, 2014

Import GatewayServer from the py4j package so that the unqualified class can be used in the application

import py4j.GatewayServer;