자바 규칙

문제 신고 소스 보기 Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

규칙

java_binary

규칙 소스 보기
java_binary(name, deps, srcs, data, resources, args, classpath_resources, compatible_with, create_executable, deploy_env, deploy_manifest_lines, deprecation, distribs, env, exec_compatible_with, exec_properties, features, javacopts, jvm_flags, launcher, licenses, main_class, output_licenses, plugins, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, stamp, tags, target_compatible_with, testonly, toolchains, use_launcher, use_testrunner, visibility)

Java 보관 파일 ('jar 파일')과 규칙과 동일한 이름의 래퍼 셸 스크립트를 빌드합니다. 래퍼 셸 스크립트는 바이너리가 종속되는 각 라이브러리의 jar 파일 등이 포함된 클래스 경로를 사용합니다. 래퍼 셸 스크립트를 실행할 때 비어 있지 않은 JAVABIN 환경 변수는 Bazel의 --java_runtime_version 플래그를 통해 지정된 버전보다 우선 적용됩니다.

래퍼 스크립트는 여러 고유한 플래그를 허용합니다. 래퍼에서 허용하는 구성 가능한 플래그 및 환경 변수의 목록은 //src/main/java/com/google/devtools/build/lib/bazel/rules/java/java_stub_template.txt를 참고하세요.

암시적 출력 타겟

  • name.jar: 바이너리의 직접 종속 항목에 해당하는 클래스 파일 및 기타 리소스가 포함된 Java 보관 파일입니다.
  • name-src.jar: 소스가 포함된 보관 파일 ('소스 jar')입니다.
  • name_deploy.jar: 배포에 적합한 Java 보관 파일입니다 (명시적으로 요청된 경우에만 빌드됨).

    규칙의 <name>_deploy.jar 타겟을 빌드하면 java -jar 명령어 또는 래퍼 스크립트의 --singlejar 옵션으로 실행할 수 있는 매니페스트가 포함된 독립형 jar 파일이 생성됩니다. 래퍼 스크립트를 사용하는 것이 java -jar보다 좋습니다. JVM 플래그와 네이티브 라이브러리를 로드하는 옵션도 전달하기 때문입니다.

    배포 jar에는 바이너리의 래퍼 스크립트에서 처음부터 끝까지 클래스 경로를 검색한 클래스 로더에서 찾을 수 있는 모든 클래스가 포함됩니다. 또한 종속 항목에 필요한 네이티브 라이브러리도 포함되어 있습니다. 이는 런타임 시 JVM에 자동으로 로드됩니다.

    타겟이 launcher 속성을 지정하면 _deploy.jar가 일반 JAR 파일이 아닌 네이티브 바이너리가 됩니다. 여기에는 런처와 규칙의 모든 네이티브 (C++) 종속 항목이 포함되며 모두 정적 바이너리에 연결됩니다. 실제 jar 파일의 바이트가 해당 네이티브 바이너리에 추가되어 실행 파일과 Java 코드가 모두 포함된 단일 바이너리 블롭이 생성됩니다. 결과 jar 파일은 네이티브 바이너리를 실행하는 것처럼 직접 실행할 수 있습니다.

  • name_deploy-src.jar: 타겟의 전이 폐쇄에서 수집된 소스가 포함된 보관 파일입니다. jar에 일치하는 소스 jar가 없는 경우를 제외하고 deploy.jar의 클래스와 일치합니다.

deps 속성은 srcs 없이 java_binary 규칙에서 허용되지 않습니다. 이러한 규칙에는 runtime_deps에서 제공하는 main_class가 필요합니다.

다음 코드 스니펫은 일반적인 실수를 보여줍니다.

java_binary(
    name = "DontDoThis",
    srcs = [
        ...,
        "GeneratedJavaFile.java",  # a generated .java file
    ],
    deps = [":generating_rule",],  # rule that generates that file
)

대신 다음 단계를 따르세요.

java_binary(
    name = "DoThisInstead",
    srcs = [
        ...,
        ":generating_rule",
    ],
)

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.


애플리케이션의 기본 진입점인 소스 파일의 이름 (확장자 제외)을 사용하는 것이 좋습니다. 예를 들어 진입점 이름이 Main.java이면 이름은 Main일 수 있습니다.
deps

라벨 목록입니다. 기본값은 []입니다.

타겟에 연결할 다른 라이브러리의 목록입니다. deps에 관한 일반적인 설명은 대부분의 빌드 규칙에서 정의하는 일반적인 속성을 참고하세요.
srcs

라벨 목록입니다. 기본값은 []입니다.

타겟을 만들기 위해 처리되는 소스 파일 목록입니다. 이 속성은 거의 항상 필요합니다. 아래의 예외를 참고하세요.

.java 유형의 소스 파일이 컴파일됩니다. 생성된 .java 파일의 경우 일반적으로 파일 자체의 이름 대신 생성 규칙의 이름을 여기에 지정하는 것이 좋습니다. 이렇게 하면 가독성이 향상될 뿐만 아니라 향후 변경사항에 더 탄력적으로 대응할 수 있습니다. 생성 규칙이 향후 다른 파일을 생성하는 경우 생성 규칙의 outs 한 곳만 수정하면 됩니다. 생성 규칙은 아무 작업도 하지 않으므로 deps에 나열해서는 안 됩니다.

.srcjar 유형의 소스 파일은 압축 해제되고 컴파일됩니다. 이는 genrule로 .java 파일 세트를 생성해야 하는 경우에 유용합니다.

규칙: 규칙 (일반적으로 genrule 또는 filegroup)이 위에 나열된 파일을 생성하는 경우 소스 파일에 설명된 것과 동일한 방식으로 사용됩니다.

이 인수는 main_class 속성이 런타임 클래스 경로의 클래스를 지정하거나 runtime_deps 인수를 지정하는 경우를 제외하고 거의 항상 필요합니다.

resources

라벨 목록입니다. 기본값은 []입니다.

Java jar에 포함할 데이터 파일 목록입니다.

리소스가 지정되면 컴파일 시 생성된 일반적인 .class 파일과 함께 jar에 번들로 묶입니다. jar 파일 내 리소스의 위치는 프로젝트 구조에 따라 결정됩니다. Bazel은 먼저 Maven의 표준 디렉터리 레이아웃('src' 디렉터리 다음에 'resources' 디렉터리 자손)을 찾습니다. 찾을 수 없는 경우 Bazel은 'java' 또는 'javatests'라는 최상위 디렉터리를 찾습니다. 예를 들어 리소스가 <workspace root>/x/java/y/java/z에 있는 경우 리소스의 경로는 y/java/z입니다. 이 휴리스틱은 재정의할 수 없지만 resource_strip_prefix 속성을 사용하여 리소스 파일의 특정 대체 디렉터리를 지정할 수 있습니다.

리소스는 소스 파일 또는 생성된 파일일 수 있습니다.

classpath_resources

라벨 목록입니다. 기본값은 []입니다.

다른 방법이 없는 경우에만 이 옵션을 사용하세요.

Java 트리의 루트에 있어야 하는 리소스의 목록입니다. 이 속성의 유일한 목적은 리소스가 클래스 경로에서 정확히 "myconfig.xml"로 표시되어야 하는 서드 파티 라이브러리를 지원하는 것입니다. 네임스페이스 충돌의 위험이 있으므로 라이브러리가 아닌 바이너리에서만 허용됩니다.

create_executable

불리언. 구성 불가. 기본값은 True입니다.

지원 중단되었으므로 대신 java_single_jar을 사용하세요.
deploy_env

라벨 목록입니다. 기본값은 []입니다.

이 바이너리의 배포 환경을 나타내는 다른 java_binary 타겟의 목록입니다. 다른 java_binary에서 로드할 플러그인을 빌드할 때 이 속성을 설정합니다.
이 속성을 설정하면 이 바이너리와 deploy_env에 지정된 타겟 간에 공유되는 이 바이너리의 런타임 클래스 경로 (및 배포 jar)에서 모든 종속 항목이 제외됩니다.
deploy_manifest_lines

