자바 플랫폼 모듈 시스템
Java Platform Module SystemJava Platform Module[1] System은 Java 코드 및 관련 리소스 모음의 배포 형식을 지정합니다.또한 이러한 컬렉션(또는 모듈)을 저장하기 위한 저장소와 모듈 검출, 로드 및 무결성을 확인하는 방법도 지정합니다.기존 JAR 형식의 일부 단점, 특히 클래스 경로 및 클래스 로드 문제 등의 문제를 일으킬 수 있는 JAR Hell을 수정하기 위한 네임스페이스 등의 기능이 포함되어 있습니다.
Java Module System은 처음에 Java Community Process에 따라 JSR 277로 개발되었으며 Java 7과 함께 출시될 예정이었습니다.
JSR 277은 나중에 보류되었고 JDK를 모듈화하기 위해 Project[2] Jigsaw가 생성되었습니다.이 JSR은 JSR 376(Java Platform Module System)으로 대체되었습니다.
Project Jigsaw는 원래 Java 7(2011년)을 위한 것이었으나 플랜 [3]B의 일부로 Java 8(2014년)로 연기되었고 2017년 [4]Java 9 릴리스로 다시 연기되었습니다.Java Module System을 포함한 Java 9는 2017년 [5]9월 21일에 출시되었습니다.
아키텍처
Java 9에서 구현된 Java 모듈시스템에는 다음 JEPS 및 JSR(Java Specification Request)[2]가 포함됩니다.
- JEP 200: 모듈러형 JDK: JDK의 모듈러 구조 정의
- JEP 201: 모듈러형 소스 코드: JDK 소스 코드를 모듈로 재구성하여 모듈을 컴파일하기 위한 빌드 시스템을 강화하고 빌드 시 모듈 경계를 적용합니다.
- JEP 220: 모듈러 런타임 이미지:모듈을 수용하고 성능, 보안 및 유지보수성을 향상시키기 위해 JDK 및 JRE 런타임 이미지를 재구성합니다.
- JEP 261: 모듈 시스템:Java 플랫폼 모듈 시스템 구현
- JEP 282:Java Linker: 일련의 모듈과 그 의존관계를 커스텀 런타임 이미지로[6] 조합 및 최적화할 수 있는 도구를 만듭니다.
- JSR 376: Java 플랫폼 모듈시스템[7]
또한 모듈 시스템으로의 이행을 용이하게 하기 위해 다른 몇 가지 JDK 9 기능이 추가되었습니다.
- JEP 238: Multi-Release JAR 파일: JAR 파일 형식을 확장하여 여러 Java 릴리스 고유 버전의 클래스 파일을 단일 [8]아카이브에서 공존시킬 수 있습니다.
- JEP 253: JavaFX UI Controls 및 CSS API 모듈화 준비:현재 내부 API를 통해서만 사용 가능하며 모듈화로 [9]인해 액세스할 수 없는 JavaFX 기능에 대한 공용 API를 정의합니다.
- JEP 260: 대부분의 내부 API 캡슐화: 기본적으로는 JDK의 내부 API 대부분에 액세스할 수 없도록 하되, 일부 중요하고 널리 사용되는 내부 API는 모든 기능 [10]또는 대부분의 기능에 대해 지원되는 대체 API가 존재할 때까지 액세스할 수 있도록 합니다.
- JEP 275: 모듈러형 Java 애플리케이션 패키징:Java 패키지는 JDK 9용으로 진화하여 모듈을 인식합니다.예를 들어 모듈 및 모듈이 [11]의존하는 모든 모듈을 패키징할 수 있습니다.
모듈 속성
모듈은 코드를 그룹화하는 새로운 방법입니다.Jar 파일과는 달리 모듈은 자신이 의존하는 모듈과 [12]내보내는 패키지를 명시적으로 선언합니다.명시적 종속성 선언은 대규모 응용 프로그램과 소프트웨어 구성 요소 간의 종속성에 대해 쉽게 추론할 수 있도록 함으로써 코드의 무결성을 향상시킵니다.
모듈 선언은 모듈의 소스 파일 계층의 루트에 있는 module-info.java라는 파일에 저장됩니다.JDK는 컴파일 시 및 실행 시 모듈 간의 의존성과 상호작용을 확인합니다.
예를 들어 다음 모듈 선언은 모듈이 com임을 선언합니다.foo.bar은 다른 COM에 의존합니다.foo.baz 모듈 및 com.foo.bar.alpha 및 com.foo.bar 패키지를 내보냅니다.베타판:
모듈 com.foo.bar {에는 com.foo.baz가 필요합니다.com.foo.bar.alpha를 내보내고 com.foo.bar을 내보냅니다.베타, } com.foo.bar.alpha 및 com.foo.bar의 퍼블릭멤버베타 패키지는 종속 모듈에서 액세스할 수 있습니다.개인 회원은 성찰 등의 수단을 통해서도 접근할 수 없습니다.Java 버전9 ~ 16 에서는, 이러한 「불법 액세스」가 실제로 허가되고 있는지는, 커맨드 라인 [13]설정에 의해서 다릅니다.
Java [14]9에서는 JDK 자체가 모듈화되어 있습니다.
OSGi와의 링크
Java 모듈 시스템은 OSGi 플랫폼이 현재 지원하는 모든 기능(라이프 사이클 모델이나 서비스 레지스트리 등)을 지원하는 것은 아닙니다.그러나 Java Module System은 OSGi에서 지원되지 않는 기능, 예를 들어 컴파일 시 모듈러 기능, 네이티브 라이브러리 [15]내장 지원 등을 지원합니다.Java Module System과 OSGi가 어떻게 상호 운용될 수 있는지 살펴보는 몇 개의 기사가 2016년에 발표되었습니다.이러한 정보는 InfoQ[16] 및 OSGi Alliance [17]블로그에서 확인할 수 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ "Java Platform Module System (JSR 376)". Oracle Corporation. Retrieved 2018-07-02.
- ^ a b "Project Jigsaw". Oracle Corporation. Retrieved 2015-11-29.
- ^ Mark Reinhold (2009-09-20). "It's time for … Plan B". Oracle Corporation. Retrieved 2017-06-21.
- ^ "JDK 9". Oracle Corporation. Retrieved 2016-02-24.
- ^ "Java 9: Release date and new features". techworld.com. 2017-07-21. Retrieved 2017-11-18.
- ^ "jlink: The Java Linker (JSR 282)". Oracle Corporation. Retrieved 2016-03-12.
- ^ "Java Platform Module System (JSR 376)". Oracle Corporation. Retrieved 2015-11-29.
- ^ "JEP 238: Multi-Release JAR Files". Oracle Corporation. Retrieved 2017-07-31.
- ^ "JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization". Oracle Corporation. Retrieved 2017-07-31.
- ^ "JEP 260: Encapsulate Most Internal APIs". Oracle Corporation. Retrieved 2017-07-31.
- ^ "JEP 275: Modular Java Application Packaging". Oracle Corporation. Retrieved 2017-07-31.
- ^ Mark Reinhold (2016-03-08). "The State of the Module System". Oracle Corporation. Retrieved 2017-02-18.
- ^ "JEP 396: Strongly Encapsulate JDK Internals by Default". Retrieved 2021-02-06.
- ^ "JDK Module Summary". Oracle Corporation. 2016-06-24. Retrieved 2017-02-18.
- ^ Mark Reinhold (2012-08-24). "Project Jigsaw: Late for the train: The Q&A". Oracle Corporation. Retrieved 2015-11-29.
- ^ "Java 9, OSGi and the Future of Modularity". InfoQ. Retrieved 2016-09-26.
- ^ "Java Module Layers and OSGi Bundles". OSGi Alliance. Retrieved 2016-08-01.