Java9 - New JDK Tools
jshell
java9에는 REPL(Read-Eval-Print Loop) tool에 해당하는 jshell 이 추가 되었다. REPL tool은 command line interface에서 code를 입력하면서 line-by-line 코딩을 하고 그 결과를 즉시 확인할 수 있는 tool 이다. 아래의 명령어로 실행할 수 있다.실행
D:\work\java\jdk-9.0.4\bin>jshell
| Welcome to JShell -- Version 9.0.4
| For an introduction type: /help intro
jshell>
jshell 실행시 자동으로 수행되는 코드가 있는데, 이것을 확인하려면 아래와 같이 입력한다.
jshell> /list -start
s1 : import java.io.*;
s2 : import java.math.*;
s3 : import java.net.*;
s4 : import java.nio.file.*;
s5 : import java.util.*;
s6 : import java.util.concurrent.*;
s7 : import java.util.function.*;
s8 : import java.util.prefs.*;
s9 : import java.util.regex.*;
s10 : import java.util.stream.*;
jshell>
위와 같이 import statement들이 기본적으로 수행됨으로써, 다양한 java coding을 통한 테스트를 수행할 수 있다. jshell을 통해서는 변수 선언, method 선언, class 선언 등의 다양한 coding을 수행할 수 있으며 아래와 같은 결과를 확인할 수 있다.
jshell> String str1 = "baseball"
str1 ==> "baseball"
jshell> String str2 = "basketball"
str2 ==> "basketball"
jshell> String toKoreanLeague(String name) {
...> if ("baseball".equals(name)) {
...> return "KBO";
...> } else if ("basketball".equals(name)) {
...> return "KBL";
...> }
...> return "hmm";
...> }
| created method toKoreanLeague(String)
jshell> toKoreanLeague(str1);
$4 ==> "KBO"
작성한 함수나 클래스를 수정하고 싶으면 아래와 같이 입력한다. 입력 후 JShell Edit Pad가 launch 되어 직접 수정이 가능하다.jshell> /edit toKoreanLeague
jlink
jlink tool은 java runtime image를 생성하는 도구로서, image를 최적화된 상태(dependencies optimized)로 조합(assemble)해준다. 최적화된 상태란 deploy 될 image 구조의 단순화, 파일 size 축소 등을 의미한다.
jlink [options] --module-path modulepath --add-modules module [,module...] --output name
modulepathlink할 module (source)이 존재하는 경로로서 jar, jmod 파일뿐 아니라 exploded type의 모듈도 가능하다.
module
runtime 이미지에 추가될 module, module 및 그들의 dependency 정보도 추가된다.
output
이미지가 생성될 경로
jlink options
- --add-modules mod [,mod...]
- 생성될 이미지에 추가될 모듈들을 정의한다.
- --bind-services
- service provider module들과 그 dependency를 link한다.
- -c or --compress
- size를 축소하기 위한 압축 방법을 선택
- 0 - 압축하지 않음
- 1 - String Constant들을 공유함
- 2 - zip
- -h or --help
- 도움말 출력
- --launcher command=module(module/main)
- 생성될 이미지의 실행 명령어 또는 main class를 지정한다.
- -p or --module-path modulepath
- jlink가 탐색할 모듈의 path를 지정한다.
- --output path
- 실행 결과로 생성될 이미지의 경로
- --suggest-providers [name, ...]
- 주어진 modulepath에서 특정 type에 대한 provider들을 보여준다.
Example
D:\work\java\jdk-9.0.4\bin>jlink --module-path D:\work\java\jdk-9.0.4\jmods --add-modules java.base,java.sql --output result
위의 command는 jdk에서 제공하는 java.base와 java.sql 모듈을 link하여 그 결과를 result 디렉토리에 생성하는 명령어이다. result 디렉토리로 이동하여 다음 명령어를 입력하면 result 이미지가 어떤 module들을 포함하고 있는지 확인할 수 있다.D:\work\java\jdk-9.0.4\bin\result>bin\java --list-modules
java.base@9.0.4
java.logging@9.0.4
java.sql@9.0.4
java.xml@9.0.4
아래와 같이 compress 옵션을 사용하여 사용하지 않은 결과물과의 size 차이를 알수 있다.
D:\work\java\jdk-9.0.4\bin>jlink --module-path D:\work\java\jdk-9.0.4\jmods --add-modules java.base,java.sql --compress=2 --output compressed_result
compress 옵션을 사용하지 않은 경우 result 디렉토리의 경우 47.4MB 정도의 사이즈인데, compressed_result의 경우는 29.0MB로 size가 많이 줄어들었음을 알 수 있다.module path의 특정 Provider를 구현한 provider들을 확인하고 싶은 경우 아래와 같이 하면 된다.
D:\work\java\jdk-9.0.4\bin>jlink --module-path D:\work\java\jdk-9.0.4\jmods --suggest-providers java.security.Provider
Suggested providers:
java.naming provides java.security.Provider used by java.base
java.security.jgss provides java.security.Provider used by java.base
java.security.sasl provides java.security.Provider used by java.base
java.smartcardio provides java.security.Provider used by java.base
java.xml.crypto provides java.security.Provider used by java.base
jdk.crypto.cryptoki provides java.security.Provider used by java.base
jdk.crypto.ec provides java.security.Provider used by java.base
jdk.crypto.mscapi provides java.security.Provider used by java.base
jdk.deploy provides java.security.Provider used by java.base
jdk.security.jgss provides java.security.Provider used by java.base
이전 예제들이 Service Provider를 제외한 모듈간의 단순한 조합이었다면 아래 예제는 Service Provider와 그 dependency를 포함하는 command이다.
D:\work\java\jdk-9.0.4\bin>jlink --module-path D:\work\java\jdk-9.0.4\jmods --add-modules java.base,java.sql --compress=2 --output result_with_provider --bind-services
결과물에 포함된 module들을 확인해보면 이전과 달리 많은 module들이 추가되었음을 알 수 있다.
D:\work\java\jdk-9.0.4\bin\result_with_provider>bin\java --list-modules
java.base@9.0.4
java.compiler@9.0.4
java.datatransfer@9.0.4
java.desktop@9.0.4
java.logging@9.0.4
java.management@9.0.4
java.management.rmi@9.0.4
java.naming@9.0.4
java.prefs@9.0.4
java.rmi@9.0.4
java.scripting@9.0.4
java.security.jgss@9.0.4
java.security.sasl@9.0.4
java.smartcardio@9.0.4
java.sql@9.0.4
java.xml@9.0.4
java.xml.crypto@9.0.4
jdk.accessibility@9.0.4
jdk.charsets@9.0.4
jdk.compiler@9.0.4
jdk.crypto.cryptoki@9.0.4
jdk.crypto.ec@9.0.4
jdk.crypto.mscapi@9.0.4
jdk.deploy@9.0.4
jdk.dynalink@9.0.4
jdk.internal.opt@9.0.4
jdk.jartool@9.0.4
jdk.javadoc@9.0.4
jdk.jdeps@9.0.4
jdk.jfr@9.0.4
jdk.jlink@9.0.4
jdk.localedata@9.0.4
jdk.management@9.0.4
jdk.management.cmm@9.0.4
jdk.management.jfr@9.0.4
jdk.naming.dns@9.0.4
jdk.naming.rmi@9.0.4
jdk.scripting.nashorn@9.0.4
jdk.security.auth@9.0.4
jdk.security.jgss@9.0.4
jdk.unsupported@9.0.4
jdk.zipfs@9.0.4
댓글
댓글 쓰기