문자열 목록입니다. 기본값은 []입니다.

*_deploy.jar 타겟용으로 생성된 META-INF/manifest.mf 파일에 추가할 줄 목록입니다. 이 속성의 콘텐츠는 '변수 만들기' 대체의 대상이 아닙니다.
javacopts

문자열 목록입니다. 기본값은 []입니다.

이 라이브러리의 추가 컴파일러 옵션입니다. 'Make 변수' 대체 및 Bourne 셸 토큰화가 적용됩니다.

이러한 컴파일러 옵션은 전역 컴파일러 옵션 뒤에 javac에 전달됩니다.

jvm_flags

문자열 목록입니다. 기본값은 []입니다.

이 바이너리를 실행하기 위해 생성된 래퍼 스크립트에 삽입할 플래그 목록입니다. $(location)'변수 만들기' 대체, Bourne 셸 토큰화가 적용됩니다.

Java 바이너리의 래퍼 스크립트에는 모든 종속 jar를 찾기 위한 CLASSPATH 정의가 포함되어 있으며 올바른 Java 인터프리터를 호출합니다. 래퍼 스크립트에서 생성된 명령줄에는 기본 클래스의 이름과 "$@"이 포함되므로 클래스 이름 뒤에 다른 인수를 전달할 수 있습니다. 그러나 JVM에서 파싱할 인수는 명령줄에서 클래스 이름 앞에 지정해야 합니다. jvm_flags의 콘텐츠는 클래스 이름이 표시되기 전에 래퍼 스크립트에 추가됩니다.

이 속성은 *_deploy.jar 출력에 영향을 미치지 않습니다.

launcher

라벨: 기본값은 None입니다.

JDK에 포함된 일반 bin/java 프로그램 대신 Java 프로그램을 실행하는 데 사용할 바이너리를 지정합니다. 타겟은 cc_binary여야 합니다. Java 호출 API를 구현하는 모든 cc_binary를 이 속성의 값으로 지정할 수 있습니다.

기본적으로 Bazel은 일반 JDK 런처 (bin/java 또는 java.exe)를 사용합니다.

관련 --java_launcher Bazel 플래그는 launcher 속성을 지정하지 않은 java_binaryjava_test 타겟에만 영향을 미칩니다.

네이티브 (C++, SWIG, JNI) 종속 항목은 JDK 런처를 사용하는지 또는 다른 런처를 사용하는지에 따라 다르게 빌드됩니다.

  • 일반 JDK 런처 (기본값)를 사용하는 경우 네이티브 종속 항목은 {name}_nativedeps.so라는 공유 라이브러리로 빌드되며 여기서 {name}는 이 java_binary 규칙의 name 속성입니다. 이 구성에서는 링커가 사용하지 않는 코드를 삭제하지 않습니다.
  • 다른 런처를 사용하는 경우 네이티브 (C++) 종속 항목은 {name}_nativedeps라는 바이너리에 정적으로 연결되며 여기서 {name}는 이 java_binary 규칙의 name 속성입니다. 이 경우 링커는 결과 바이너리에서 사용되지 않는 것으로 간주되는 모든 코드를 삭제합니다. 즉, cc_library 타겟이 alwayslink = 1를 지정하지 않는 한 JNI를 통해서만 액세스되는 C++ 코드는 링크되지 않을 수 있습니다.

기본 JDK 런처 이외의 런처를 사용하면 *_deploy.jar 출력 형식이 변경됩니다. 자세한 내용은 기본 java_binary 문서를 참고하세요.

main_class

문자열, 기본값은 ""입니다.

진입점으로 사용할 main() 메서드가 있는 클래스의 이름입니다. 규칙에서 이 옵션을 사용하는 경우 srcs=[...] 목록이 필요하지 않습니다. 따라서 이 속성을 사용하면 이미 하나 이상의 main() 메서드를 포함하는 Java 라이브러리에서 실행 파일을 만들 수 있습니다.

이 속성의 값은 소스 파일이 아닌 클래스 이름입니다. 클래스는 런타임에 사용할 수 있어야 합니다. 이 규칙 (srcs에서)에 의해 컴파일되거나 직접 또는 전이 종속 항목 (runtime_deps 또는 deps를 통해)에 의해 제공될 수 있습니다. 클래스를 사용할 수 없는 경우 바이너리가 런타임에 실패합니다. 빌드 시간 검사는 없습니다.

plugins

라벨 목록입니다. 기본값은 []입니다.

컴파일 시 실행되는 Java 컴파일러 플러그인 이 속성에 지정된 모든 java_plugin는 이 규칙이 빌드될 때마다 실행됩니다. 라이브러리는 exported_plugins를 사용하는 종속 항목에서 플러그인을 상속할 수도 있습니다. 플러그인에서 생성된 리소스는 이 규칙의 결과 jar에 포함됩니다.
resource_jars

라벨 목록입니다. 기본값은 []입니다.

지원 중단됨: 대신 java_import 및 deps 또는 runtime_deps를 사용하세요.
resource_strip_prefix

문자열, 기본값은 ""입니다.

Java 리소스에서 제거할 경로 접두사입니다.

지정하면 이 경로 접두사가 resources 속성의 모든 파일에서 제거됩니다. 리소스 파일이 이 디렉터리에 있지 않으면 오류가 발생합니다. 지정하지 않으면 (기본값) 리소스 파일의 경로는 소스 파일의 Java 패키지와 동일한 로직에 따라 결정됩니다. 예를 들어 stuff/java/foo/bar/a.txt의 소스 파일은 foo/bar/a.txt에 있습니다.

runtime_deps

라벨 목록입니다. 기본값은 []입니다.

최종 바이너리 또는 런타임 시 테스트에만 사용할 수 있는 라이브러리입니다. 일반 deps와 마찬가지로 런타임 클래스 경로에 표시되지만 컴파일 시간 클래스 경로에는 표시되지 않습니다. 런타임에만 필요한 종속 항목은 여기에 나열해야 합니다. 종속 항목 분석 도구는 runtime_depsdeps에 모두 표시되는 타겟을 무시해야 합니다.
stamp

정수, 기본값은 -1

빌드 정보를 바이너리로 인코딩할지 여부입니다. 가능한 값은 다음과 같습니다.
  • stamp = 1: --nostamp 빌드에서도 항상 빌드 정보를 바이너리에 스탬프합니다. 바이너리 및 바이너리에 종속된 모든 다운스트림 작업의 원격 캐싱을 중지할 수 있으므로 이 설정은 피해야 합니다.
  • stamp = 0: 항상 빌드 정보를 상수 값으로 대체합니다. 이렇게 하면 빌드 결과 캐싱이 향상됩니다.
  • stamp = -1: 빌드 정보의 삽입은 --[no]stamp 플래그로 제어됩니다.

스탬프가 지정된 바이너리는 종속 항목이 변경되지 않는 한 다시 빌드되지 않습니다.

use_launcher

불리언. 기본값은 True입니다.

바이너리가 맞춤 런처를 사용해야 하는지 여부입니다.

이 속성을 false로 설정하면 이 타겟에 대해 launcher 속성과 관련 --java_launcher 플래그가 무시됩니다.

use_testrunner

불리언. 기본값은 False입니다.

테스트 실행기 (기본적으로 com.google.testing.junit.runner.BazelTestRunner) 클래스를 Java 프로그램의 기본 진입점으로 사용하고 테스트 클래스를 테스트 실행기에 bazel.test_suite 시스템 속성 값으로 제공합니다. 이를 사용하여 기본 동작을 재정의할 수 있습니다. 기본 동작은 java_test 규칙에는 테스트 실행기를 사용하고 java_binary 규칙에는 테스트 실행기를 사용하지 않는 것입니다. 이 작업을 수행할 가능성은 거의 없습니다. 한 가지 용례는 다른 규칙에서 호출하는 AllTest 규칙입니다 (예: 테스트를 실행하기 전에 데이터베이스를 설정하는 경우). AllTest 규칙은 java_binary로 선언해야 하지만 여전히 테스트 실행기를 기본 진입점으로 사용해야 합니다. 테스트 실행기 클래스의 이름은 main_class 속성으로 재정의할 수 있습니다.

