Migra de Maven a Bazel

Informar un problema . Ver fuente . . Por la noche · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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 y Bazel, y brinda un ejemplo de migración con el proyecto de Guava.

Cuando se migra desde cualquier herramienta de compilación a Bazel, es mejor tener ambas herramientas de compilación que se ejecutan en paralelo hasta completar la migración de tu equipo de desarrollo, CI sistema operativo y cualquier otro sistema relevante. Puedes ejecutar Maven y Bazel en el mismo en un repositorio de confianza.

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 este instructivo, se explica Conceptos, estructura y sintaxis de etiquetas de Bazel.

Diferencias entre Maven y Bazel

  • Maven usa archivos pom.xml de nivel superior. Bazel admite varios archivos de compilación y varios destinos por archivo BUILD, lo que permite que las compilaciones sean más incremental que el de Maven.
  • Maven se encarga de los pasos del proceso de implementación. Bazel 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 archivo BUILD a cada Java nuevo. .

Migra de Maven a Bazel

En los siguientes pasos, se describe cómo migrar tu proyecto a Bazel:

  1. Crea el archivo MODULE.bazel
  2. Crea un archivo BUILD
  3. Crea más archivos BUILD
  4. Compila con Bazel

Los siguientes ejemplos provienen de una migración de Guava proyecto de Maven a Bazel. El El proyecto de Guava que se usó es el lanzamiento v31.1. Los ejemplos que usan Guava no explican en cada paso de la migración, pero sí muestran los archivos y contenidos se generan o agregan de forma manual para la migración.

$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1

1. Crea el archivo MODULE.bazel

Crea un archivo llamado MODULE.bazel en la raíz de tu proyecto. Si tu proyecto no tiene dependencias externas, este archivo puede estar vacío.

Si tu proyecto depende de archivos o paquetes que no están en uno de los de proyectos, especifica estas dependencias externas en el módulo MODULE.bazel . Puedes usar rules_jvm_external para administrar dependencias desde Maven. Para para obtener más información acerca del uso de este conjunto de reglas, consulta el README de Google Cloud.

Ejemplo de proyecto de Guava: dependencias externas

Puedes enumerar las dependencias externas de Guava proyecto con el rules_jvm_external de reglas de firewall.

Agrega el siguiente fragmento al archivo MODULE.bazel:

bazel_dep(name = "rules_jvm_external", version = "6.2")
maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
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",
    ],
)
use_repo(maven, "maven")

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 el proyecto. A diferencia de Maven con su único archivo pom.xml, Bazel puede usar muchos archivos BUILD para compilar un proyecto. Estos archivos especifican varias compilaciones 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 realizar una compilación inicial con Bazel. Luego, defines mejor A tu compilación, agrega más archivos BUILD con objetivos más detallados.

  1. En el mismo directorio que el archivo MODULE.bazel, crea un archivo de texto y Asígnale el nombre BUILD.

  2. 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, arriba, 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.
      • Consulta el ejemplo que aparece a continuación de esta COMPILACIÓN de nivel superior. archivo de la migración del proyecto Guava.

  3. Ahora que tienes un archivo BUILD en la raíz de tu proyecto, compila tu proyecto para garantizar que funcione. En la línea de comandos, desde tu lugar de trabajo de Terraform, usa bazel build //:everything para compilar tu proyecto con Bazel.

    El proyecto se compiló correctamente con Bazel. Deberás agregar 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 este archivo inicial BUILD en el directorio del espacio de trabajo:

java_library(
    name = "everything",
    srcs = glob([
        "guava/src/**/*.java",
        "futures/failureaccess/src/**/*.java",
    ]),
    javacopts = ["-XepDisableAllChecks"],
    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 primera compilación. 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 Java paquetes que tienen la menor cantidad de dependencias y avanzan hasta llegar a paquetes con la mayor cantidad de dependencias.
  • A medida que agregues archivos BUILD y especifiques destinos, agrega estos destinos nuevos al deps secciones de objetivos que dependen de ellos. Ten en cuenta que el elemento glob() no cruza los límites de paquetes, así que, como el número de paquetes aumenta la cantidad de archivos que coinciden con glob() se reducirán.
  • Cada vez que agregues un archivo BUILD a un directorio main, asegúrate de agregar una BUILD al directorio test 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 archivo de compilación. Ejecuta bazel 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.