2017-04-16 11 views
1

ISO-8859-1 문자 인코딩을 사용하여 일부 소스 파일을 저장하는 외부 소스 저장소가 있습니다. Bazel을 통해 호출 할 때 javac가 기본 UTF-8에서 ISO-8859-1로 변경하는 데 문제가 있습니다.Bazel : java_library javacopts를 통한 문자 인코딩이 작동하지 않습니까?

나는 Bazel를 통해 외부 저장소를 가져 오는하고있어 가져온 파일의 캐릭터 세트 확인할 수 있습니다

> cd bazel-PROJECT/external/third-party/src 
> file -i LibraryCode.java 
LibraryCode.java: text/x-c; charset=iso-8859-1 

Bazel의 java_library를 통해 외부 소스를 구축, 또는에서 직접 javac의를 통해 외부 저장소의 소스 파일을 컴파일 시도를 명령 줄 (예상)와 함께 실패 Bazel에 의해 가져온 외부 저장소 파일에 대한 명령 줄에서 사용할 때 javac의의 -encoding 인수를 사용하려고

error: unmappable character for encoding UTF8 

컴파일 문제를 해결 :

> javac -encoding iso-8859-1 LibraryCode.java 

그러나 Bazel을 통해 javac에 -encoding 옵션을 성공적으로 전달할 수 없었습니다.

는 지금까지 시도했다 :

  1. 이 java_library 규칙에 javacopts을 설정 인코딩 ISO-8859-1와 규칙을 java_toolchain 선언하고 사용 Bazel의 명령 줄
  2. 에서 --javacopt 설정
  3. Bazel의 명령 행에서 --java_toolchain을 사용하여.

이러한 시도 중 charset 불일치와 컴파일러 오류가 발생하지 않았습니다.

1) repository_rule build_file는 :

> bazel build --javacopt="-encoding iso-8859-1" target 

3) 부호화 설정으로 정의 자바 툴체인 대상 :

java_toolchain(
    name = "toolchain", 
    bootclasspath = ["@bazel_tools//tools/jdk:bootclasspath"], 
    encoding = "iso-8859-1", 
    extclasspath = ["@bazel_tools//tools/jdk:extdir"], 
    forcibly_disable_header_compilation = 0, 
    genclass = ["@bazel_tools//tools/jdk:GenClass_deploy.jar"], 
    header_compiler = ["@bazel_tools//tools/jdk:turbine_deploy.jar"], 
    ijar = ["@bazel_tools//tools/jdk:ijar"], 
    javabuilder = ["@bazel_tools//tools/jdk:JavaBuilder_deploy.jar"], 
    javac = ["@bazel_tools//third_party/java/jdk/langtools:javac_jar"], 
    javac_supports_workers = 1, 
    jvm_opts = [ 
    "-XX:+TieredCompilation", 
    "-XX:TieredStopAtLevel=1", 
    ], 
    misc = [ 
    "-XDskipDuplicateBridges=true", 
    ], 
    singlejar = ["@bazel_tools//tools/jdk:SingleJar_deploy.jar"], 
    source_version = "8", 
    target_version = "8", 

    visibility = ["//visibility:public"] 
) 

모든

java_library(
    name = "thirdparty", 
    srcs = glob(["src/**/*.java"]), 
    javacopts = ["-encoding iso-8859-1"], 
    visibility = ["//visibility:public"] 
) 

2) Bazel 명령 라인 thirdparty.BUILD UTF8을 인코딩 할 때 매핑 할 수없는 문자가 오류로 끝납니다.

Bazel을 통해 javac 인코딩을 설정하는 데 실수 한 점은 무엇입니까?

외부 저장소 소스 파일을 iconv를 통해 변환하여이 문제를 해결할 수 있지만 의도 한대로 javac의 인코딩 설정을 통해 해결하는 것이 좋습니다. 인정 안한다

후속

java_toolchain 인코딩은 버그가 수 있도록 나타납니다. 나는 Bazel의 로컬 복사본에 대한 예비 픽스를 가지고있다. charset (위의 옵션 # 3) 변경에 대한 java_toolchain 접근법이 작동하는 것 같다. 이 사안에서 제안 된 수정 추적

: #2926

답변

1

는 불행하게도 명령 줄/대상에서 기반 것을 할 수있는 좋은 방법이 없습니다. java_toolchain을 작성하고이를 가리켜 야합니다.(참조

이 그럼 당신은 --java_toolchain=//my:toolchain와 그 툴체인을 가리킬 수 있습니다 :

java_toolchain(
    name = "toolchain", 
    bootclasspath = ["@bazel_tools//tools/jdk:bootclasspath"], 
    encoding = "iso-8859-1", 
    extclasspath = ["@bazel_tools//tools/jdk:extclasspath"], 
    forcibly_disable_header_compilation = 0, 
    genclass = ["@bazel_tools//tools/jdk:genclass"], 
    header_compiler = ["@bazel_tools//tools/jdk:turbine"], 
    ijar = ["@bazel_tools//tools/jdk:ijar"], 
    javabuilder = ["@bazel_tools//tools/jdk:javabuilder"], 
    javac = ["@bazel_tools//third_party/java/jdk/langtools:javac_jar"], 
    javac_supports_workers = 1, 
    jvm_opts = [ 
     "-XX:+TieredCompilation", 
     "-XX:TieredStopAtLevel=1", 
    ], 
    misc = [ 
     "-XDskipDuplicateBridges=true", 
    ], 
    singlejar = ["@bazel_tools//tools/jdk:SingleJar_deploy.jar"], 
    source_version = "8", 
    target_version = "8", 
) 

이 (@bazel_tools//tools/jdk:singlejar IIRC 성능의 이유로 C++ 바이너리에 singlejar 대상을 변경할 수 있습니다 :)을 초래할 것이라는 one from bazel 도출 java_toolchain flag)

+0

답변 해 주셔서 감사합니다. 이전에 toolchain 정의를 사용했지만 성공하지 못했습니다. 이제 다시 시도했지만 여전히 문제를 해결할 수 없었습니다. 나는 무엇이 잘못 될지를보기 위해 소스 코드를 검사하려고 노력하는 것보다 짧은 아이디어가 부족합니다. –

+0

유스 케이스를 만들 수 있는지 알아보기위한 저장소가 있습니까? –

+0

제가 설정할 수있는 것을 보겠습니다 (레거시 저장소가 svn에 있고 svn repository_rule에 대한 사용자 지정 확장 프로그램을 가졌습니다). 그 사이에, 나는 java_common.compile()을 가지고 놀았고, -encoding 옵션과 함께 사용했을 때 sun. * 패키지의 예외 인수 예외와 함께 예외 스택 추적을 얻을 수있었습니다. https://github.com/bazelbuild/bazel/commit/3c5e55ff8e058b624ce26e803ff00434c70d4b91 여기에 버그가 제기 된 근본 원인이 의심됩니다. https://github.com/bazelbuild/bazel/issues/2606 짧은 설명 , Sun Javac API getTask()는 그 외 모든 것을 제외하고 BASIC 그룹의 옵션 만 허용합니다. –

관련 문제