java_import

규칙 소스 보기
java_import(name, deps, data, compatible_with, constraints, deprecation, distribs, exec_compatible_with, exec_properties, exports, features, jars, licenses, neverlink, proguard_specs, restricted_to, runtime_deps, srcjar, tags, target_compatible_with, testonly, visibility)

이 규칙을 사용하면 사전 컴파일된 .jar 파일을 java_libraryjava_binary 규칙의 라이브러리로 사용할 수 있습니다.

    java_import(
        name = "maven_model",
        jars = [
            "maven_model/maven-aether-provider-3.2.3.jar",
            "maven_model/maven-model-3.2.3.jar",
            "maven_model/maven-model-builder-3.2.3.jar",
        ],
    )

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

deps

라벨 목록입니다. 기본값은 []입니다.

타겟에 연결할 다른 라이브러리의 목록입니다. java_library.deps를 참고하세요.
constraints

문자열 목록입니다. 구성 불가. 기본값은 []입니다.

이 규칙에 Java 라이브러리로 적용된 추가 제약조건입니다.
exports

라벨 목록입니다. 기본값은 []입니다.

이 규칙의 사용자에게 제공할 타겟입니다. java_library.exports를 참고하세요.
jars

라벨 목록(필수)

이 타겟에 종속된 Java 타겟에 제공된 JAR 파일 목록입니다.

불리언. 기본값은 False입니다.

이 라이브러리는 컴파일 시점에만 사용하고 런타임에는 사용하지 마세요. 실행 중에 런타임 환경에서 라이브러리를 제공하는 경우에 유용합니다. 이와 같은 라이브러리의 예로는 IDE 플러그인의 IDE API 또는 표준 JDK에서 실행되는 모든 항목의 tools.jar가 있습니다.
proguard_specs

라벨 목록입니다. 기본값은 []입니다.

Proguard 사양으로 사용되는 파일입니다. 여기에는 Proguard에서 사용할 사양 집합이 설명됩니다. 지정하면 이 라이브러리에 종속된 모든 android_binary 타겟에 추가됩니다. 여기에 포함된 파일에는 -dontnote, -dontwarn, assumenosideeffects, -keep으로 시작하는 규칙과 같은 일관된 규칙만 있어야 합니다. 다른 옵션은 중복 삭제되지 않는 병합을 보장하기 위해 android_binary의 proguard_specs에만 표시될 수 있습니다.
runtime_deps

라벨 목록입니다. 기본값은 []입니다.

최종 바이너리 또는 런타임 시 테스트에만 사용할 수 있는 라이브러리입니다. java_library.runtime_deps를 참고하세요.
srcjar

라벨: 기본값은 None입니다.

컴파일된 JAR 파일의 소스 코드가 포함된 JAR 파일입니다.

java_library

규칙 소스 보기
java_library(name, deps, srcs, data, resources, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exported_plugins, exports, features, javacopts, licenses, neverlink, plugins, proguard_specs, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, tags, target_compatible_with, testonly, visibility)

이 규칙은 소스를 컴파일하고 .jar 파일에 연결합니다.

암시적 출력 타겟

  • libname.jar: 클래스 파일이 포함된 Java 보관 파일입니다.
  • libname-src.jar: 소스가 포함된 보관 파일 ('소스 jar')입니다.

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

deps

라벨 목록입니다. 기본값은 []입니다.

이 라이브러리에 연결할 라이브러리 목록입니다. deps에 관한 일반적인 설명은 대부분의 빌드 규칙에서 정의하는 일반적인 속성을 참고하세요.

deps에 나열된 java_library 규칙으로 빌드된 jar는 이 규칙의 컴파일 시간 클래스 경로에 있습니다. 또한 deps, runtime_deps, exports의 전이 폐쇄가 런타임 클래스 경로에 있습니다.

반면 data 속성의 타겟은 런파일에 포함되지만 컴파일 시간 클래스 경로나 런타임 클래스 경로에는 포함되지 않습니다.

srcs

라벨 목록입니다. 기본값은 []입니다.

타겟을 만들기 위해 처리되는 소스 파일 목록입니다. 이 속성은 거의 항상 필요합니다. 아래의 예외를 참고하세요.

.java 유형의 소스 파일이 컴파일됩니다. 생성된 .java 파일의 경우 일반적으로 파일 자체의 이름 대신 생성 규칙의 이름을 여기에 지정하는 것이 좋습니다. 이렇게 하면 가독성이 향상될 뿐만 아니라 향후 변경사항에 더 탄력적으로 대응할 수 있습니다. 생성 규칙이 향후 다른 파일을 생성하는 경우 생성 규칙의 outs 한 곳만 수정하면 됩니다. 생성 규칙은 아무 작업도 하지 않으므로 deps에 나열해서는 안 됩니다.

.srcjar 유형의 소스 파일은 압축 해제되고 컴파일됩니다. 이는 genrule로 .java 파일 세트를 생성해야 하는 경우에 유용합니다.

규칙: 규칙 (일반적으로 genrule 또는 filegroup)이 위에 나열된 파일을 생성하는 경우 소스 파일에 설명된 것과 동일한 방식으로 사용됩니다.

이 인수는 main_class 속성이 런타임 클래스 경로의 클래스를 지정하거나 runtime_deps 인수를 지정하는 경우를 제외하고 거의 항상 필요합니다.

data

라벨 목록입니다. 기본값은 []입니다.

런타임 시 이 라이브러리에 필요한 파일 목록입니다. data에 관한 일반적인 설명은 대부분의 빌드 규칙에서 정의하는 일반적인 속성을 참고하세요.

java_library를 빌드할 때 Bazel은 이러한 파일을 어디에도 배치하지 않습니다. data 파일이 생성된 파일인 경우 Bazel에서 생성합니다. 이 java_library에 종속된 테스트를 빌드할 때 Bazel은 data 파일을 runfiles 영역으로 복사하거나 연결합니다.

resources

라벨 목록입니다. 기본값은 []입니다.

Java jar에 포함할 데이터 파일 목록입니다.

리소스가 지정되면 컴파일 시 생성된 일반적인 .class 파일과 함께 jar에 번들로 묶입니다. jar 파일 내 리소스의 위치는 프로젝트 구조에 따라 결정됩니다. Bazel은 먼저 Maven의 표준 디렉터리 레이아웃('src' 디렉터리 다음에 'resources' 디렉터리 자손)을 찾습니다. 찾을 수 없는 경우 Bazel은 'java' 또는 'javatests'라는 최상위 디렉터리를 찾습니다. 예를 들어 리소스가 <workspace root>/x/java/y/java/z에 있는 경우 리소스의 경로는 y/java/z입니다. 이 휴리스틱은 재정의할 수 없지만 resource_strip_prefix 속성을 사용하여 리소스 파일의 특정 대체 디렉터리를 지정할 수 있습니다.

리소스는 소스 파일 또는 생성된 파일일 수 있습니다.

exported_plugins

라벨 목록입니다. 기본값은 []입니다.

이 라이브러리에 직접 종속된 라이브러리로 내보낼 java_plugin (예: 주석 처리기) 목록입니다.

지정된 java_plugin 목록은 이 라이브러리에 직접 종속되는 모든 라이브러리에 적용됩니다. 마치 해당 라이브러리가 plugins에서 이러한 라벨을 명시적으로 선언한 것처럼 말입니다.

exports

라벨 목록입니다. 기본값은 []입니다.

내보낸 라이브러리

여기에 규칙을 나열하면 상위 규칙이 이러한 규칙에 명시적으로 종속된 것처럼 상위 규칙에서 규칙을 사용할 수 있습니다. 일반 (내보내지 않은) deps에는 적용되지 않습니다.

요약: 규칙 Xdeps 가장자리로 시작하고 그 뒤에 0개 이상의 exports 가장자리가 오는 종속 항목 경로가 두 규칙 간에 있는 경우 Y의 코드에 액세스할 수 있습니다. 이를 보여주는 몇 가지 예를 살펴보겠습니다.

