如何为使用Bazel构建的Kotlin罐添加主类到MANIFEST.MF?

时间:2019-09-22 15:08:28

标签: kotlin bazel

我正在用一种主要方法构建一个非常简单的jar。我已经使用了Kotlin规则,并且可以很好地构建jar:

kt_jvm_binary(
    name = "myapp",
    main_class = "MainKt",
    srcs = ["src/main/kotlin/Main.kt"]
)

但是,该main_class参数并没有为清单添加任何内容,以允许我运行jar(我假设bazel-bin文件夹中的那个是正确的)。

我尝试过使用一个库,然后使用java_binary规则对其进行编译:

kt_jvm_library(
    name = "myapp_lib",
    srcs = ["src/main/kotlin/Main.kt"]
)

java_binary(
    name = "myapp",
    main_class = "MainKt",
    visibility = ["//visibility:public"],
    runtime_deps = [":myapp_lib"],
    deploy_manifest_lines = ["Main-Class: MainKt"]
)

现在我有两个罐子。仅具有清单的myapp.jar和具有类文件的myapp_lib.jar。不管我是否包含该deploy_manifest_lines参数,它们都不在清单中有主类。

如何使用允许我运行它的主类构建非常简单的jar?

(请注意,我将使用台式机和TornadoFX,而不是Android。)

2 个答案:

答案 0 :(得分:3)

通常,在Bazel中构建JVM目标时,您可能希望将类路径的每个部分放置在不同的位置,因此要预测任何特定部分的最终位置并不总是那么容易。

如果您要运行二进制文件并看到它可以工作,则可以bazel run :myapp并且它应该可以从清单路径中的某个jar中使用清单等正常工作。

>

如果您想探索创建了哪些不同的jar以及类路径是什么样的,则标志-s将输出Bazel运行的每个命令行,并向您显示类路径条目是什么,以便您可以探索他们。即bazel run -s :myapp

您还可以通过构建隐式的“ deploy-jar”目标:bazel build :myapp_deploy.jar来生成一个包含合并到一个文件中的可传递类路径的单个“胖” jar,该目标应生成一个可以独立工作的文件。

答案 1 :(得分:3)

Bazel中的很多东西都不是“神奇的”,这就是一个例子。 “ main_class”并不会影响打包,它是在告诉bazel * _binary规则如何执行,因此您可以执行bazel run //path/to/my/binary:target。它不影响包装。这取决于你。您将添加自己的meta-inf信息,并确保resources=提取包装元数据。

部分原因是因为Bazel(默认情况下)不创建“可执行jar”,而是构建了一个包装脚本,您可以执行该包装脚本来调用该jar的jvm。

您的第二个示例应该可以工作...您没有找到合适的罐子。实际具有所有部署位的jar应当为:myapp_deploy.jar,其中包含所有“上游” deps的类以及所有meta-inf素材,它们都烘焙到一个jar中。