Есть ли способ вызвать Java-код (что-то вроде пользовательских плагинов maven) в сборке bazel?

#java #maven #bazel

#java #мавен #bazel

Вопрос:

Я создал плагин для его запуска во время компиляции модулей maven. Но поскольку моя организация сейчас переходит на bazel — есть ли у нас способ напрямую запускать плагины (mojos) в bazel?

Если нет, есть ли способ во время сборки Java-кода в базеле, чтобы мы могли вызвать другой java-код, который содержит всю информацию о проекте, как MavenProject параметр в mojos?

Комментарии:

1. Что делает ваш плагин?

2. Какой плагин связан с модулями maven: I made a plugin to run it during compilation of maven modules ? Я сомневаюсь, что вы можете выполнить mojo в Bazel, потому что, насколько я знаю, bazel в основном реализован на C / C ?

3. В частности, изменяет ли ваш плагин или генерирует файлы?

4. Он генерирует файл.

Ответ №1:

Вы можете использовать a genrule с java_binary для вашего плагина как tool . Что — то вроде этого:

 java_binary(
    name = "my_plugin",
    ...
)

genrule(
    name = "run_plugin",
    srcs = [],
    cmd = "$(location my_plugin) > "$@"",
    outs = ["plugin_output"],
    tools = [":my_plugin"],
)
 

В этом примере вы должны иметь возможность запускать свой плагин с bazel build :plugin_output помощью .

Комментарии:

1. Я хочу получить classloader модуля, выполняющего его (urlclassloader тоже работает, но мне нужно знать зависимости модуля от времени выполнения). Может ли genrule предоставить мне это?

2. Этот пример просто выполняет ваш плагин с java -jar помощью from genrule, поэтому, я думаю, он даст вам все, что java -jar обычно дает вам.

3. Тогда не могли бы вы уточнить еще кое-что? Вам нужны зависимости от времени выполнения какого модуля? Тот, на который действует ваш плагин, или сам плагин? Достаточно ли знать Bazel deps ? Вы говорите о модулях Java 9 или о какой-то другой концепции?

4. Это могло бы помочь, если бы вы также могли поделиться назначением плагина.

5. Я использую java 8. По сути, я хочу, чтобы все зависимости времени выполнения использовали отражение для всех модулей, а затем генерировали несколько файлов на основе классов, имеющих аннотации.

Ответ №2:

Похоже , то , что вы , возможно , захотите попробовать , — это a java_plugin , предназначенный для запуска процессоров аннотаций с java_binary помощью and java_library : https://docs.bazel.build/versions/master/be/java.html#java_plugin

и вы указываете плагин с plugins атрибутом java_binary or java_library : https://docs.bazel.build/versions/master/be/java.html#java_binary.plugins

 java_binary(
  name = ...,
  srcs = ...,
  deps = ...,
  plugins = [":my_plugin"],
)

java_plugin(
  name = "my_plugin",
  srcs = ...,
  deps = ...,
  processor_class = "...",
)