En esta página, se describe cómo migrar de Maven a Bazel, incluida la requisitos previos y pasos de instalación. Describe las diferencias entre Maven y Bazel, y brinda un ejemplo de migración con el Guava.
Cuando se migra desde cualquier herramienta de compilación a Bazel, es mejor tener ambas herramientas que se ejecutan en paralelo hasta que haya migrado completamente su equipo de desarrollo, un sistema de CI y cualquier otro sistema relevante. Puedes ejecutar Maven y Bazel en el mismo repositorio.
Antes de comenzar
- Instala Bazel si aún no lo has hecho.
- Si es la primera vez que usas Bazel, consulta el instructivo. Introducción a Bazel: Compila Java antes de comenzar la migración. En el instructivo, se explican los conceptos, la estructura y la etiqueta de Bazel. sintaxis.
Diferencias entre Maven y Bazel
- Maven usa archivos
pom.xml
de nivel superior. Bazel admite varias compilaciones y varios destinos por archivoBUILD
, lo que permite compilaciones que son más incrementales que las de Maven. - Maven se encarga de los pasos del proceso de implementación. Bazel hace no automatizar la implementación.
- Bazel te permite expresar dependencias entre idiomas.
- A medida que agregues nuevas secciones al proyecto, es posible que, con Bazel, debas agregar nuevas secciones
BUILD
. La práctica recomendada es agregar un archivoBUILD
a cada paquete Java nuevo.
Migra de Maven a Bazel
En los siguientes pasos, se describe cómo migrar tu proyecto a Bazel:
Los siguientes ejemplos provienen de una migración del
Proyecto Guava de Maven a Bazel.
El proyecto de Guava que se usó es el lanzamiento v31.1
. En los ejemplos de Guava no se explican
en cada paso de la migración, pero sí muestran los archivos y contenidos
generarse o agregarse manualmente para la migración.
$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1
1. Crea el archivo WORKSPACE
Crea un archivo llamado WORKSPACE
en la raíz de tu proyecto. Si tu proyecto
no tiene dependencias externas, el archivo del espacio de trabajo puede estar vacío.
Si tu proyecto depende de archivos o paquetes que no están en uno de los
directorios del proyecto, especifica estas dependencias externas en el
. Para automatizar la lista de dependencias externas del archivo del espacio de trabajo,
usa rules_jvm_external
. Para obtener instrucciones sobre cómo usar este conjunto de reglas, consulta
el archivo README.
Ejemplo de proyecto de Guava: dependencias externas
Puedes enumerar las dependencias externas del
Proyecto Guava con el
rules_jvm_external
de reglas de firewall.
Agrega el siguiente fragmento al archivo WORKSPACE
:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
RULES_JVM_EXTERNAL_TAG = "4.3"
RULES_JVM_EXTERNAL_SHA = "6274687f6fc5783b589f56a2f1ed60de3ce1f99bc4e8f9edef3de43bdf7c6e74"
http_archive(
name = "rules_jvm_external",
sha256 = RULES_JVM_EXTERNAL_SHA,
strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
)
load("@rules_jvm_external//:defs.bzl", "maven_install")
maven_install(
artifacts = [
"com.google.code.findbugs:jsr305:3.0.2",
"com.google.errorprone:error_prone_annotations:2.11.0",
"com.google.j2objc:j2objc-annotations:1.3",
"org.codehaus.mojo:animal-sniffer-annotations:1.20",
"org.checkerframework:checker-qual:3.12.0",
],
repositories = [
"https://repo1.maven.org/maven2",
],
)
2. Crea un archivo BUILD
Ahora que tienes tu lugar de trabajo definido y dependencias externas (si
aplicables), debes crear archivos BUILD
para describir cómo se describe
un modelo de AA. A diferencia de Maven con su único archivo pom.xml
, Bazel puede usar muchos
BUILD
para compilar un proyecto. Estos archivos especifican varios objetivos de compilación,
que permiten a Bazel
producir compilaciones incrementales.
Agrega BUILD
archivos en etapas. Para comenzar, agrega un archivo BUILD
en la raíz de tu proyecto y usarlo para hacer una compilación inicial con Bazel.
Luego, puedes definir mejor tu compilación agregando más archivos BUILD
con información más detallada.
objetivos.
En el mismo directorio que el archivo
WORKSPACE
, crea un archivo de texto y Asígnale el nombreBUILD
.En este archivo
BUILD
, usa la regla adecuada para crear un destino que compilar tu proyecto. A continuación, se incluyen algunas sugerencias:Usa la regla correspondiente:
Para compilar proyectos con un solo módulo de Maven, usa el
java_library
de la siguiente manera:java_library( name = "everything", srcs = glob(["src/main/java/**/*.java"]), resources = glob(["src/main/resources/**"]), deps = ["//:all-external-targets"], )
Para compilar proyectos con varios módulos de Maven, usa el
java_library
de la siguiente manera:java_library( name = "everything", srcs = glob([ "Module1/src/main/java/**/*.java", "Module2/src/main/java/**/*.java", ... ]), resources = glob([ "Module1/src/main/resources/**", "Module2/src/main/resources/**", ... ]), deps = ["//:all-external-targets"], )
Para compilar objetos binarios, usa la regla
java_binary
:java_binary( name = "everything", srcs = glob(["src/main/java/**/*.java"]), resources = glob(["src/main/resources/**"]), deps = ["//:all-external-targets"], main_class = "com.example.Main" )
Especifica los atributos:
name
: Asigna un nombre significativo al objetivo. En los ejemplos anteriores, el objetivo se llama "todo".srcs
: Usa globbing para enumerar todos los archivos .java de tu proyecto.resources
: Usa globbing para enumerar todos los recursos de tu proyecto.deps
: Debes determinar qué dependencias externas las necesidades del proyecto. Por ejemplo, si generaste una lista de datos de las dependencias con la herramientagenerate_workspace
, parajava_library
son las bibliotecas que se enumeran en la Macrogenerated_java_libraries
.
Consulta la ejemplo a continuación de este archivo BUILD de nivel superior de la migración del proyecto Guava.
Ahora que tienes un archivo
BUILD
en la raíz de tu proyecto, compila tu proyecto para asegurarte de que funcione. En la línea de comandos, desde tu Workspace, usabazel build //:everything
para compilar tu proyecto con Bazel.El proyecto se compiló correctamente con Bazel. Necesitarás Agrega más archivos
BUILD
para permitir compilaciones incrementales del proyecto.
Ejemplo de proyecto de Guava: comienza con un archivo BUILD
Cuando se migra el proyecto de Guava a Bazel, inicialmente se usa un archivo BUILD
para compilar todo el proyecto. Este es el contenido de esta BUILD
inicial
en el directorio del espacio de trabajo:
java_library(
name = "everything",
srcs = glob([
"guava/src/**/*.java",
"futures/failureaccess/src/**/*.java",
]),
deps = [
"@maven//:com_google_code_findbugs_jsr305",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_j2objc_j2objc_annotations",
"@maven//:org_checkerframework_checker_qual",
"@maven//:org_codehaus_mojo_animal_sniffer_annotations",
],
)
3. Crea más archivos BUILD (opcional)
Bazel funciona con un solo BUILD file
, como viste después de completar tu primer
compilar. Deberías considerar la posibilidad de dividir la compilación en fragmentos más pequeños
Se agregarán más archivos BUILD
con objetivos detallados.
Si hay varios archivos BUILD
con varios objetivos, la compilación aumentará
nivel de detalle, lo que permite:
- el aumento de las compilaciones incrementales del proyecto,
- aumentó la ejecución paralela de la compilación
- una mejor capacidad de mantenimiento de la compilación para futuros usuarios
- control sobre la visibilidad de los objetivos entre paquetes, lo que puede impedir como bibliotecas con detalles de implementación que se filtran APIs públicas.
Sugerencias para agregar más archivos BUILD
:
- Para comenzar, agrega un archivo
BUILD
a cada paquete de Java. Comienza con Paquetes de Java que tienen la menor cantidad de dependencias y te permiten avanzar hacia arriba a los paquetes con más dependencias. - A medida que agregues archivos
BUILD
y especifiques destinos, agrega estos destinos nuevos aldeps
secciones de objetivos que dependen de ellos. Ten en cuenta que el elementoglob()
no cruza los límites del paquete, así como la cantidad de paquetes aumenta, los archivos que coinciden conglob()
se reducirán. - Cada vez que agregues un archivo
BUILD
a un directoriomain
, asegúrate de agregar Un archivoBUILD
en el directoriotest
correspondiente - Asegúrate de limitar correctamente la visibilidad entre paquetes.
- Para simplificar la solución de errores en la configuración de archivos
BUILD
, asegúrate de que que el proyecto siga compilando con Bazel a medida que agregas cada compilación . Ejecutabazel build //...
para asegurarte de que todos tus destinos sigan compilando.
4. Compila con Bazel
Compilaste con Bazel a medida que agregas los archivos BUILD
para validar la configuración.
de la compilación.
Cuando tengas archivos BUILD
con el nivel de detalle deseado, puedes usar Bazel
para producir todas tus compilaciones.