Maven에서 Bazel로 마이그레이션

<ph type="x-smartling-placeholder"></ph> 문제 신고 <ph type="x-smartling-placeholder"></ph> 소스 보기 1박 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

이 페이지에서는 Maven에서 Bazel로 마이그레이션하는 방법을 설명합니다. 기본 요건 및 설치 단계를 완료합니다. Maven의 차이점을 설명합니다. 하고 Guava 프로젝트를 사용한 이전 예를 제공합니다.

빌드 도구에서 Bazel로 마이그레이션할 때는 두 빌드 도구를 모두 사용하는 것이 가장 좋습니다. 개발팀을 완전히 마이그레이션할 때까지 동시에 실행하여 기타 관련 시스템을 관리합니다 Maven 및 Bazel을 동일한 저장소

시작하기 전에

Maven과 Bazel의 차이점

  • Maven에서는 최상위 수준의 pom.xml 파일을 사용합니다. Bazel에서 여러 빌드 파일 지원 BUILD 파일당 여러 개의 타겟이 있어서 Maven보다 증분식일 수 있습니다
  • Maven이 배포 프로세스의 단계를 담당합니다. Bazel은 배포를 자동화할 수 있습니다
  • Bazel을 사용하면 언어 간 종속 항목을 표현할 수 있습니다.
  • Bazel을 사용하면 프로젝트에 새 섹션을 추가할 때 BUILD 파일. 권장사항은 각각의 새로운 자바에 BUILD 파일을 추가하는 것입니다. 패키지에서 찾을 수 있습니다.

Maven에서 Bazel로 마이그레이션

아래 단계에서는 프로젝트를 Bazel로 마이그레이션하는 방법을 설명합니다.

  1. MODULE.bazel 파일 만들기
  2. BUILD 파일 하나 만들기
  3. 더 많은 BUILD 파일 만들기
  4. Bazel을 사용하여 빌드

다음은 Guava 이전에서 가져온 예시입니다. 프로젝트를 Maven에서 Bazel로 변경할 수 있습니다. 이 사용된 Guava 프로젝트는 v31.1 릴리스입니다. Guava를 사용한 예시는 마이그레이션의 각 단계를 확인할 수 있지만, 마이그레이션에 필요한 파일과 수동으로 생성하거나 추가할 수 있습니다

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

1. MODULE.bazel 파일 만들기

프로젝트 루트에 MODULE.bazel라는 파일을 만듭니다. 프로젝트가 에 외부 종속 항목이 없으면 이 파일은 비어 있어도 됩니다.

프로젝트가 MODULE.bazel에 외부 종속 항목을 지정합니다. 파일에서 참조됩니다. rules_jvm_external을 사용하여 Maven의 종속 항목을 관리할 수 있습니다. 대상 자세한 내용은 README 에서 자세한 내용을 확인하실 수 있습니다.

Guava 프로젝트 예시: 외부 종속 항목

이 명령어를 사용해 Guava의 외부 종속 항목을 프로젝트rules_jvm_external 합니다.

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. BUILD 파일 1개 만들기