AB에 종속되고 BC에 종속된다고 가정해 보겠습니다. 이 경우 C는 A의 전이 종속 항목이므로 C의 소스를 변경하고 A를 다시 빌드하면 모든 항목이 올바르게 다시 빌드됩니다. 그러나 A는 C에서 클래스를 사용할 수 없습니다. 이를 허용하려면 A가 deps에서 C를 선언하거나 B가 (B의) exports 속성에서 C를 선언하여 A (및 A에 종속될 수 있는 모든 항목)가 더 쉽게 할 수 있도록 해야 합니다.

내보낸 라이브러리의 폐쇄는 모든 직접 상위 규칙에서 사용할 수 있습니다. 약간 다른 예를 들어 보겠습니다. A는 B에 종속되고 B는 C 및 D에 종속되며 C는 내보내지만 D는 내보내지 않습니다. 이제 A는 C에 액세스할 수 있지만 D에는 액세스할 수 없습니다. 이제 C와 D가 각각 일부 라이브러리 C'와 D'를 내보낸 경우 A는 C'에만 액세스할 수 있고 D'에는 액세스할 수 없습니다.

중요: 내보낸 규칙은 일반 종속 항목이 아닙니다. 이전 예를 계속해서 살펴보면 B가 C를 내보내고 C를 사용하려면 자체 deps에도 C를 나열해야 합니다.

javacopts

문자열 목록입니다. 기본값은 []입니다.

이 라이브러리의 추가 컴파일러 옵션입니다. 'Make 변수' 대체 및 Bourne 셸 토큰화가 적용됩니다.

이러한 컴파일러 옵션은 전역 컴파일러 옵션 뒤에 javac에 전달됩니다.

불리언. 기본값은 False입니다.

이 라이브러리를 런타임이 아닌 컴파일에만 사용해야 하는지 여부입니다. 실행 중에 런타임 환경에서 라이브러리를 제공하는 경우에 유용합니다. 이러한 라이브러리의 예로는 IDE 플러그인의 IDE API 또는 표준 JDK에서 실행되는 모든 항목의 tools.jar가 있습니다.

neverlink = 1는 Java 언어 사양 (예: String 또는 기본 유형의 static final 상수) 따라서 런타임 라이브러리가 컴파일 라이브러리와 동일한 경우에 선호되는 사용 사례입니다.

런타임 라이브러리가 컴파일 라이브러리와 다른 경우 JLS에서 컴파일러의 인라인화를 금지하는 위치에서만 다르게 실행되어야 합니다 (이는 향후 모든 JLS 버전에 적용됨).

plugins

라벨 목록입니다. 기본값은 []입니다.

컴파일 시 실행되는 Java 컴파일러 플러그인 이 속성에 지정된 모든 java_plugin는 이 규칙이 빌드될 때마다 실행됩니다. 라이브러리는 exported_plugins를 사용하는 종속 항목에서 플러그인을 상속할 수도 있습니다. 플러그인에서 생성된 리소스는 이 규칙의 결과 jar에 포함됩니다.
proguard_specs

라벨 목록입니다. 기본값은 []입니다.

Proguard 사양으로 사용되는 파일입니다. 여기에는 Proguard에서 사용할 사양 집합이 설명됩니다. 지정하면 이 라이브러리에 종속된 모든 android_binary 타겟에 추가됩니다. 여기에 포함된 파일에는 -dontnote, -dontwarn, assumenosideeffects, -keep으로 시작하는 규칙과 같은 일관된 규칙만 있어야 합니다. 다른 옵션은 중복 삭제되지 않는 병합을 보장하기 위해 android_binary의 proguard_specs에만 표시될 수 있습니다.
resource_jars

라벨 목록입니다. 기본값은 []입니다.

지원 중단됨: 대신 java_import 및 deps 또는 runtime_deps를 사용하세요.
resource_strip_prefix

문자열, 기본값은 ""입니다.

Java 리소스에서 제거할 경로 접두사입니다.

지정하면 이 경로 접두사가 resources 속성의 모든 파일에서 제거됩니다. 리소스 파일이 이 디렉터리에 있지 않으면 오류가 발생합니다. 지정하지 않으면 (기본값) 리소스 파일의 경로는 소스 파일의 Java 패키지와 동일한 로직에 따라 결정됩니다. 예를 들어 stuff/java/foo/bar/a.txt의 소스 파일은 foo/bar/a.txt에 있습니다.

runtime_deps

라벨 목록입니다. 기본값은 []입니다.

최종 바이너리 또는 런타임 시 테스트에만 사용할 수 있는 라이브러리입니다. 일반 deps와 마찬가지로 런타임 클래스 경로에 표시되지만 컴파일 시간 클래스 경로에는 표시되지 않습니다. 런타임에만 필요한 종속 항목은 여기에 나열해야 합니다. 종속 항목 분석 도구는 runtime_depsdeps에 모두 표시되는 타겟을 무시해야 합니다.

java_lite_proto_library

규칙 소스 보기
java_lite_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

java_lite_proto_library.proto 파일에서 Java 코드를 생성합니다.

depsproto_library 규칙을 가리켜야 합니다.

예:

java_library(
    name = "lib",
    deps = [":foo"],
)

java_lite_proto_library(
    name = "foo",
    deps = [":bar"],
)

proto_library(
    name = "bar",
)

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

deps

라벨 목록입니다. 기본값은 []입니다.

Java 코드를 생성할 proto_library 규칙 목록입니다.

java_proto_library

규칙 소스 보기
java_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

java_proto_library.proto 파일에서 Java 코드를 생성합니다.

depsproto_library 규칙을 가리켜야 합니다.

예:

java_library(
    name = "lib",
    deps = [":foo_java_proto"],
)

java_proto_library(
    name = "foo_java_proto",
    deps = [":foo_proto"],
)

proto_library(
    name = "foo_proto",
)

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

deps

라벨 목록입니다. 기본값은 []입니다.

Java 코드를 생성할 proto_library 규칙 목록입니다.

java_test

규칙 소스 보기
java_test(name, deps, srcs, data, resources, args, classpath_resources, compatible_with, create_executable, deploy_manifest_lines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, javacopts, jvm_flags, launcher, licenses, local, main_class, plugins, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, shard_count, size, stamp, tags, target_compatible_with, test_class, testonly, timeout, toolchains, use_launcher, use_testrunner, visibility)

java_test() 규칙은 Java 테스트를 컴파일합니다. 테스트는 테스트 코드 주위의 바이너리 래퍼입니다. 컴파일되는 기본 클래스 대신 테스트 실행기의 기본 메서드가 호출됩니다.

암시적 출력 타겟

  • name.jar: Java 보관 파일입니다.
  • name_deploy.jar: 배포에 적합한 Java 보관 파일입니다. 명시적으로 요청된 경우에만 빌드됩니다. 자세한 내용은 java_binaryname_deploy.jar 출력 설명을 참고하세요.

java_binary() 인수에 관한 섹션을 참고하세요. 이 규칙은 모든 테스트 규칙 (*_test)에 공통적인 속성도 모두 지원합니다.

java_library(
    name = "tests",
    srcs = glob(["*.java"]),
    deps = [
        "//java/com/foo/base:testResources",
        "//java/com/foo/testing/util",
    ],
)

java_test(
    name = "AllTests",
    size = "small",
    runtime_deps = [
        ":tests",
        "//util/mysql",
    ],
)

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

deps

라벨 목록입니다. 기본값은 []입니다.

타겟에 연결할 다른 라이브러리의 목록입니다. deps에 관한 일반적인 설명은 대부분의 빌드 규칙에서 정의하는 일반적인 속성을 참고하세요.
srcs

라벨 목록입니다. 기본값은 []입니다.

타겟을 만들기 위해 처리되는 소스 파일 목록입니다. 이 속성은 거의 항상 필요합니다. 아래의 예외를 참고하세요.

