javacmake

How to use CMake to compile and run Java code?


From the command line, the commands that I write in the terminal are:

javac -classpath theClasspath mainClass.java

java -classpath theClasspath mainClass

If so, how can this be achieved?

PS: I do not want to generate a jar file; just to compile the java class and if possible to run it.


I have changed the command. I do not know why the additional text was not displayed. It might be because I used < and >.


Solution

  • CMake has somewhat limited support for compiling Java code and executing Java class files.

    The standard module FindJava can be used to find a JDK installed on the local machine. The standard module UseJava provides a few functions for Java. Among those is a function add_jar to compile Java source files to a jar file.

    Here is a small example that demonstrates how to use add_jar. Given the Java sample source file HelloWorld.java:

    public class HelloWorld {
        public static void main(String[] args) {
            System.out.println("Hello, World!");
        }
    }
    

    The following CMake list file will compile HelloWorld.java to a jar file HelloWorld.jar and also add a CMake test that runs the jar with the JVM:

    cmake_minimum_required (VERSION 2.8)
    
    find_package(Java REQUIRED)
    include(UseJava)
    
    enable_testing()
    
    project (HelloWorld NONE)
    
    set(CMAKE_JAVA_COMPILE_FLAGS "-source" "1.6" "-target" "1.6")
    
    add_jar(HelloWorld HelloWorld.java)
    
    get_target_property(_jarFile HelloWorld JAR_FILE)
    get_target_property(_classDir HelloWorld CLASSDIR)
    
    message(STATUS "Jar file ${_jarFile}")
    message(STATUS "Class compiled to ${_classDir}")
    
    add_test(NAME TestHelloWorld COMMAND ${Java_JAVA_EXECUTABLE} -cp ${_jarFile} HelloWorld)
    

    The CMake variable CMAKE_JAVA_COMPILE_FLAGS can be used to specify compile flags. As a side effect the add_jar command will set target properties JAR_FILE and CLASSDIR that can be used to obtain the path to the generated jar file and the compiled class files directory, respectively.