我正在用一种主要方法构建一个非常简单的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。)
答案 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中。