.java 유형의 소스 파일이 컴파일됩니다. 생성된 .java 파일의 경우 일반적으로 파일 자체의 이름 대신 생성 규칙의 이름을 여기에 지정하는 것이 좋습니다. 이렇게 하면 가독성이 향상될 뿐만 아니라 향후 변경사항에 더 탄력적으로 대응할 수 있습니다. 생성 규칙이 향후 다른 파일을 생성하는 경우 생성 규칙의 outs 한 곳만 수정하면 됩니다. 생성 규칙은 아무 작업도 하지 않으므로 deps에 나열해서는 안 됩니다.

.srcjar 유형의 소스 파일은 압축 해제되고 컴파일됩니다. 이는 genrule로 .java 파일 세트를 생성해야 하는 경우에 유용합니다.

규칙: 규칙 (일반적으로 genrule 또는 filegroup)이 위에 나열된 파일을 생성하는 경우 소스 파일에 설명된 것과 동일한 방식으로 사용됩니다.

이 인수는 main_class 속성이 런타임 클래스 경로의 클래스를 지정하거나 runtime_deps 인수를 지정하는 경우를 제외하고 거의 항상 필요합니다.

resources

라벨 목록입니다. 기본값은 []입니다.

Java jar에 포함할 데이터 파일 목록입니다.

리소스가 지정되면 컴파일 시 생성된 일반적인 .class 파일과 함께 jar에 번들로 묶입니다. jar 파일 내 리소스의 위치는 프로젝트 구조에 따라 결정됩니다. Bazel은 먼저 Maven의 표준 디렉터리 레이아웃('src' 디렉터리 다음에 'resources' 디렉터리 자손)을 찾습니다. 찾을 수 없는 경우 Bazel은 'java' 또는 'javatests'라는 최상위 디렉터리를 찾습니다. 예를 들어 리소스가 <workspace root>/x/java/y/java/z에 있는 경우 리소스의 경로는 y/java/z입니다. 이 휴리스틱은 재정의할 수 없지만 resource_strip_prefix 속성을 사용하여 리소스 파일의 특정 대체 디렉터리를 지정할 수 있습니다.

리소스는 소스 파일 또는 생성된 파일일 수 있습니다.

classpath_resources

라벨 목록입니다. 기본값은 []입니다.

다른 방법이 없는 경우에만 이 옵션을 사용하세요.

Java 트리의 루트에 있어야 하는 리소스의 목록입니다. 이 속성의 유일한 목적은 리소스가 클래스 경로에서 정확히 "myconfig.xml"로 표시되어야 하는 서드 파티 라이브러리를 지원하는 것입니다. 네임스페이스 충돌의 위험이 있으므로 라이브러리가 아닌 바이너리에서만 허용됩니다.

create_executable

불리언. 구성 불가. 기본값은 True입니다.

지원 중단되었으므로 대신 java_single_jar을 사용하세요.
deploy_manifest_lines

문자열 목록입니다. 기본값은 []입니다.

*_deploy.jar 타겟용으로 생성된 META-INF/manifest.mf 파일에 추가할 줄 목록입니다. 이 속성의 콘텐츠는 '변수 만들기' 대체의 대상이 아닙니다.
javacopts

문자열 목록입니다. 기본값은 []입니다.

이 라이브러리의 추가 컴파일러 옵션입니다. 'Make 변수' 대체 및 Bourne 셸 토큰화가 적용됩니다.

이러한 컴파일러 옵션은 전역 컴파일러 옵션 뒤에 javac에 전달됩니다.

jvm_flags

문자열 목록입니다. 기본값은 []입니다.

이 바이너리를 실행하기 위해 생성된 래퍼 스크립트에 삽입할 플래그 목록입니다. $(location)'변수 만들기' 대체, Bourne 셸 토큰화가 적용됩니다.

Java 바이너리의 래퍼 스크립트에는 모든 종속 jar를 찾기 위한 CLASSPATH 정의가 포함되어 있으며 올바른 Java 인터프리터를 호출합니다. 래퍼 스크립트에서 생성된 명령줄에는 기본 클래스의 이름과 "$@"이 포함되므로 클래스 이름 뒤에 다른 인수를 전달할 수 있습니다. 그러나 JVM에서 파싱할 인수는 명령줄에서 클래스 이름 앞에 지정해야 합니다. jvm_flags의 콘텐츠는 클래스 이름이 표시되기 전에 래퍼 스크립트에 추가됩니다.

이 속성은 *_deploy.jar 출력에 영향을 미치지 않습니다.

launcher

라벨: 기본값은 None입니다.

JDK에 포함된 일반 bin/java 프로그램 대신 Java 프로그램을 실행하는 데 사용할 바이너리를 지정합니다. 타겟은 cc_binary여야 합니다. Java 호출 API를 구현하는 모든 cc_binary를 이 속성의 값으로 지정할 수 있습니다.

기본적으로 Bazel은 일반 JDK 런처 (bin/java 또는 java.exe)를 사용합니다.

관련 --java_launcher Bazel 플래그는 launcher 속성을 지정하지 않은 java_binaryjava_test 타겟에만 영향을 미칩니다.

네이티브 (C++, SWIG, JNI) 종속 항목은 JDK 런처를 사용하는지 또는 다른 런처를 사용하는지에 따라 다르게 빌드됩니다.

  • 일반 JDK 런처 (기본값)를 사용하는 경우 네이티브 종속 항목은 {name}_nativedeps.so라는 공유 라이브러리로 빌드되며 여기서 {name}는 이 java_binary 규칙의 name 속성입니다. 이 구성에서는 링커가 사용하지 않는 코드를 삭제하지 않습니다.
  • 다른 런처를 사용하는 경우 네이티브 (C++) 종속 항목은 {name}_nativedeps라는 바이너리에 정적으로 연결되며 여기서 {name}는 이 java_binary 규칙의 name 속성입니다. 이 경우 링커는 결과 바이너리에서 사용되지 않는 것으로 간주되는 모든 코드를 삭제합니다. 즉, cc_library 타겟이 alwayslink = 1를 지정하지 않는 한 JNI를 통해서만 액세스되는 C++ 코드는 링크되지 않을 수 있습니다.

기본 JDK 런처 이외의 런처를 사용하면 *_deploy.jar 출력 형식이 변경됩니다. 자세한 내용은 기본 java_binary 문서를 참고하세요.

main_class

문자열, 기본값은 ""입니다.

진입점으로 사용할 main() 메서드가 있는 클래스의 이름입니다. 규칙에서 이 옵션을 사용하는 경우 srcs=[...] 목록이 필요하지 않습니다. 따라서 이 속성을 사용하면 이미 하나 이상의 main() 메서드를 포함하는 Java 라이브러리에서 실행 파일을 만들 수 있습니다.

이 속성의 값은 소스 파일이 아닌 클래스 이름입니다. 클래스는 런타임에 사용할 수 있어야 합니다. 이 규칙 (srcs에서)에 의해 컴파일되거나 직접 또는 전이 종속 항목 (runtime_deps 또는 deps를 통해)에 의해 제공될 수 있습니다. 클래스를 사용할 수 없는 경우 바이너리가 런타임에 실패합니다. 빌드 시간 검사는 없습니다.

plugins

라벨 목록입니다. 기본값은 []입니다.

컴파일 시 실행되는 Java 컴파일러 플러그인 이 속성에 지정된 모든 java_plugin는 이 규칙이 빌드될 때마다 실행됩니다. 라이브러리는 exported_plugins를 사용하는 종속 항목에서 플러그인을 상속할 수도 있습니다. 플러그인에서 생성된 리소스는 이 규칙의 결과 jar에 포함됩니다.
resource_jars

라벨 목록입니다. 기본값은 []입니다.

지원 중단됨: 대신 java_import 및 deps 또는 runtime_deps를 사용하세요.
resource_strip_prefix

문자열, 기본값은 ""입니다.

Java 리소스에서 제거할 경로 접두사입니다.

