내가 자바 (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에서 제공된 오류 메시지보다 어떤면에서 더 낫습니다. 모듈 중 하나가 최종 결과 다른 것입니다. 다른 말로하면, 다른 오류 메시지를 만드는 배려는 무엇 이었습니까?
* "왜 처음 두 경우도 컴파일 중에 잡히지 않습니까?"* 컴파일러가 모듈 C에서 직접 사용하지 않는 패키지의 * 확장 * 분석을 수행하지 않았기 때문에. # 3만이 컴파일러가'com.foo' 패키지를 보게 만듭니다. 이제, # 2가'com.foo'에서 클래스를'import '하려고 시도했다면, 컴파일러는 어떤 모듈을 가져올 지 알아야하기 때문에 아마도 컴파일에 실패 할 것입니다. – Andreas
@Andreas, 모름지기 - 모든 동일한 패키지가 두 모듈에서 모두 내 보낸 후에. 나는 은색 판에 컴파일러에게 그것을 실제로주고있다. :). 키워드를 고려해 긴 체인이라 할지라도 이는 계산 상 복잡한 문제가 아닙니다. 그들은 이미 가독성 그래프를 작성하고 있으므로 모든 것이 거기에 있습니다. – Vitaliy
그래서 그들은 추가 작업 (선택 사항)을 수행하지 않았습니다. * "왜?"*를 묻는 것보다 중요하다고 생각한다면, 개선 요청을 제출하는 것이 좋습니다. – Andreas