У меня есть mvn_package
прототип правила в этом запросе . Вопросы, которые вы подняли, имеют решающее значение; требуется немного времени, чтобы обуздать соглашения и ожидания Maven в более строгой среде выполнения действий Bazel.
Maven ожидает выполнения из каталога, содержащего pom. xml
Вы можете использовать флаг -f
, чтобы указать местоположение pom.xml
.
например, mvn package -f %s -DskipTests -DbazelOutputDir=%s -Pbazel" % (ctx.file.pom_xml.dirname,output_jar.dirname)
Maven записывает вывод в подкаталог входного файлового дерева
Я создал пользовательский профиль в pom.xml
для настраиваемого определения Maven и передал, определяющий указанную выше командную строку:
<profiles>
<profile>
<id>bazel</id>
<build>
<directory>${bazelOutputDir}</directory>
</build>
</profile>
</profiles>
Maven наиболее удачлив при настройках. xml содержит абсолютные пути (к локальному репозиторию maven для .war, хранящемуся в git)
Это неудачно, и вам придется найти способ обойти это или отключить песочницу: (
Maven использует $ HOME / .m2 для кэширования
До тех пор, пока входные и выходные данные действия Bazel объявлены правильно в правиле Starlark, вам не нужно взаимодействовать с Maven's .m2 кеш ctory, поскольку Bazel имеет свой собственный кэш действий.
Для полноты изложения приведем доказательство концепции правила Starlark для упаковки .jar, поэтому вам, возможно, потребуется настроить его для .war:
def _mvn_package_impl(ctx):
inputs = []
inputs.extend(ctx.files.srcs)
inputs.append(ctx.file.pom_xml)
output_jar = ctx.actions.declare_file("target/%s-%s.jar" % (ctx.attr.artifact_id, ctx.attr.version))
target_dir = ctx.actions.declare_directory("target")
outputs = [output_jar, target_dir]
# -Djar.finalName=custom-jar-name
ctx.actions.run_shell(
inputs = inputs,
outputs = outputs,
mnemonic = "MvnPackage",
progress_message = "Running 'mvn package' for %s" % output_jar.short_path,
command = "mvn package -f %s -DskipTests -DbazelOutputDir=%s -Pbazel" % (ctx.file.pom_xml.dirname,output_jar.dirname),
)
return [
DefaultInfo(
files = depset(outputs),
),
JavaInfo(
output_jar = output_jar,
compile_jar = output_jar,
),
]
mvn_package = rule(
implementation = _mvn_package_impl,
attrs = {
"srcs": attr.label_list(allow_files = True, allow_empty = False),
"pom_xml": attr.label(allow_single_file = True, mandatory = True),
"artifact_id": attr.string(mandatory = True),
"group_id": attr.string(mandatory = True),
"version": attr.string(mandatory = True),
},
)
и используя указанное выше правило в файле BUILD:
load("@rules_jvm_external//:mvn.bzl", "mvn_package")
mvn_package(
name = "hello_maven",
srcs = [
"//src/main/java/hello:srcs",
],
pom_xml = "//:pom.xml",
group_id = "org.springframework",
artifact_id = "gs-spring-boot",
version = "0.1.0",
)
java_binary(
name = "hello_maven_app",
runtime_deps = [":hello_maven"],
main_class = "hello.Application",
)