我从互联网上获得了一个非常简单的cmake-java项目,如下所示:
猫HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
然后是CMakeLists.txt文件:
cmake_minimum_required (VERSION 2.8)
find_package(Java REQUIRED)
include(UseJava)
enable_testing()
project (HelloWorld)
set(CMAKE_JAVA_COMPILE_FLAGS "-source" "1.8" "-target" "1.8")
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)
我在使用jdk 1.8和cmake 3.8的centos7上,然后
cmake . && make -j8
有HelloWorld.jar文件,运行时会出错:
java -jar HelloWorld.jar HelloWorld
no main manifest attribute, in HelloWorld.jar
是的,里面没有主类定义:
$ cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.8.0_191 (Oracle Corporation)
我只是想知道如何使用cmake将内容添加到MANIFEST.MF中,您能帮忙解释一下吗? 非常感谢。
答案 0 :(得分:1)
使用Second attempt命令的MANIFEST
选项添加自定义清单文件。
例如,要从当前cmake源目录添加清单文件,请使用:
add_jar(HelloWorld HelloWorld.java MANIFEST "${CMAKE_CURRENT_SOURCE_DIR}/MANIFEST.MF")
答案 1 :(得分:0)
我遇到了完全相同的问题。
我的印象是 CMake 将根据 add_jar() 的其他输入生成清单。完全不是这样。
您负责创建一个清单文件,然后使用 add_jar() 的 MANIFEST 选项将 CMake 指向它
因此,在这个简单的 HelloWorld 示例中,它可能如下所示:
Manifest-Version: 1.0
Created-By: YOUR NAME HERE
Main-Class: HelloWorld
为什么 Java 需要清单文件(当所有 jar 在 javac 编译时已知)仍然是读者思考的谜。
也很重要 似乎清单文件不会自动成为 jar 目标的依赖项。您可以修改清单,然后再次运行“make”,您的 jar 将不会使用新清单进行更新。至少这是我系统上确认的行为:
cmake 版本 3.19.7 GNU 制作 4.3 java javac 11.0.10