2017-03-26 19 views
7

내가 자바 (9) 실험과 찾고 : 1Java 9에서 어떤 경우 패키지 충돌이 약간 다르게 처리되는 이유는 무엇입니까? 다음과 같은 시나리오에서

  • 모듈 모두 com.foo라는 이름의 비어 있지 않은 패키지를 선언
  • 모듈 B

    실험, 그러나 은 내보내기하지 않습니다..

    java.lang.RuntimeException가 : 모듈 B와 모듈 모두의 패키지 com.foo

  • 모두 'C'에서 메인 실행 제 3 모듈 C

에 필요한 것은 런타임 오류를 제공합니다 이번에 수출 com.foo 모두 이전과 동일한

실험 2

. C에서 주 실행

결과 :

java.lang.module.ResolutionException : 모듈 B 및 수출 패키지 com.foo 모듈 3

같은 C

실험 2로하지만 이번에는 모듈 com.foo를 모듈 C에 선언했습니다.

이제 컴파일 오류가 발생합니다 : 오류 : (4, 1) java : 모듈 C가 A와 B 모두에서 com.foo 패키지를 읽습니다.

컴파일하는 동안 처음 두 사례가 잡히지 않는 이유는 무엇입니까? 프로그램을 실행하기 전에 해결하지 못하게하는 런타임 속성이 있습니까?

또한 오류 메시지에 관한 한 : 실험 2의 오류 메시지는 실험 1에서 제공된 오류 메시지보다 어떤면에서 더 낫습니다. 모듈 중 하나가 최종 결과 다른 것입니다. 다른 말로하면, 다른 오류 메시지를 만드는 배려는 무엇 이었습니까?

+2

* "왜 처음 두 경우도 컴파일 중에 잡히지 않습니까?"* 컴파일러가 모듈 C에서 직접 사용하지 않는 패키지의 * 확장 * 분석을 수행하지 않았기 때문에. # 3만이 컴파일러가'com.foo' 패키지를 보게 만듭니다. 이제, # 2가'com.foo'에서 클래스를'import '하려고 시도했다면, 컴파일러는 어떤 모듈을 가져올 지 알아야하기 때문에 아마도 컴파일에 실패 할 것입니다. – Andreas

+1

@Andreas, 모름지기 - 모든 동일한 패키지가 두 모듈에서 모두 내 보낸 후에. 나는 은색 판에 컴파일러에게 그것을 실제로주고있다. :). 키워드를 고려해 긴 체인이라 할지라도 이는 계산 상 복잡한 문제가 아닙니다. 그들은 이미 가독성 그래프를 작성하고 있으므로 모든 것이 거기에 있습니다. – Vitaliy

+1

그래서 그들은 추가 작업 (선택 사항)을 수행하지 않았습니다. * "왜?"*를 묻는 것보다 중요하다고 생각한다면, 개선 요청을 제출하는 것이 좋습니다. – Andreas

답변

7

실험 # 2와 # 3은 분할 패키지 문제이며 컴파일 타임과 런타임 모두에서 오류가 발생해야합니다. # 2에서는 C에서 컴파일 오류가 발생하지 않는 이유를 게시판에서 알 수 없습니다. "모듈 C는 A와 B 모두에서 com.foo 패키지를 읽습니다"와 같은 텍스트 오류가 표시되어야합니다.

실험 # 1은 중복 된 패키지로 인해 동일한 이름 공간 (동일한 클래스 로더)에 모두 살 수없는 응용 프로그램 모듈 경로의 A, B 및 C 일 가능성이 큽니다. 최근 빌드에서 보는 오류 메시지가 조금 개선되었습니다.

여기서의 실험은 jigsaw-dev에 대한 많은 스레드에서 논의되었으며 적어도 JDK 9가 아직 개발 중일 때는 질문과 경험을 불러오는 데 더 좋을 수 있습니다.

+0

감사합니다. Alan. 내가 올바르게 이해한다면 모든 경우에 컴파일 오류가 발생해야합니다. 필요할 경우 메일 링리스트에서 다시 확인하고 다시 게시 해 보겠습니다. 이제 생각해 보면, Intellij의 EA 버전을 실험하고 있습니다. 그들은 뭔가를 놓친 것일 수도 있습니다. – Vitaliy

+2

실험 # 1은 컴파일 오류가 발생하지 않으며 다른 두 개는 수행해야합니다. # 1은 모듈이 응용 프로그램 모듈 경로가 아닌 하위 계층에로드 될 때 런타임에 작동합니다. –

+1

그래서 @AlanBateman 자신의 답변을 얻을 때 정말 멋지다! – Eugene