cmake jar包无法执行:没有主清单属性

Posted

技术标签:

【中文标题】cmake jar包无法执行:没有主清单属性【英文标题】:cmake jar package cannot execute: no main manifest attribute 【发布时间】:2019-07-04 12:04:21 【问题描述】:

我从网上得到了一个非常简单的 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)

我在 centos7 上使用 jdk 1.8 和 cmake 3.8,然后

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 中,您能帮忙解释一下吗? 非常感谢。

【问题讨论】:

【参考方案1】:

使用add_jar 命令的MANIFEST 选项添加自定义清单文件。

例如,要从当前 cmake 源目录添加清单文件,请使用:

add_jar(HelloWorld HelloWorld.java MANIFEST "$CMAKE_CURRENT_SOURCE_DIR/MANIFEST.MF")

【讨论】:

【参考方案2】:

我遇到了完全相同的问题。

我的印象是 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 Make 4.3 java javac 11.0.10

【讨论】:

以上是关于cmake jar包无法执行:没有主清单属性的主要内容,如果未能解决你的问题,请参考以下文章

Springboot项目打成jar包时,执行jar包出现中XXX.jar没有主清单属性

jar命令成功完成 java -jar 命令却提示“没有主清单属性”!

java -jar XXX.jar 没有主清单属性以及找不到或无法加载主类的问题

androidstudio中导入的jar包没有主清单属性怎么办

androidstudio中导入的jar包没有主清单属性怎么办

为啥无法从 JAR 文件加载主类清单属性?