이제 작업공간이 정의되었고 외부 종속 항목 (예: BUILD 파일을 만들어 빌드해야 합니다 pom.xml 파일이 하나인 Maven과 달리 Bazel은 여러 BUILD 파일을 포함하여 프로젝트를 빌드합니다. 이 파일은 여러 빌드를 지정합니다. 대상을 지정하여 증분 빌드를 생성할 수 있습니다.

BUILD 파일을 단계별로 추가합니다. 먼저 다음 루트에 BUILD 파일을 하나 추가합니다. Bazel을 사용하여 초기 빌드를 수행하는 데 사용할 수 있습니다. 그런 다음 더 세분화된 타겟이 있는 BUILD 파일을 더 추가하여 빌드를 빌드합니다.

  1. MODULE.bazel 파일과 동일한 디렉터리에서 텍스트 파일을 만들고 이름을 BUILD로 지정합니다.

  2. BUILD 파일에서 적절한 규칙을 사용하여 빌드할 대상을 하나 만듭니다. 살펴보겠습니다 다음은 몇 가지 팁입니다.

    • 적절한 규칙을 사용합니다.

      • 단일 Maven 모듈로 프로젝트를 빌드하려면 java_library 규칙은 다음과 같습니다.

        java_library(
           name = "everything",
           srcs = glob(["src/main/java/**/*.java"]),
           resources = glob(["src/main/resources/**"]),
           deps = ["//:all-external-targets"],
        )
        
      • 여러 Maven 모듈로 프로젝트를 빌드하려면 java_library 규칙은 다음과 같습니다.

        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"],
        )
        
      • 바이너리를 빌드하려면 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"
        )
        
      • 속성을 지정합니다.

        • name: 대상에 의미 있는 이름을 지정합니다. 예시 위에서는 타겟을 '전체'라고 합니다.
        • srcs: globbing을 사용하여 프로젝트의 모든 .java 파일을 나열합니다.
        • resources: globbing을 사용하여 프로젝트의 모든 리소스를 나열합니다.
        • deps: 어떤 외부 종속 항목을 사용할지 결정해야 합니다. 프로젝트 요구사항을 나타냅니다
      • 아래에서 최상위 BUILD의 예를 살펴보세요. 파일을 복사합니다.

  3. 이제 프로젝트의 루트에 BUILD 파일이 있으므로 확인할 수 있습니다 작업공간의 명령줄에서 디렉터리에서 bazel build //:everything를 사용하여 Bazel로 프로젝트를 빌드합니다.

    이제 Bazel을 사용하여 프로젝트가 성공적으로 빌드되었습니다. 먼저 프로젝트의 증분 빌드를 허용하기 위한 추가 BUILD 파일

Guava 프로젝트 예시: BUILD 파일 1개로 시작

Guava 프로젝트를 Bazel로 마이그레이션할 때는 처음에는 하나의 BUILD 파일이 전체 프로젝트를 빌드할 수 있습니다 이 초기 BUILD 파일의 콘텐츠는 다음과 같습니다. 새 작업공간 디렉터리:

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. 추가 BUILD 파일 만들기 (선택사항)

Bazel은 BUILD file를 하나만 사용하여 작업합니다. 첫 번째 빌드를 시작합니다. 여전히 빌드를 더 작은 청크로 분할하는 것이 세분화된 타겟으로 BUILD 파일을 더 추가합니다.

타겟이 여러 개인 BUILD 파일이 여러 개 있으면 빌드가 증가합니다. 다음과 같은 세부사항을 허용합니다.

  • 프로젝트의 증분 빌드 증가
  • 빌드의 병렬 실행이 늘어나고
  • 향후 사용자를 위해 빌드의 유지 관리 용이성 개선
  • 패키지 간 타겟의 공개 상태를 제어하여 구현 세부정보가 포함된 라이브러리와 같은 문제가 사용할 수 있습니다

BUILD 파일을 더 추가하기 위한 도움말:

  • 각 자바 패키지에 BUILD 파일을 추가하여 시작할 수 있습니다. Java로 시작 종속 항목이 가장 적고 패키지까지만 작동하는 살펴보겠습니다
  • BUILD 파일을 추가하고 대상을 지정할 때 이러한 새 대상을 이를 사용하는 타겟의 deps 섹션. glob()는 함수는 패키지 경계를 넘지 않으므로 glob()와 일치하는 파일이 축소됩니다.
  • BUILD 파일을 main 디렉터리에 추가할 때마다 BUILD 파일을 상응하는 test 디렉터리에 복사합니다.
  • 패키지 간에 가시성을 적절하게 제한해야 합니다.
  • BUILD 파일 설정의 오류 문제를 간단하게 해결하려면 다음을 확인하세요. 각 빌드 파일을 추가할 때 프로젝트가 Bazel을 사용하여 계속 빌드됨을 의미합니다. bazel build //...를 실행하여 모든 타겟이 계속 빌드되는지 확인합니다.

4. Bazel을 사용하여 빌드

설정 유효성을 검사하기 위해 BUILD 파일을 추가하면서 Bazel을 사용하여 빌드했습니다. 확인할 수 있습니다

원하는 세부사항으로 BUILD 파일이 있는 경우 Bazel을 사용하여 다음 작업을 할 수 있습니다. 모든 빌드를 생성합니다.