지정하면 이 경로 접두사가 resources 속성의 모든 파일에서 제거됩니다. 리소스 파일이 이 디렉터리에 있지 않으면 오류가 발생합니다. 지정하지 않으면 (기본값) 리소스 파일의 경로는 소스 파일의 Java 패키지와 동일한 로직에 따라 결정됩니다. 예를 들어 stuff/java/foo/bar/a.txt의 소스 파일은 foo/bar/a.txt에 있습니다.

runtime_deps

라벨 목록입니다. 기본값은 []입니다.

최종 바이너리 또는 런타임 시 테스트에만 사용할 수 있는 라이브러리입니다. 일반 deps와 마찬가지로 런타임 클래스 경로에 표시되지만 컴파일 시간 클래스 경로에는 표시되지 않습니다. 런타임에만 필요한 종속 항목은 여기에 나열해야 합니다. 종속 항목 분석 도구는 runtime_depsdeps에 모두 표시되는 타겟을 무시해야 합니다.
stamp

정수, 기본값은 0

빌드 정보를 바이너리로 인코딩할지 여부입니다. 가능한 값은 다음과 같습니다.
  • stamp = 1: --nostamp 빌드에서도 항상 빌드 정보를 바이너리에 스탬프합니다. 바이너리 및 바이너리에 종속된 모든 다운스트림 작업의 원격 캐싱을 중지할 수 있으므로 이 설정은 피해야 합니다.
  • stamp = 0: 항상 빌드 정보를 상수 값으로 대체합니다. 이렇게 하면 빌드 결과 캐싱이 향상됩니다.
  • stamp = -1: 빌드 정보의 삽입은 --[no]stamp 플래그로 제어됩니다.

스탬프가 지정된 바이너리는 종속 항목이 변경되지 않는 한 다시 빌드되지 않습니다.

test_class

문자열, 기본값은 ""입니다.

테스트 실행기에서 로드할 Java 클래스입니다.

기본적으로 이 인수가 정의되지 않으면 기존 모드가 사용되고 테스트 인수가 대신 사용됩니다. 첫 번째 인수로 대체하지 않도록 --nolegacy_bazel_java_test 플래그를 설정합니다.

이 속성은 이 테스트에서 실행할 Java 클래스의 이름을 지정합니다. 이 값을 설정해야 하는 경우는 드뭅니다. 이 인수를 생략하면 타겟의 name 및 소스 루트 상대 경로를 사용하여 추론됩니다. 테스트가 알려진 소스 루트 외부에 있는 경우 test_class가 설정되지 않으면 Bazel에서 오류를 보고합니다.

JUnit3의 경우 테스트 클래스가 junit.framework.TestCase의 서브클래스이거나 junit.framework.Test (또는 Test의 서브클래스)를 반환하는 공개 정적 suite() 메서드가 있어야 합니다. JUnit4의 경우 클래스에 org.junit.runner.RunWith 주석이 있어야 합니다.

이 속성을 사용하면 여러 java_test 규칙이 동일한 Test(TestCase, TestSuite, ...)를 공유할 수 있습니다. 일반적으로 추가 정보가 전달되므로(예: jvm_flags=['-Dkey=value']를 통해) 테스트의 다른 하위 집합을 실행하는 등 각 사례에서 동작이 달라집니다. 이 속성을 사용하면 javatests 트리 외부에서 Java 테스트를 사용할 수도 있습니다.

use_launcher

불리언. 기본값은 True입니다.

바이너리가 맞춤 런처를 사용해야 하는지 여부입니다.

이 속성을 false로 설정하면 이 타겟에 대해 launcher 속성과 관련 --java_launcher 플래그가 무시됩니다.

use_testrunner

불리언. 기본값은 True입니다.

테스트 실행기 (기본적으로 com.google.testing.junit.runner.BazelTestRunner) 클래스를 Java 프로그램의 기본 진입점으로 사용하고 테스트 클래스를 테스트 실행기에 bazel.test_suite 시스템 속성 값으로 제공합니다. 이를 사용하여 기본 동작을 재정의할 수 있습니다. 기본 동작은 java_test 규칙에는 테스트 실행기를 사용하고 java_binary 규칙에는 테스트 실행기를 사용하지 않는 것입니다. 이 작업을 수행할 가능성은 거의 없습니다. 한 가지 용례는 다른 규칙에서 호출하는 AllTest 규칙입니다 (예: 테스트를 실행하기 전에 데이터베이스를 설정하는 경우). AllTest 규칙은 java_binary로 선언해야 하지만 여전히 테스트 실행기를 기본 진입점으로 사용해야 합니다. 테스트 실행기 클래스의 이름은 main_class 속성으로 재정의할 수 있습니다.

java_package_configuration

규칙 소스 보기
java_package_configuration(name, data, compatible_with, deprecation, distribs, features, javacopts, licenses, packages, restricted_to, tags, target_compatible_with, testonly, visibility)

패키지 세트에 적용할 구성입니다. 구성은 java_toolchain.javacopts에 추가할 수 있습니다.

예:

java_package_configuration(
    name = "my_configuration",
    packages = [":my_packages"],
    javacopts = ["-Werror"],
)

package_group(
    name = "my_packages",
    packages = [
        "//com/my/project/...",
        "-//com/my/project/testing/...",
    ],
)

java_toolchain(
    ...,
    package_configuration = [
        ":my_configuration",
    ]
)

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

data

라벨 목록입니다. 기본값은 []입니다.

런타임 시 이 구성에 필요한 파일 목록입니다.
javacopts

문자열 목록입니다. 기본값은 []입니다.

Java 컴파일러 플래그
packages

라벨 목록입니다. 기본값은 []입니다.

구성을 적용해야 하는 package_group 집합입니다.

java_plugin

규칙 소스 보기
java_plugin(name, deps, srcs, data, resources, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, generates_api, javacopts, licenses, neverlink, output_licenses, plugins, processor_class, proguard_specs, resource_jars, resource_strip_prefix, restricted_to, tags, target_compatible_with, testonly, visibility)

java_plugin는 Bazel에서 실행하는 Java 컴파일러의 플러그인을 정의합니다. 현재 지원되는 플러그인 유형은 주석 처리기뿐입니다. java_library 또는 java_binary 규칙은 plugins 속성을 통해 플러그인을 종속하여 실행할 수 있습니다. java_libraryexported_plugins를 사용하여 이를 직접적으로 사용하는 라이브러리로 플러그인을 자동으로 내보낼 수도 있습니다.

암시적 출력 타겟

  • libname.jar: Java 보관 파일입니다.

인수는 processor_class 인수 추가를 제외하고 java_library와 동일합니다.

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

deps

라벨 목록입니다. 기본값은 []입니다.

이 라이브러리에 연결할 라이브러리 목록입니다. deps에 관한 일반적인 설명은 대부분의 빌드 규칙에서 정의하는 일반적인 속성을 참고하세요.

deps에 나열된 java_library 규칙으로 빌드된 jar는 이 규칙의 컴파일 시간 클래스 경로에 있습니다. 또한 deps, runtime_deps, exports의 전이 폐쇄가 런타임 클래스 경로에 있습니다.

반면 data 속성의 타겟은 런파일에 포함되지만 컴파일 시간 클래스 경로나 런타임 클래스 경로에는 포함되지 않습니다.

srcs

라벨 목록입니다. 기본값은 []입니다.

타겟을 만들기 위해 처리되는 소스 파일 목록입니다. 이 속성은 거의 항상 필요합니다. 아래의 예외를 참고하세요.

.java 유형의 소스 파일이 컴파일됩니다. 생성된 .java 파일의 경우 일반적으로 파일 자체의 이름 대신 생성 규칙의 이름을 여기에 지정하는 것이 좋습니다. 이렇게 하면 가독성이 향상될 뿐만 아니라 향후 변경사항에 더 탄력적으로 대응할 수 있습니다. 생성 규칙이 향후 다른 파일을 생성하는 경우 생성 규칙의 outs 한 곳만 수정하면 됩니다. 생성 규칙은 아무 작업도 하지 않으므로 deps에 나열해서는 안 됩니다.

