자바9 자바 플랫폼 모듈 시스템

https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUID-C23AFD78-C777-460B-8ACE-58BE5EA681F6

여기서 소개하고 있는 기능을 하나씩 살펴보는 중이다. 먼저 젤 위에 있는 모듈 시스템에 대해 살짝 봤다. 아주 오래전 OSGi라는 기술이 반짝하고 뜨다가 급속도로 식어가는 모습을 본적이 있다. 왠지 이 기능은 그때 그 기술을 연상시킨다. 딱히 좋은 기억은 아니다. 어렵게 공부했는데 제대로 쓰지도 못해보고 잊혀졌다. 아무튼..

  • 컴파일 타임과 런 타임 사이에 링크 타임이라는 페이즈를 추가했고 그 시점에 모듈을 조립하고 최적화 하여 커스텀 런타임 이미지로 만들 수 있다.
  • javac, jlink, java에 모듈 관련 옵션이 추가됐다.
  • JAR 파일 안에 module-info.java 파일이 있는 모듈러 JAR라는 생겼다. (OSGi랑 아주 비슷하다. 그럴 수 밖에 하려는게 비슷하니까.)
  • JMOD라는 포맷을 추가했다고 하는데 잘 모르겠다. 네이티브 코드랑 설정 파일만 들어있는 JAR랑 비슷하다는 모르겠다. 자세한건 jmod 참조.
  • JDK 자체가 모듈로 바꼈다. 그래서
    • JDK 모듈을 맘대로 조립해 쓸 수 있다.
    • JDK랑 JRE 런타임 이미지를 재건축하여 성능, 보안, 유지용이성을 개선했다.
    • 런타임 이미지에 들어있는 리소스, 클래스, 모듈 이름에 쓰이는 새로운 URI 스키마를 만들었다. 내부 구조나 이미지 형식을 노출시키지 않고 명명할 수 있는 스키마인가 보다.
    • Removes the endorsed-standards override mechanism and the extension mechanism. 이건 뭔지 모르겠다.
    • rt.jar랑 tool.jar를 자바 런타임 이미지에서 제거했다.
    • 대부분의 내부 API는 접근을 막았지만 널리 자주 쓰이는 내부 API는 대체제가 생길때까지 열어둘 것이다. (참 애매하구만.) jdeps -jdkinternals로 내부 API 뭘 쓰고 있는지 찾아낼 수 있다.

이걸 만든 사람의 강연인데..  볼만하다.

  • public이어도 이제 다 공개 되어 쓸 수 있는건 아니다. 그 모듈에서 공개한 패키지에 들어있는 public 클래스만 쓸 수 있게 된다.
  • 그렇게 귀찮고 보수적으로 굴어서 얻는게 뭐냐면 런타임에 클래스 찾을라고 수 많은 JAR 파일 다 뒤지고 다니지 않고, 아마도 링크 타임에 모듈 인포 파일에 있는 패키지 정보 가지고 금방 찾을 수 있을테니 성능이 좋다고 한다. 당연히 보수적이니까 보안상으로도 좋다고 하겠지.
  • 대신 그렇게 하려면 한 패지지는 무조건 한 JAR에서만 공개해야 한다.
  • OSGi랑 다른점은 똑같은 JAR 다른 버전 여러개 지원하지 않는다. 툴에다 맡긴다는 말이 있는데 Maven이랑 다른게 뭐지? 내가 뭘 잘못알아 들었을지도..
  • 패지키 export는 컴파일 타임과 런타임 둘 다 해당된다.
  • 그런데 패키지 opens는 런타임에 리플렉션으로 그 패키지 안에 있는거 다 까볼 수 있게 해준다. 하지만 컴파일시엔 못쓴다.
  • jdeps로 해당 JAR 파일이 사용하는 패키지 목록을 뽑을 수 있다. (근데 서드 파티 패키지는 잘 안뽑히는듯?)

시간이 지나면 다들 모듈로 바뀌어 가겠지만 주로 라이브러리를 사용하는 입장에서는 크게 달라지는건 없을것 같다. 어차피 똑같은 JAR 파일일 뿐이고 public은 설마 다 export 해주겠지..