Jlink로 PLCnext Control에서 Java 9 앱 최적화하기
Java 9에서는 jlink라는 새로운 도구가 도입되었습니다. 모듈을 결합해 올인원 런타임 이미지를 빌드합니다. 한편으로는 전체 32비트 ARM JDK를 PLCnext Control에서 실행할 수 있지만, jlink와 모듈을 사용하면 Java 애플리케이션에 필요한 리소스를 줄일 수 있습니다. 애플리케이션에 필요한 JDK의 필수 부분만 포함된 번들을 생성합니다.
사전 요구사항
다양한 플랫폼용 OpenJDK 바이너리는 AdoptOpenJDK 등에서 찾을 수 있습니다. 이 튜토리얼에서는 컨트롤러용 Linux arm32 jdk-12.0.2+10과 Windows x64 호스트 시스템용 대응 버전을 선택했습니다. 다음 JDK 위치를 사용합니다:
C: ---Java
| +---jdk-12.0.2
| ...
| ---jdk-12-ARM-32bit
...
애플리케이션 모듈 생성
이 예제에서는 콘솔에 Hello World만 출력합니다. jlink를 사용하려면 이 작은 애플리케이션을 모듈에 넣어야 합니다. 터미널 시작점은 "HelloWorld" 폴더와 다음과 같은 구조의 src 폴더입니다.
HelloWorld
---src
---de.plcnext.hello
| module-info.java
---de
---plcnext
---hello
HelloWorld.java
HelloWorld.java 파일의 작은 코드 예제:
package de.plcnext.hello;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello PLCnext world!");
}
}
모듈 생성을 위한 module-info.java:
module de.pxc.hello {
}
소스 폴더 생성 후 프로젝트를 컴파일합니다. 터미널에서 다음 명령 사용:
C:Javajdk-12.0.2binjavac.exe -d .modulesde.plcnext.hello .srcde.plcnext.hellodeplcnexthelloHelloWorld.java .srcde.plcnext.hellomodule-info.java
modules 폴더와 자바 클래스 생성:
HelloWorld
---modules
---de.plcnext.hello
| module-info.class
---de
---plcnext
---hello
HelloWorld.class
호스트 시스템에서 모듈 테스트하려면 다음 명령으로 실행:
C:Javajdk-12.0.2binjava.exe --module-path .modules -m de.plcnext.hello/de.plcnext.hello.HelloWorld
Hello PLCnext world!가 출력돼야 합니다.
jlink 사용법
이제 전체 300MB JDK 없이 이걸 장치로 가져오고 싶습니다. 첫 단계로 추가 매개변수 없이 jlink를 사용합니다. 하지만 먼저 추가로 필요한 모듈이 뭔지 알아야 합니다. jdeps로 우리 모듈을 분석해 알아냅니다.
C:Javajdk-12.0.2binjdeps.exe --module-path ".modules" --add-modules "de.plcnext.hello"
이 명령은 우리 모듈 외에 java.base가 추가로 필요하다고 알려줍니다. module-path로 우리 애플리케이션 경로와 타겟 플랫폼 JDK의 jmods 경로를 지정합니다. 이 경우 C:Javajdk-12-ARM-32bitjmods.
이제 jlink 호출은 다음과 같습니다:
C:Javajdk-12.0.2binjlink.exe --module-path ".modules;C:Javajdk-12-ARM-32bitjmods" --add-modules "de.plcnext.hello,java.base" --output HelloWorldjre
결과는 약 45MB 크기의 HelloWorldjre 폴더입니다. 이를 컨트롤러로 복사합니다. 이 예제에서는 /opt/plcnext/projects/java/로 복사. chmod +x java로 HelloWorldjre 바이너리 폴더의 "java" 파일을 실행 가능하게 만들고 우리 모듈 시작:
./java -m de.plcnext.hello/de.plcnext.hello.HelloWorld
애플리케이션이 실행돼 이전과 같이 Hello PLCnext world!를 출력해야 합니다. --strip-debug, --no-header-files, --no-man-pages, --compress=2 같은 jlink 추가 매개변수를 사용하면 패키지를 더 줄일 수 있습니다(이 예제에서 28MB까지). 압축이 가장 많은 공간을 절약하지만 마지막에 성능에 영향을 줄 수 있습니다.