.srcjar 유형의 소스 파일은 압축 해제되고 컴파일됩니다. 이는 genrule로 .java 파일 세트를 생성해야 하는 경우에 유용합니다.

규칙: 규칙 (일반적으로 genrule 또는 filegroup)이 위에 나열된 파일을 생성하는 경우 소스 파일에 설명된 것과 동일한 방식으로 사용됩니다.

이 인수는 main_class 속성이 런타임 클래스 경로의 클래스를 지정하거나 runtime_deps 인수를 지정하는 경우를 제외하고 거의 항상 필요합니다.

data

라벨 목록입니다. 기본값은 []입니다.

런타임 시 이 라이브러리에 필요한 파일 목록입니다. data에 관한 일반적인 설명은 대부분의 빌드 규칙에서 정의하는 일반적인 속성을 참고하세요.

java_library를 빌드할 때 Bazel은 이러한 파일을 어디에도 배치하지 않습니다. data 파일이 생성된 파일인 경우 Bazel에서 생성합니다. 이 java_library에 종속된 테스트를 빌드할 때 Bazel은 data 파일을 runfiles 영역으로 복사하거나 연결합니다.

resources

라벨 목록입니다. 기본값은 []입니다.

Java jar에 포함할 데이터 파일 목록입니다.

리소스가 지정되면 컴파일 시 생성된 일반적인 .class 파일과 함께 jar에 번들로 묶입니다. jar 파일 내 리소스의 위치는 프로젝트 구조에 따라 결정됩니다. Bazel은 먼저 Maven의 표준 디렉터리 레이아웃('src' 디렉터리 다음에 'resources' 디렉터리 자손)을 찾습니다. 찾을 수 없는 경우 Bazel은 'java' 또는 'javatests'라는 최상위 디렉터리를 찾습니다. 예를 들어 리소스가 <workspace root>/x/java/y/java/z에 있는 경우 리소스의 경로는 y/java/z입니다. 이 휴리스틱은 재정의할 수 없지만 resource_strip_prefix 속성을 사용하여 리소스 파일의 특정 대체 디렉터리를 지정할 수 있습니다.

리소스는 소스 파일 또는 생성된 파일일 수 있습니다.

generates_api

불리언. 기본값은 False입니다.

이 속성은 API 코드를 생성하는 주석 프로세서를 표시합니다.

규칙이 API 생성 주석 프로세서를 사용하는 경우, 이에 종속된 다른 규칙은 컴파일 작업이 생성 규칙 후에 예약된 경우에만 생성된 코드를 참조할 수 있습니다. 이 속성은 --java_header_compilation이 사용 설정된 경우 Bazel에 예약 제약조건을 도입하도록 지시합니다.

경고: 이 속성은 빌드 성능에 영향을 미치므로 필요한 경우에만 사용하세요.

javacopts

문자열 목록입니다. 기본값은 []입니다.

이 라이브러리의 추가 컴파일러 옵션입니다. 'Make 변수' 대체 및 Bourne 셸 토큰화가 적용됩니다.

이러한 컴파일러 옵션은 전역 컴파일러 옵션 뒤에 javac에 전달됩니다.

불리언. 기본값은 False입니다.

이 라이브러리를 런타임이 아닌 컴파일에만 사용해야 하는지 여부입니다. 실행 중에 런타임 환경에서 라이브러리를 제공하는 경우에 유용합니다. 이러한 라이브러리의 예로는 IDE 플러그인의 IDE API 또는 표준 JDK에서 실행되는 모든 항목의 tools.jar가 있습니다.

neverlink = 1는 Java 언어 사양 (예: String 또는 기본 유형의 static final 상수) 따라서 런타임 라이브러리가 컴파일 라이브러리와 동일한 경우에 선호되는 사용 사례입니다.

런타임 라이브러리가 컴파일 라이브러리와 다른 경우 JLS에서 컴파일러의 인라인화를 금지하는 위치에서만 다르게 실행되어야 합니다 (이는 향후 모든 JLS 버전에 적용됨).

output_licenses

라이선스 유형입니다. 기본값은 ["none"]입니다.

common attributes 참조
plugins

라벨 목록입니다. 기본값은 []입니다.

컴파일 시 실행되는 Java 컴파일러 플러그인 이 속성에 지정된 모든 java_plugin는 이 규칙이 빌드될 때마다 실행됩니다. 라이브러리는 exported_plugins를 사용하는 종속 항목에서 플러그인을 상속할 수도 있습니다. 플러그인에서 생성된 리소스는 이 규칙의 결과 jar에 포함됩니다.
processor_class

문자열, 기본값은 ""입니다.

프로세서 클래스는 Java 컴파일러가 주석 프로세서의 진입점으로 사용해야 하는 클래스의 정규화된 유형입니다. 지정하지 않으면 이 규칙은 Java 컴파일러의 주석 처리에 주석 프로세서를 제공하지 않지만 런타임 클래스 경로는 여전히 컴파일러의 주석 프로세서 경로에 포함됩니다. 이는 주로 java.util.ServiceLoader를 사용하여 주석 프로세서 경로에서 로드되는 오류가 발생하기 쉬운 플러그인에서 사용하기 위한 것입니다.
proguard_specs

라벨 목록입니다. 기본값은 []입니다.

Proguard 사양으로 사용되는 파일입니다. 여기에는 Proguard에서 사용할 사양 집합이 설명됩니다. 지정하면 이 라이브러리에 종속된 모든 android_binary 타겟에 추가됩니다. 여기에 포함된 파일에는 -dontnote, -dontwarn, assumenosideeffects, -keep으로 시작하는 규칙과 같은 일관된 규칙만 있어야 합니다. 다른 옵션은 중복 삭제되지 않는 병합을 보장하기 위해 android_binary의 proguard_specs에만 표시될 수 있습니다.
resource_jars

라벨 목록입니다. 기본값은 []입니다.

지원 중단됨: 대신 java_import 및 deps 또는 runtime_deps를 사용하세요.
resource_strip_prefix

문자열, 기본값은 ""입니다.

Java 리소스에서 제거할 경로 접두사입니다.

지정하면 이 경로 접두사가 resources 속성의 모든 파일에서 제거됩니다. 리소스 파일이 이 디렉터리에 있지 않으면 오류가 발생합니다. 지정하지 않으면 (기본값) 리소스 파일의 경로는 소스 파일의 Java 패키지와 동일한 로직에 따라 결정됩니다. 예를 들어 stuff/java/foo/bar/a.txt의 소스 파일은 foo/bar/a.txt에 있습니다.

java_runtime

규칙 소스 보기
java_runtime(name, srcs, compatible_with, default_cds, deprecation, distribs, features, hermetic_srcs, java, java_home, lib_ct_sym, lib_modules, licenses, restricted_to, tags, target_compatible_with, testonly, version, visibility)

Java 런타임의 구성을 지정합니다.

예:

java_runtime(
    name = "jdk-9-ea+153",
    srcs = glob(["jdk9-ea+153/**"]),
    java_home = "jdk9-ea+153",
)

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

srcs

라벨 목록입니다. 기본값은 []입니다.

런타임의 모든 파일
default_cds

라벨: 기본값은 None입니다.

봉인된 java_runtime의 기본 CDS 보관 파일입니다. java_binary 타겟에 격리가 사용 설정되어 있고 타겟이 classlist 속성을 지정하여 자체 CDS 보관 파일을 제공하지 않는 경우 java_runtime 기본 CDS가 격리된 배포 JAR에 패키징됩니다.
hermetic_srcs

라벨 목록입니다. 기본값은 []입니다.

격리된 배포에 필요한 런타임의 파일입니다.
java

라벨: 기본값은 None입니다.

Java 실행 파일의 경로입니다.
java_home

문자열, 기본값은 ""입니다.

런타임 루트의 경로입니다. 'Make' 변수 대체가 적용됩니다. 이 경로가 절대 경로인 경우 규칙은 잘 알려진 경로가 있는 비밀 유지가 불가능한 Java 런타임을 나타냅니다. 이 경우 srcsjava 속성은 비어 있어야 합니다.
lib_ct_sym

