79693708

Date: 2025-07-08 05:48:28
Score: 1.5
Natty:
Report link

A more robust / complete example:

https://github.com/judfs/so-answer-cmake-java/

include(UseJava)

set(top_package com)
set(java_src 
    com/example/Hello.java
)
set(java_main com/example/Hello)
set(jar_name example-hello)
set(jar_name_sources ${jar_name}-sources)
set(sources_jar ${jar_name_sources}.jar)

add_jar(example-java
    SOURCES ${java_src}
    OUTPUT_NAME ${jar_name}
    ENTRY_POINT ${java_main}
)

install_jar(example-java DESTINATION share/java)


# Make a sources jar.
add_custom_command(
    OUTPUT 
        "${sources_jar}"
    COMMAND 
        # -- Long options are not supported on all java distributions.
        # -- ${Java_JAR_EXECUTABLE} --create --file "${sources_jar}" -C ${CMAKE_CURRENT_SOURCE_DIR} ${top_package}
        ${Java_JAR_EXECUTABLE} cf "${CMAKE_CURRENT_BINARY_DIR}/${sources_jar}" ${top_package}
    WORKING_DIRECTORY
        "${CMAKE_CURRENT_SOURCE_DIR}"
    DEPENDS 
        ${java_src}
    VERBATIM
    COMMENT 
        "Creating sources jar"
)

add_custom_target(example-java-src
    DEPENDS "${sources_jar}"
)
add_dependencies(example-java example-java-src)

install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${sources_jar}" DESTINATION share/java)

I'm not a cmake expert so this might still not be perfect. Please suggest more idiomatic usage.

This incantation of jar has been tested with cross platform CI in a bigger project. There's several other variations that fail in some edge cases.

Reasons:
  • RegEx Blacklisted phrase (2.5): Please suggest
  • Long answer (-1):
  • Has code block (-0.5):
  • Low reputation (0.5):
Posted by: plswork04