Как я могу добавить основной класс в MANIFEST.MF для банки Kotlin, созданной с помощью Bazel? - PullRequest
3 голосов
/ 22 сентября 2019

Я строю очень простую банку одним основным методом.У меня работают правила 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 или нет.

Как мне построить очень простой флягу с основным классом, который позволяет мне его запускать?

(Обратите внимание, что я буду работать с рабочими столами и TornadoFX, , а не Android.)

Ответы [ 2 ]

3 голосов
/ 23 сентября 2019

Многие вещи в Базеле не являются "волшебными", и это пример.«Main_class» не влияет на упаковку, он говорит binel * _binary правилу, как выполнить, так что вы можете сделать bazel run //path/to/my/binary:target.Это не влияет на упаковку.Это зависит от вас.Вы должны добавить свою собственную информацию метаинформации и убедиться, что resources= извлекает ваши метаданные упаковки.

Частично это связано с тем, что Bazel (по умолчанию) не создает «исполняемый jar», а вместо этого создает исполняемый скрипт-обертку, который вызывает jvm с jar.

Ваш второйпример должен работать ... вы не смотрите на правильную банку.Баночка, которая на самом деле имеет все биты развертывания, должна быть: myapp_deploy.jar, которая содержит все классы deps «вверх по течению», а также любые метаинфекты, все запеченные в одну банку.

3 голосов
/ 22 сентября 2019

Как правило, при создании целей JVM в Bazel каждая часть пути к классу, который вам может понадобиться, может располагаться в разных местах, поэтому не всегда легко предсказать, где какая-то конкретная часть окажется в итоге.

Если выхотите запустить двоичный файл и увидеть, как он работает, вы можете bazel run :myapp, и он должен работать должным образом с манифестом и тому подобным из некоторого jar-файла на classpath.

Если вы хотитеисследуйте, какие создаются различные jar-файлы и как выглядит classpath, флаг -s выведет каждую командную строку, которую запускает Bazel, и покажет вам, какие были записи classpath, чтобы вы могли их изучить.т.е. bazel run -s :myapp.

Вы также можете сгенерировать один «толстый» jar-файл, содержащий транзитивный путь к классу, помещенный вместе в один файл, создав неявную цель «deploy-jar»: bazel build :myapp_deploy.jar, которая должна создать файлкоторый будет работать автономно.

...