라벨: 기본값은 None입니다.

--release로 컴파일하는 데 필요한 lib/ct.sym 파일입니다. 지정하지 않았고 srcs에 경로가 /lib/ct.sym로 끝나는 파일이 정확히 하나 있는 경우 이 파일이 사용됩니다.
lib_modules

라벨: 기본값은 None입니다.

격리된 배포에 필요한 lib/modules 파일입니다.
version

정수, 기본값은 0

Java 런타임의 기능 버전입니다. 즉, Runtime.version().feature()에서 반환된 정수입니다.

java_toolchain

규칙 소스 보기
java_toolchain(name, android_lint_data, android_lint_jvm_opts, android_lint_opts, android_lint_package_configuration, android_lint_runner, bootclasspath, compatible_with, deprecation, deps_checker, distribs, features, forcibly_disable_header_compilation, genclass, header_compiler, header_compiler_direct, ijar, jacocorunner, java_runtime, javabuilder, javabuilder_data, javabuilder_jvm_opts, javac_supports_multiplex_workers, javac_supports_workers, javacopts, jvm_opts, licenses, oneversion, oneversion_allowlist_for_tests, oneversion_whitelist, package_configuration, proguard_allowlister, resourcejar, restricted_to, singlejar, source_version, tags, target_compatible_with, target_version, testonly, timezone_data, tools, turbine_data, turbine_jvm_opts, visibility, xlint)

Java 컴파일러의 구성을 지정합니다. 사용할 도구 모음은 --java_toolchain 인수를 통해 변경할 수 있습니다. 일반적으로 Java 컴파일러를 조정하려는 경우가 아니라면 이러한 종류의 규칙을 작성해서는 안 됩니다.

간단한 예는 다음과 같습니다.

java_toolchain(
    name = "toolchain",
    source_version = "7",
    target_version = "7",
    bootclasspath = ["//tools/jdk:bootclasspath"],
    xlint = [ "classfile", "divzero", "empty", "options", "path" ],
    javacopts = [ "-g" ],
    javabuilder = ":JavaBuilder_deploy.jar",
)

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

android_lint_data

라벨 목록입니다. 기본값은 []입니다.

android_lint_jvm_opts에서 라벨 확장에 사용할 수 있는 도구의 라벨입니다.
android_lint_jvm_opts

문자열 목록입니다. 기본값은 []입니다.

Android 린트를 호출할 때 JVM의 인수 목록입니다.
android_lint_opts

문자열 목록입니다. 기본값은 []입니다.

Android 린트 인수 목록입니다.
android_lint_package_configuration

라벨 목록입니다. 기본값은 []입니다.

지정된 패키지 그룹에 적용해야 하는 Android 린트 구성입니다.
android_lint_runner

라벨: 기본값은 None입니다.

Android 린트 실행기의 라벨입니다(있는 경우).
bootclasspath

라벨 목록입니다. 기본값은 []입니다.

Java 타겟 부트스트랩 클래스 경로 항목입니다. javac의 -bootclasspath 플래그에 해당합니다.
deps_checker

라벨 목록입니다. 기본값은 []입니다.

ImportDepsChecker 배포 jar의 라벨입니다.
forcibly_disable_header_compilation

불리언. 기본값은 False입니다.

--java_header_compilation을 재정의하여 JDK 7 Bazel과 같이 헤더 컴파일을 지원하지 않는 플랫폼에서 헤더 컴파일을 사용 중지합니다.
genclass

라벨 목록(필수)

GenClass 배포 jar의 라벨입니다.
header_compiler

라벨 목록입니다. 기본값은 []입니다.

헤더 컴파일러의 라벨입니다. --java_header_compilation이 사용 설정된 경우 필요합니다.
header_compiler_direct

라벨 목록입니다. 기본값은 []입니다.

API 생성 주석 프로세서가 포함되지 않은 직접 클래스패스 작업에 사용할 헤더 컴파일러의 선택적 라벨입니다.

이 도구는 주석 처리를 지원하지 않습니다.

ijar

라벨 목록(필수)

ijar 실행 파일의 라벨입니다.
jacocorunner

라벨: 기본값은 None입니다.

JacocoCoverageRunner 배포 jar의 라벨입니다.
java_runtime

라벨: 필수사항

이 도구 모음과 함께 사용할 java_runtime입니다. 실행 구성에서 기본값은 java_runtime입니다.
javabuilder

라벨 목록(필수)

JavaBuilder 배포 jar의 라벨입니다.
javabuilder_data

라벨 목록입니다. 기본값은 []입니다.

javabuilder_jvm_opts에서 라벨 확장에 사용할 수 있는 데이터의 라벨입니다.
javabuilder_jvm_opts

문자열 목록입니다. 기본값은 []입니다.

JavaBuilder를 호출할 때 JVM의 인수 목록입니다.
javac_supports_multiplex_workers

불리언. 기본값은 True입니다.

JavaBuilder가 멀티플렉스 영구 작업자로 실행되는 것을 지원하는 경우 true이고 지원하지 않는 경우 false입니다.
javac_supports_workers

불리언. 기본값은 True입니다.

JavaBuilder가 영구 작업자로 실행되는 것을 지원하는 경우 true이고 지원하지 않는 경우 false입니다.
javacopts

문자열 목록입니다. 기본값은 []입니다.

Java 컴파일러의 추가 인수 목록입니다. 가능한 Java 컴파일러 플래그의 전체 목록은 Java 컴파일러 문서를 참고하세요.
jvm_opts

문자열 목록입니다. 기본값은 []입니다.

Java 컴파일러를 호출할 때 JVM의 인수 목록입니다. 이 옵션에 사용할 수 있는 플래그의 전체 목록은 Java 가상 머신 문서를 참고하세요.
oneversion

라벨: 기본값은 None입니다.

단일 버전 시정 조치 바이너리의 라벨입니다.
oneversion_allowlist_for_tests

라벨: 기본값은 None입니다.

테스트용 버전 하나 허용 목록의 라벨입니다.
oneversion_whitelist

라벨: 기본값은 None입니다.

단일 버전 허용 목록의 라벨입니다.
package_configuration

라벨 목록입니다. 기본값은 []입니다.

지정된 패키지 그룹에 적용해야 하는 구성입니다.
proguard_allowlister

라벨: 기본값은 "@bazel_tools//tools/jdk:proguard_whitelister"입니다.

Proguard 허용 목록 작성기의 라벨입니다.
resourcejar

라벨 목록입니다. 기본값은 []입니다.

리소스 jar 빌더 실행 파일의 라벨입니다.
singlejar

라벨 목록(필수)

SingleJar 배포 jar의 라벨입니다.
source_version

문자열, 기본값은 ""입니다.

Java 소스 버전 (예: '6' 또는 '7'). Java 소스 코드에서 허용되는 코드 구조 집합을 지정합니다.
target_version

문자열, 기본값은 ""입니다.

Java 타겟 버전 (예: '6' 또는 '7'). 클래스를 빌드할 Java 런타임을 지정합니다.
timezone_data

라벨: 기본값은 None입니다.

시간대 데이터가 포함된 리소스 jar의 라벨입니다. 설정하면 시간대 데이터가 모든 java_binary 규칙의 암시적 런타임 종속 항목으로 추가됩니다.
tools

라벨 목록입니다. 기본값은 []입니다.

jvm_opts에서 라벨 확장에 사용할 수 있는 도구의 라벨입니다.
turbine_data

라벨 목록입니다. 기본값은 []입니다.

turbine_jvm_opts에서 라벨 확장에 사용할 수 있는 데이터의 라벨입니다.
turbine_jvm_opts

문자열 목록입니다. 기본값은 []입니다.

turbine을 호출할 때 JVM의 인수 목록입니다.
xlint

문자열 목록입니다. 기본값은 []입니다.

기본 목록에 추가하거나 기본 목록에서 삭제할 경고 목록입니다. 대시를 앞에 붙여 삭제합니다. 자세한 내용은 -Xlint 옵션에 관한 Javac 문서를 참고하세요.