Como migrar do Maven para o Bazel

Informar um problema Mostrar fonte Por noite · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Nesta página, descrevemos como migrar do Maven para o Bazel, incluindo as pré-requisitos e etapas de instalação. Ela descreve as diferenças entre o Maven e o Bazel e fornece um exemplo de migração usando a Projeto Guava.

Ao migrar de qualquer ferramenta de build para o Bazel, é melhor ter os dois em execução em paralelo até que você tenha migrado totalmente sua equipe de desenvolvimento, CI e qualquer outro sistema relevante. É possível executar Maven e Bazel no mesmo repositório.

Antes de começar

  • Instale o Bazel se ainda não estiver instalado.
  • Se você ainda não conhece o Bazel, confira o tutorial Introdução ao Bazel: crie Java antes de começar migração. Neste tutorial, explicamos os conceitos, a estrutura e os rótulos do Bazel. .

Diferenças entre o Maven e o Bazel

  • O Maven usa arquivos pom.xml de nível superior. O Bazel oferece suporte a várias versões e vários destinos por arquivo BUILD, permitindo builds que são mais incrementais que os do Maven.
  • O Maven se encarrega das etapas do processo de implantação. Bazel faz e não automatizar a implantação.
  • Ele permite expressar dependências entre linguagens.
  • Conforme você adiciona novas seções ao projeto, com o Bazel, pode ser necessário adicionar novas BUILD. A prática recomendada é adicionar um arquivo BUILD a cada novo pacote Java.

Migrar do Maven para o Bazel

As etapas abaixo descrevem como migrar seu projeto para o Bazel:

  1. Crie o arquivo do ESPAÇO DE TRABALHO
  2. Crie um arquivo BUILD
  3. Crie mais arquivos BUILD
  4. Criar usando o Bazel

Os exemplos abaixo vêm de uma migração Projeto Guava do Maven para o Bazel. O projeto Guava usado é a versão v31.1. Os exemplos que usam Guava não mostram cada etapa da migração, mas também mostram os arquivos e o conteúdo gerados ou adicionados manualmente para a migração.

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

1. Criar o arquivo do ESPAÇO DE TRABALHO

Crie um arquivo chamado WORKSPACE na raiz do projeto. Se o seu projeto não tiver dependências externas, o arquivo do espaço de trabalho poderá estar vazio.

Se o projeto depender de arquivos ou pacotes que não estão em um dos do projeto, especifique essas dependências externas no espaço de trabalho . Para automatizar a listagem de dependências externas do arquivo do espaço de trabalho, use rules_jvm_external. Para instruções sobre como usar esse conjunto de regras, consulte LEIA-ME.

Exemplo de projeto Guava: dependências externas

É possível listar as dependências externas do Projeto Guava com o rules_jvm_external grupo de regras.

Adicione o seguinte snippet ao arquivo 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. Crie um arquivo BUILD

Agora que você definiu seu espaço de trabalho e as dependências externas (se aplicável), é necessário criar arquivos BUILD para descrever como seu projeto deve ser desenvolvida. Ao contrário do Maven, com um arquivo pom.xml, o Bazel pode usar muitos BUILD para criar um projeto. Esses arquivos especificam vários destinos de build, o que permite que o Bazel produza builds incrementais.

Adicione arquivos BUILD em etapas. Para começar, adicione um arquivo BUILD na raiz do projeto e para fazer um build inicial com o Bazel. Em seguida, você vai refinar seu build adicionando mais arquivos BUILD com dados de destino.

  1. No mesmo diretório do arquivo WORKSPACE, crie um arquivo de texto e nomeie-o como BUILD.

  2. Neste arquivo BUILD, use a regra adequada para criar um destino para criar seu projeto. Veja algumas dicas:

    • Use a regra apropriada:

      • Para criar projetos com um único módulo do Maven, use a java_library da seguinte maneira:

        java_library(
            name = "everything",
            srcs = glob(["src/main/java/**/*.java"]),
            resources = glob(["src/main/resources/**"]),
            deps = ["//:all-external-targets"],
        )
        
      • Para criar projetos com vários módulos Maven, use a java_library da seguinte maneira:

        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 criar binários, use a regra 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"
        )
        
    • Especifique os atributos:

      • name: dá ao destino um nome significativo. Nos exemplos acima, o destino é chamado de "tudo".
      • srcs: use globbing para listar todos os arquivos .java no seu projeto.
      • resources: use globs para listar todos os recursos no projeto.
      • deps: você precisa determinar para quais dependências externas necessidades do projeto. Por exemplo, se você gerou uma lista de objetos dependências usando a ferramenta generate_workspace, as dependências para java_library são as bibliotecas listadas na generated_java_libraries.
    • Dê uma olhada no exemplo abaixo deste arquivo BUILD de nível superior, a migração do projeto Guava.

  3. Agora que você tem um arquivo BUILD na raiz do projeto, crie seu projeto para garantir que ele funcione. Na linha de comando, do seu do seu espaço de trabalho, use bazel build //:everything para criar projeto com o Bazel.

    O projeto foi criado com o Bazel. Você precisará para adicionar mais arquivos BUILD e permitir builds incrementais do projeto.

Exemplo de projeto Guava: comece com um arquivo BUILD

Ao migrar o projeto Guava para o Bazel, inicialmente um arquivo BUILD é usado para criar todo o projeto. Este é o conteúdo deste BUILD inicial no diretório do espaço de trabalho:

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. Crie mais arquivos BUILD (opcional)

O Bazel funciona com apenas um BUILD file, como você viu ao concluir sua primeira ser construído. Você ainda deve considerar dividir o build em partes menores adicionando mais arquivos BUILD com destinos granulares.

Vários arquivos BUILD com vários destinos darão ao build um aumento granularidade, o que permite:

  • o aumento de builds incrementais do projeto,
  • de aumento na execução paralela do build,
  • melhor capacidade de manutenção do build para futuros usuários e
  • controle sobre a visibilidade dos destinos entre pacotes, o que pode impedir problemas como bibliotecas contendo detalhes de implementação que vazam para APIs públicas.

Dicas para adicionar mais arquivos BUILD:

  • Para começar, adicione um arquivo BUILD a cada pacote Java. Comece com Pacotes Java que têm o menor número de dependências e progridem aos pacotes com mais dependências.
  • À medida que você adicionar arquivos BUILD e especificar destinos, adicione esses novos destinos ao deps seções de destinos que dependem deles. Observe que o glob() não ultrapassa os limites dos pacotes, de modo que o número de pacotes aumenta o número de arquivos correspondidos por glob() diminuem.
  • Sempre que você adicionar um arquivo BUILD a um diretório main, adicione um arquivo BUILD ao diretório test correspondente.
  • Tenha cuidado para limitar corretamente a visibilidade entre pacotes.
  • Para simplificar a solução de erros na configuração de arquivos BUILD, verifique se que o projeto continua a ser compilado com o Bazel conforme você adiciona cada compilação. . Execute bazel build //... para garantir que todos os destinos ainda sejam criados.

4. Criar usando o Bazel

Você está compilando com o Bazel ao adicionar arquivos BUILD para validar a configuração. do build.

Quando você tem arquivos BUILD com a granularidade desejada, pode usar o Bazel para produzir todos os builds.