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 옵션을 성공적으로 전달할 수 없었습니다.
는 지금까지 시도했다 :
- 이 java_library 규칙에 javacopts을 설정 인코딩 ISO-8859-1와 규칙을 java_toolchain 선언하고 사용 Bazel의 명령 줄
- 에서 --javacopt 설정
- 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
답변 해 주셔서 감사합니다. 이전에 toolchain 정의를 사용했지만 성공하지 못했습니다. 이제 다시 시도했지만 여전히 문제를 해결할 수 없었습니다. 나는 무엇이 잘못 될지를보기 위해 소스 코드를 검사하려고 노력하는 것보다 짧은 아이디어가 부족합니다. –
유스 케이스를 만들 수 있는지 알아보기위한 저장소가 있습니까? –
제가 설정할 수있는 것을 보겠습니다 (레거시 저장소가 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 그룹의 옵션 만 허용합니다. –