Скрещиваем ужа с ежом: OpenJDK-11 + GraalVM

Автор: admin от 29-03-2019, 17:25, посмотрело: 270

Привет, Хабр! В свете не самых давних новостей про политику Oracle относительно лицензирования джавы всё острее встаёт вопрос ухода от оракловых версий в сторону OpenJDK. Оданко в OracleLabs уже давно делают весьма крутую штуку под названием GraalVM, который представляет из себя крутой джокере в 2017 году. Там Chris Seaton очень подробно рассказал про внутренности компилятора и показал магию https://graalvm.org — первый пример наш.



Какой же нынче джава-проект (даже Hello World) обходится без какой либо системы сборки? Правильно, только тот, на котором учатся готовить javac. Джавак готовить мы учиться не будем, пусть джаваком рулит maven.



Итак, встречайте, pom.xml:



[spoiler=pom.xml]
    <?xml version="1.0"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.mycompany.app</groupId>
        [leech=https://docs.oracle.com/en/java/javase/11/tools/jlink.html]jlink[/leech]. Пробуем запаковать наше приложение со всеми необходимыми либами в бандл:<br/>
 [leech=#build]Собираем[/leech], удаляем директорию test, [leech=#link]линкуем[/leech].<br/>
 <br/>
 Результат:<br/>
 <br/>
 [code]
Error: automatic module cannot be used with jlink: icu4j from file:///home/slava/JavaProjects/graal-js-jdk11-maven-demo/target/lib/icu4j-62.1.jar
    

Что за «автоматик модуль кеннот би юзд»? А это jlink нам говорит, что либа icu4j не cодержит в себе module-info.class. Что нужно, чтобы такой класс появился внутри указанной либы:


  • понять список используемых либой модулей и создать module-info.java, определить все package'и, которые должны быть видны снаружи

  • скомпилировать module-info.java для либы

  • засунуть скомпилированный module-info.java в джарник с либой


Поехали!

Файл module-info.java со всем содержимым сгенерирует для наc утилита jdeps из состава openjdk-11:

Скрещиваем ужа с ежом: OpenJDK-11 + GraalVM

Компилируем module-info.java для либы icu4j:

Скрещиваем ужа с ежом: OpenJDK-11 + GraalVM

Обновляем джарник, заталкивая в него module-info.class:


        $JAVA_HOME/bin/jar uf target/lib/icu4j-62.1.jar -C target/modules module-info.class
    


Линкуем, запускаем.



[spoiler=Результат] — iteration 1 — 1 (1216 ms)

2 (223 ms)

3 (394 ms)

4 (138 ms)

5 (116 ms)

6 (102 ms)

7 (120 ms)

8 (106 ms)

9 (110 ms)

total: 69999993 (2619 ms)

— iteration 2 — 1 (166 ms)

2 (133 ms)

3 (142 ms)

4 (157 ms)

5 (119 ms)

6 (134 ms)

7 (153 ms)

8 (95 ms)

9 (85 ms)

total: 69999993 (1269 ms)

— iteration 3 — 1 (86 ms)

2 (81 ms)

3 (87 ms)

4 (83 ms)

5 (85 ms)

6 (100 ms)

7 (87 ms)

8 (83 ms)

9 (85 ms)

total: 69999993 (887 ms)

— iteration 4 — 1 (84 ms)

2 (86 ms)

3 (88 ms)

4 (91 ms)

5 (85 ms)

6 (88 ms)

7 (87 ms)

8 (85 ms)

9 (85 ms)

total: 69999993 (864 ms)

— iteration 5 — 1 (94 ms)

2 (86 ms)

3 (84 ms)

4 (83 ms)

5 (85 ms)

6 (86 ms)

7 (84 ms)

8 (84 ms)

9 (83 ms)

total: 69999993 (854 ms)

— iteration 6 — 1 (83 ms)

2 (89 ms)

3 (87 ms)

4 (87 ms)

5 (86 ms)

6 (86 ms)

7 (91 ms)

8 (86 ms)

9 (85 ms)

total: 69999993 (865 ms)

— iteration 7 — 1 (87 ms)

2 (86 ms)

3 (88 ms)

4 (90 ms)

5 (91 ms)

6 (87 ms)

7 (85 ms)

8 (85 ms)

9 (86 ms)

total: 69999993 (868 ms)

— iteration 8 — 1 (84 ms)

2 (85 ms)

3 (86 ms)

4 (84 ms)

5 (84 ms)

6 (88 ms)

7 (85 ms)

8 (86 ms)

9 (86 ms)

total: 69999993 (852 ms)

— iteration 9 — 1 (83 ms)

2 (85 ms)

3 (84 ms)

4 (85 ms)

5 (89 ms)

6 (85 ms)

7 (88 ms)

8 (86 ms)

9 (83 ms)

total: 69999993 (850 ms)

— iteration 10 — 1 (83 ms)

2 (84 ms)

3 (83 ms)

4 (82 ms)

5 (85 ms)

6 (83 ms)

7 (84 ms)

8 (94 ms)

9 (93 ms)

total: 69999993 (856 ms)

[/spoiler]

УРА! У нас получилось! Теперь мы имеем забандленное приложение в виде запускаемого sh-скрипта со своей джавой, со всеми необходимыми модулями (включая свежий graalvm), с преферансом и барышнями.



P.S.



Java не даёт скучать и даёт новую пищу для ума с каждым релизом. Пробуйте новые фичи, экспериментируйте, делитесь опытом. Надеюсь, скоро напишу статью про то как забандлил часть пет-проджекта с граалем (там vert.x, асинхронщина и js-срипты — будет интересно).



И ещё… это моя первая статья на Хабре, — прошу, не сильно бейте.

Источник: Хабр / Интересные публикации

Категория: Linux

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Введите два слова, показанных на изображении: *