SlideShare a Scribd company logo
1 of 180
Download to read offline
Java 9 Модули.
Почему не OSGi?
Никита Липский
Excelsior LLC
1
2
Модули в IDE
3
Модули в Maven
com.foo
app
1.0
com.foo
parse-api
2.0
com.foo
persist-api
3.0
org.apache
commons
2.1
org.apache
commons-io
3.1
4
Модули в Maven
com.foo
App
1.0
com.foo
parse-api
2.0
com.foo
persist-api
3.0
org.apache
commons
2.1
org.apache
commons
3.1
5
OSGi
6
Почему не OSGi?
Mark Reinhold (the Chief Architect of the Java Platform Group):
“…As it (OSGi) stands, moreover, it’s useful for
library and application modules but, since it’s
built strictly on top of the Java SE Platform, it
can’t be used to modularize the Platform itself”
7
Почему не OSGi?
Вопрос: почему наличие j.l.Object в
спецификации языка Java, реализованного в
свою очередь на языке Java, не приводит к
bootstrap проблеме?
Факт: Существует реализация Java SE, где
OSGi поддерживается на уровне JVM (на
уровне платформы).
8
Почему не OSGi?
Вопрос: почему наличие j.l.Object в
спецификации языка Java, реализованного в
свою очередь на языке Java, не приводит к
bootstrap проблеме?
Факт: Существует реализация Java SE, где
OSGi поддерживается на уровне JVM (на
уровне платформы).
9
Кто знает про себя ?
• Более 20 лет профессиональной карьеры
• Инициатор проекта Excelsior JET
– работал над проектом более 17 лет
– как идейный вдохновитель
– компиляторный инженер
– руководитель
– и много в каких еще ролях
• twitter: @pjBooms
10
План доклада
• Почему OSGi
• Как OSGi
• Почему НЕ OSGi
• Почему Jigsaw не OSGi
• Jigsaw мантра
• Проблемы Jigsaw
11
Где OSGi?
OSGi – это стандарт OSGi aliance (IBM, Adobe,
Bosch, Huawei, NTT, Oraсle)
Реализации:
• Equinox
– Eclipse IDE, Eclipse RCP, IBM Websphere
• Apache Felix
– Oracle WebLogic, Glassfish, Netbeans
12
Почему OSGi?
13
Почему OSGi?
• Модульность
– Снижение сложности (Reduced complexity)
– Инкапсуляция (Hide internals)
– Управление зависимостями и легкость развертывания (Easy
deployment)
• Динамические обновления (Dynamic updates)
• Версионирование (Versioning)
• Ленивая активация модулей (Lazy)
• Simple, fast, small, secure, etc.
https://www.osgi.org/developer/benefits-of-using-osgi/
14
Модульная система OSGi
15
Модульная система OSGi
OSGi модуль – Bundle (бандл):
• Jar или директория
• Импорт/экспорт задается в манифесте бандла
META-INF/MANIFEST.MF. Пример:
Manifest-Version: 1.0 Bundle-ManifestVersion:
2 Bundle-SymbolicName: B Bundle-Version: 1 Bundle-
Name: B Bundle Export-Package: org.bar Import-
Package: org.foo;version=“[1,2)”
16
Модульная система OSGi
• OSGi бандл импортирует и экспортирует
– пакеты (Import-Package/Export-Package)
– сервисы (Import-Service/Export-Service).
• Может импортировать другие бандлы
напрямую (Require-Bundle)
– но это не приветствуется (менее гибко).
17
Модульная система OSGi
18
OSGi Runtime
• Разрешает Import/Export OSGi бандлов (wiring)
• Определяет жизненный цикл бандлов
– может стартовать (активировать) бандлы лениво
– позволяет обновлять бандлы без перезапуска всей
системы (aka hot redeploy).
19
Jar/Classpath Hell
App
1.0
Library
Foo
2.0
Library
Bar
3.0
Library
Baz
2.1
Library
Baz
3.1
20
Версионирование в OSGi
• OSGI решает JAR hell:
– импорт/экспорт квалифицируется версией
– если два бандла требуют библиотеки разных
версий, загрузятся обе версии библиотеки
21
Почему OSGi?
Итак, OSGi обещает:
• Модульность
– явные зависимости
– инкапсуляция
• Решение проблемы JAR Hell
– через версионирование
• Hot ReDeploy (обновления на лету)
– через возможность обновлять отдельный бандл
динамически
22
Почему OSGi?
Итак, OSGi обещает:
• Модульность
– явные зависимости
– инкапсуляция
• Решение проблемы JAR Hell
– через версионирование
• Hot ReDeploy (обновления на лету)
– через возможность обновлять отдельный бандл
динамически
23
Почему OSGi?
Итак, OSGi обещает:
• Модульность
– явные зависимости
– инкапсуляция
• Решение проблемы JAR Hell
– через версионирование
• Hot ReDeploy (обновления на лету)
– через возможность обновлять отдельный бандл
динамически
24
Почему OSGi?
Итак, OSGi обещает:
• Модульность
– явные зависимости
– инкапсуляция
• Решение проблемы JAR Hell
– через версионирование
• Hot ReDeploy (обновления на лету)
– через возможность обновлять отдельный бандл
динамически
25
26
Как OSGi?
27
Версионирование в OSGi
Вопрос: Как реализовать версионирование?
Задача: Имеем модуль A, использующий
библиотеку Lib (v1), и модуль B,
использующий Lib (v2). Требуется, чтобы обе
версии Lib работали и не конфликтовали.
Решение: грузить обе версии библиотеки
разными загрузчиками классов.
28
Версионирование в OSGi
Вопрос: Как реализовать версионирование?
Задача: Имеем модуль A, использующий
библиотеку Lib (v1), и модуль B,
использующий Lib (v2). Требуется, чтобы обе
версии Lib работали и не конфликтовали.
Решение: грузить обе версии библиотеки
разными загрузчиками классов.
29
Версионирование в OSGi
Вопрос: Как реализовать версионирование?
Задача: Имеем модуль A, использующий
библиотеку Lib (v1), и модуль B,
использующий Lib (v2). Требуется, чтобы обе
версии Lib работали и не конфликтовали.
Решение: грузить обе версии библиотеки
разными загрузчиками классов.
30
Версионирование в OSGi
Таким образом, каждый OSGi бандл грузится
своим загрузчиком классов:
• наследник java.lang.ClassLoader
• уникальное пространство имен классов
• нет конфликтов с классами других бандлов
31
Версионирование в OSGi
32
Инкапсуляция в OSGi
33
Инкапсуляция в OSGi
src/com/foo/exported/A.java:
package com.foo.exported;
import com.foo.internal.B;
public class A {
B useB;
}
src/com/foo/internal/B.java:
package com.foo.internal;
public class B {
}
Как сделать класс B недоступным из вне модуля?
34
Инкапсуляция в OSGi
Вопрос: как сделать внутренний класс
модуля, объявленный публичным
недоступным из вне?
35
Инкапсуляция в OSGi
Вопрос: как сделать внутренний класс
модуля, объявленный публичным
недоступным из вне?
Ответ: загрузчики классов (!) могут прятать
внутренние классы.
36
Динамическое обновление
Задача: заменить один (!) изменившийся
модуль в уже запущенной программе, не
останавливая программу
37
Динамическое обновление
Задача: заменить один (!) изменившийся
модуль в уже запущенной программе, не
останавливая программу
Решение: ЗАГРУЗЧИКИ КЛАССОВ!
(отгружаем старый модуль, грузим новый
модуль новым загрузчиком классов)
38
Жизненный цикл бандла
39
Ленивый старт
Старт бандлов в OSGi сделан через механизм
активаторов бандлов:
• Каждый бандл может иметь активатор
– директива манифеста Bundle-Activator
– реализация интерфейса с методами start(),
stop()
– Аналог статического инициализатора для класса
40
Ленивый старт
Старт бандлов в OSGi сделан через механизм
активаторов бандлов:
public interface BundleActivator {
void start(BundleContext context) throws Exception;
void stop(BundleContext context) throws Exception;
}
41
Ленивый старт
• Когда бандлы стартуют может задаваться
конфигурацией OSGi окружения
• Если явно не задан момент старта бандла,
то бандл стартует, когда потребуется
другим запущенным бандлам
42
Ленивый старт
Задача: стартовать (грузить) модули только
когда они потребуются в работе программы
43
Ленивый старт
Решение: ЗАГРУЗЧИК КЛАССОВ (опять!)
…бандла реализован так, что перед тем как
загрузить первый класс бандла, он вызывает
метод start() активатора бандла
Так как загрузка классов в JVM – ленивая, то и
активация бандлов становится ленивой
АВТОМАТОМ
44
Ленивый старт
Решение: ЗАГРУЗЧИК КЛАССОВ (опять!)
бандла реализован так, что перед тем как
загрузить первый класс бандла, он вызывает
метод start() активатора бандла
Так как загрузка классов в JVM – ленивая, то и
активация бандлов становится ленивой
АВТОМАТОМ
45
Ленивый старт
Решение: ЗАГРУЗЧИК КЛАССОВ (опять!)
бандла реализован так, что перед тем как
загрузить первый класс бандла, он вызывает
метод start() активатора бандла
Так как загрузка классов в JVM – ленивая, то и
активация бандлов становится ленивой
АВТОМАТОМ
46
Как OSGi?
Семь бед – один ответ!
47
48
Почему НЕ OSGi?
49
Модульность?
Бандл A
Бандл B
50
Модульность?
Бандл A
Бандл B Бандл C
51
Модульность?
Бандл A
Бандл B Бандл C
Бандл D
52
Модульность?
Бандл A
Бандл B Бандл C
Бандл D
53
Модульность?
Бандл A
Бандл B Бандл C
Бандл D
54
Модульность?
Бандл A
Бандл B Бандл C
Бандл D
55
Модульность?
OSGI позволяет циклы в графе
зависимостей
Упражнение: понять, почему
это плохо
A
B C
D
56
Обновления на лету?
57
Обновления на лету?
Бандл AБандл B
58
Обновления на лету?
Бандл AБандл B
Обновляем бандл B
59
Обновления на лету?
Бандл AБандл B
60
Обновления на лету?
Бандл A
Бандл B
61
Обновления на лету?
Бандл A
Бандл B
НОВЫЙ
62
Обновления на лету?
Бандл AБандл B
НОВЫЙ
63
Обновления на лету?
Бандл AБандл B
Пройдет ли тот же
фокус с бандлом A?
64
Обновления на лету?
Бандл B
Класс B
Бандл A
Класс А
65
Обновления на лету?
Бандл B
Класс B
Бандл A
Класс А
Если бандл B импортирует бандл А, значит
есть класс из B, ссылающийся на класс из A
66
Разрешение символьных ссылок
B.java:
class B {
A useA;
int f1 = A.f;
int f2 = A.foo();
}
A.java:
class A {
static int f;
static int foo(){};
}
67
Разрешение символьных ссылок
68
B.class
…
CONSTANT_Class: A
CONSTANT_FieldRef: A.f@int
CONSTANT_MethodRef: A.foo()I
…
A.class
…
Field: f@int
Method: foo()I
…
Разрешение символьных ссылок
• Класс ссылается на другие классы и поля,
методы других классов символьно
69
Разрешение символьных ссылок
• Класс ссылается на другие классы и поля,
методы других классов символьно
• В рантайме символьные ссылки
разрешаются JVM на реальные значения
70
Разрешение символьных ссылок
• Класс ссылается на другие классы и поля,
методы других классов символьно
• В рантайме символьные ссылки
разрешаются JVM на реальные значения
• После первого разрешения ссылки,
значение ссылки больше не меняется!
71
Обновления на лету?
• Если ссылка из класса B на класс A
разрешилась, то класс А нельзя выгрузить
из JVM без выгрузки класса B
72
Обновления на лету?
• Если ссылка из класса B на класс A
разрешилась, то класс А нельзя выгрузить
из JVM без выгрузки класса B
• Значит если бандл В импортирует бандл А,
бандл А нельзя выгрузить без выгрузки
бандла B
73
Обновления на лету?
Бандл AБандл B
Обновляем бандл A
74
Обновления на лету?
Бандл AБандл B
75
Обновления на лету?
Бандл A
Бандл B
76
Обновления на лету?
Бандл AБандл B
77
Обновления на лету?
А теперь вспомним про
циклические зависимости
Упражнение: попробуйте
обновить SWT бандл у работающего Eclipse
A
B C
D
78
79
Обновления на лету?
• Обновления на лету в OSGi более менее
работает, только для листовых бандлов,
которые никто не импортирует – плагины
80
Обновления на лету?
• Обновления на лету в OSGi более менее
работает, только для листовых бандлов,
которые никто не импортирует – плагины
• Для реализации плагинов есть гораздо
более простые способы, чем OSGi
81
Обновления на лету?
Даже листовые бандлы не так просто
выгрузить из JVM:
• После их выгрузки, принадлежавшие им
классы могут остаться жить в JVM
– Известная проблема: Classloader Memory Leak
82
Нельзя просто так взять
и выгрузить класс из JVM 83
Версионирование?
84
Версионирование?
App
1.0
Foo
2.0
Bar
3.0
Baz
2.1
Baz
3.1
85
Версионирование?
App
1.0
Foo
2.0
Bar
3.0
Baz
2.1
Baz
3.1
86
Версионирование?
App
1.0
Foo
2.0
Bar
3.0
Baz
2.1
Baz
3.1
A
87
Версионирование?
App
1.0
Foo
2.0
Bar
3.0
Baz
2.1
Baz
3.1
A A
88
Версионирование?
App
1.0
Foo
2.0
Bar
3.0
Baz
2.1
Baz
3.1
A
A
89
Версионирование?
App
1.0
Foo
2.0
Bar
3.0
Baz
2.1
Baz
3.1
A A
90
Версионирование?
App
1.0
Foo
2.0
Bar
3.0
Baz
2.1
Baz
3.1
A A
91
Версионирование?
App
1.0
Foo
2.0
Bar
3.0
Baz
2.1
Baz
3.1
A A
Я - “A”!
92
Версионирование?
App
1.0
Foo
2.0
Bar
3.0
Baz
2.1
Baz
3.1
A A
Я - “A”!
Нет, это
я “A”!
93
Версионирование?
App
1.0
Foo
2.0
Bar
3.0
Baz
2.1
Baz
3.1
AAAAA!AAAAA!
AA
94
95
Loading constraints
• Loading constraints запрещают двум разным
классам с одинаковыми именами (fully
qualified) появиться в области видимости
одного класса
96
Loading constraints
B.java:
class B {
T1 f1 = A.f;
int f2 = A.m(t2);
}
A.java:
class A {
static T1 f;
static int m(T2 t)
Если B грузится загрузчиком L1, а A грузится L2, то JVM
проверит, что (T1, L1) = (T1, L2) и (T2, L1) = (T2, L2)
==
97
Версионирование?
• При нарушении loading constraints, JVM
кидает java.lang.LinkageError
98
Версионирование?
• При нарушении loading constraints, JVM
кидает java.lang.LinkageError
• OSGi НИКАК не помогает разработчикам
избежать нарушения loading constraints
– Погуглите по словам OSGI и LinkageError, чтобы
оценить масштаб проблемы
99
Версионирование?
Даже в поставке последних версий Eclipse
есть бандлы, в которых есть потенциальные
нарушения loading constraints и это никого не
волнует!
100
Версионирование?
Вывод: OSGi не решает проблему JAR Hell, а
переводит ее на новый изощренный уровень.
101
Версионирование?
Вывод: Не используйте в одном приложении
одну и ту же библиотеку разных версий!
102
Инкапсуляция?
Вопрос: Ну хорошо, проблему инкапсуляции
хотя бы OSGi решает?
103
Reflection – универсальная отмычка
против инкапсуляции в Java
Инкапсуляция?
setAccessible(true)
104
Инкапсуляция?
Вопрос: Ну хорошо, проблему инкапсуляции
хотя бы OSGi решает?
Ответ: OSGi не защищает от
несанкционированного доступа через
Reflection
105
Ленивый старт?
106
Ленивый старт?
107
Ленивый старт?
Бандл A
Бандл B Бандл C
Вопрос: В каком порядке активируются эти бандлы?
108
Ленивый старт?
Порядок активации бандлов в OSGi напрямую
зависит от порядка загрузки классов в JVM
– бандл стартуют из loadClass() загрузчика
классов бандла
109
Ленивый старт?
Порядок активации бандлов в OSGi напрямую
зависит от порядка загрузки классов в JVM
– бандл стартуют из loadClass() загрузчика
классов бандла
Но порядок загрузки классов в JVM не
определен!
110
Разрешение символьных ссылок
Класс может иметь ссылки на другие классы и поля,
методы других классов. JVM может разрешать ссылки:
• Лениво
– ссылки разрешаются при первом доступе
• Энергично
– разрешаются все ссылки какие возможно
111
Ленивый старт?
Порядок загрузки классов в JVM зависит от
схемы разрешения ссылок между классами:
ленивой, не всегда ленивой, энергичной.
112
Ленивый старт?
Активатор бандла B:
class B implements BundleActivator {
public void start() {
assert A.f!= null;
}
Активатор бандла A:
class A implements BundleActivator {
static T f;
public void start() {
f = new T();
}
}Стандартная ситуация: В думает, что А уже активирован, но
по факту А может активироваться позже B
113
Ленивый старт?
• Cхема активации бандлов в OSGi – это мина
замедленного действия:
– стоит JVM начать разрешать ссылки между
классами менее лениво, практически все OSGi
приложения перестанут работать
114
Почему не OSGi?
• Модульность с циклами
• Hot Redeploy работает только для листьев
• Нет защиты от нарушения loading constraints
• Нет защиты деталей реализации от доступа
через Reflection
• Активация бандлов зависит от схемы
разрешения ссылок в JVM
115
Jigsaw
116
Jigsaw
117
Jigsaw vs. OSGi
OSGi – динамичен по своей сути
– модули появляются только в ран-тайме
118
Jigsaw vs. OSGi
Jigsaw сразу задумывался статичным.
Практически весь JDK tooling знает про модули:
– javac: уважает области видимости в модулях
– jdeps: анализирует зависимости
– jar, jmod: пакуют модули
– jlink: изготавливает финальный образ для
развертывания
– java: в рантайме модули конечно тоже есть
119
Пример модуля
// src/java.sql/module-info.java
module java.sql {
requires transitive java.logging;
requires transitive java.xml;
exports java.sql;
exports javax.sql;
exports javax.transaction.xa;
uses java.sql.Driver;
}
120
Jigsaw vs. OSGi
Jigsaw запрещает циклы
в графе зависимостей (явных)
Модули импортируют
модули, а не пакеты.
121
Версионирование
В первых драфтах Jigsaw версионирование
было (аналогичное OSGi).
122
Версионирование
В первых драфтах Jigsaw версионирование
было (аналогичное OSGi).
Но потом от него отказались …
123
Версионирование
В первых драфтах Jigsaw версионирование
было (аналогичное OSGi).
Но потом от него отказались …
Почему?
124
Версионирование
Версионирование – немедленное означает:
1 модуль  1 загрузчик классов
125
Версионирование
Версионирование – немедленное означает:
1 модуль  1 загрузчик классов
И в первых версиях Jigsaw так и было!
126
Jigsaw и загрузчики
Jigsaw – это не только модули, но и разбиение
Java платформы на модули.
127
Jigsaw и загрузчики
Проблема обратной совместимости:
По спецификации
getClassloader() == null
для всех классов платформы.
Что противоречит разбиению платформы на
модули, где каждый модуль грузится своим
загрузчиком
128
Jigsaw и загрузчики
Проблема обратной совместимости:
По спецификации
getClassloader() == null
для всех классов платформы.
Что противоречит разбиению платформы на
модули, где каждый модуль грузится своим
загрузчиком
129
Jigsaw и загрузчики
Проблема 2: Как защитить разработчика от
нарушения loading constraints?
130
Версионирование
Еще деталь: импорт в ранних версиях Jigsaw
(как и в OSGi) специфицировался не просто
версией, а диапазоном версий:
– Модуль мог декларировать, что может
работать с зависимостями версий от и до
131
Версионирование
Проблема 3: Оказалось, что разрешение
зависимостей (wiring модулей) от диапазонов
версий – это NP полная проблема!
– Сводится к 3-SAT
132
Версионирование
… после чего версионирование в модульной
системе Java приказало долго жить.
133
Версионирование
… после чего версионирование в модульной
системе Java приказало долго жить.
Нет версионирования – не нужны загрузчики
классов для модулей.
134
Jigsaw
• Динамических обновлений нет
• Версионирования нет
135
Jigsaw
• Динамических обновлений нет
• Версионирования нет
А что тогда есть?
136
Jigsaw Mantra
Reliable
Configuration
Strong
Encapsulation
137
Reliable Configuration
Такая ситуация в Jigsaw просто запрещена!
App
1.0
Foo
2.0
Bar
3.0
Baz
2.1
Baz
3.1
138
Reliable Configuration
Такая ситуация в Jigsaw просто запрещена!
App
1.0
Foo
2.0
Bar
3.0
Baz
2.1
Baz
3.1
139
Reliable Configuration
Правильная (reliable) конфигурация:
App
1.0
Foo
2.5
Bar
3.0
Baz
3.1
140
Reliable Configuration
Reliable configuration это:
• Все зависимости модулей удовлетворены
• Нет циклических зависимостей
• Нет модулей экспортирующих одинаковые
пакеты (split packages)
Свойства проверяются на старте (wiring)
141
Strong Encapsulation
setAccessible(true)
142
Strong Encapsulation
Модули в Java 9 – это first class citizens
• Определяют области видимости
– Через декларируемый эскпорт
• Доступа к не экспортируемой
функциональности модуля из вне модуля нет
даже через reflection
– Не работает даже setAccessible(true)
143
Strong Encapsulation
Модули в Java 9 – это first class citizens
• Определяют области видимости
– Через декларируемый экспорт
• Доступа к не экспортируемой
функциональности модуля из вне модуля нет
даже через reflection
– Не работает даже setAccessible(true)
144
Strong Encapsulation
Модули в Java 9 – это first class citizens
• Определяют области видимости
– Через декларируемый экспорт
• Доступа к не экспортируемой
функциональности из вне модуля нет даже
через reflection
– Не работает даже setAccessible(true)
145
И что, у Jigsaw нет проблем?
146
147
Reliable Configuration?
• В ранних версиях Jigsaw рефлективный
доступ между модулями запрещался, если
между ними нет явных зависимостей
• Но с уходом загрузчиков из модульной
системы от этого пришлось отказаться
– так как Class.forName() должен работать по
старому
148
Reliable Configuration?
• В ранних версиях Jigsaw рефлективный
доступ между модулями запрещался, если
между ними нет явных зависимостей
• Но с уходом загрузчиков из модульной
системы от этого пришлось отказаться
– так как Class.forName() должен работать по
старому
149
Reliable Configuration?
• Однако, если у вас возможны
рефлективные зависимости, не
прописанные явно, где гарантия, что
результирующая конфигурация reliable?
150
Reliable Configuration?
Split packages запрещены, но как же
контейнеры приложений (Tomcat, Java EE)?
151
Jigsaw Layers *
Для контейнеров приложений введен
механизм слоев (Layers):
• Локальная модульная система для каждого
приложения в контейнере
• Разные модули с одинаковыми пакетами
должны принадлежать разным слоям
152
Jigsaw Layers *
* Картинка позаимствована из презентации Alex Buckley: Project Jigsaw Under the
hood
153
Strong Encapsulation?
154
Strong Encapsulation?
Платформа разбита на модули:
• Что означает, что приватные API
действительно стали приватными
155
Strong Encapsulation?
Платформа разбита на модули:
• Что означает, что приватные API
действительно стали приватными
• Но а как же
sun.misc.Unsafe ?
156
Strong Encapsulation?
Ok, sun.misc.Unsafe Java сообщество
(в неравной борьбе) отстояло!
(не надолго)
157
Strong Encapsulation?
А как же Dependency Injection?
158
Strong Encapsulation?
DI frameworks существенно зависят:
• от возможности рефлективного
доступа в код, куда они внедряют
зависимости
• в том числе в неэкспортируемый код
159
Strong Encapsulation?
module my.module {
exports my.module.pack;
}
160
Strong Encapsulation?
module my.module {
exports my.module.pack;
exports my.module.internal.public.morozov;
}
161
Strong Encapsulation?
module my.moduleO{
exports my.module.pack;
}
162
Strong Encapsulation?
open module my.module {
exports my.module.pack;
}
163
Strong Encapsulation?
Для DI frameworks введены open modules:
• open module позволяет рефлективный
доступ к своей неэкспортированной
функциональности
164
Strong Encapsulation?
Open module – это уже не совсем
strong encapsulation, но это лучше чем ничего.
165
Jigsaw
Хорошо, ну а какая мне в конце концов от
Jigsaw польза?
166
Польза Jigsaw
Если все ваши зависимости сейчас перечислены в
classpath, то постепенно мигрируя на modulepath вы
улучшите архитектуру своего приложения:
• разберетесь с циклами в зависимостях
• split пакетами (уберете jar hell)
• с необоснованным доступом в детали реализации
других модулей
• с зависимостями на JDK private API
167
Польза Jigsaw
Если все ваши зависимости сейчас перечислены в
classpath, то постепенно мигрируя на modulepath вы
улучшите архитектуру своего приложения:
• разберетесь с циклами в зависимостях
• split пакетами (уберете jar hell)
• с необоснованным доступом в детали реализации
других модулей
• с зависимостями на JDK private API
168
Польза Jigsaw
Если все ваши зависимости сейчас перечислены в
classpath, то постепенно мигрируя на modulepath вы
улучшите архитектуру своего приложения:
• разберетесь с циклами в зависимостях
• split пакетами (уберете jar hell)
• с необоснованным доступом в детали реализации
других модулей
• с зависимостями на JDK private API
169
Польза Jigsaw
Если все ваши зависимости сейчас перечислены в
classpath, то постепенно мигрируя на modulepath вы
улучшите архитектуру своего приложения:
• разберетесь с циклами в зависимостях
• split пакетами (уберете jar hell)
• с необоснованным доступом в детали реализации
других модулей
• с зависимостями на JDK private API
170
Польза Jigsaw
Если все ваши зависимости сейчас перечислены в
classpath, то постепенно мигрируя на modulepath вы
улучшите архитектуру своего приложения:
• разберетесь с циклами в зависимостях
• split пакетами (уберете jar hell)
• с необоснованным доступом в детали реализации
других модулей
• с зависимостями на JDK private API
171
Польза Jigsaw
Для миграции на modulepath в Jigsaw придумана
целая система:
• Old Classpath образует Unnamed Modulе
• Жары из classpath можно временно
переносить в modulepath как Auto Module
• автомодулям можно постепенно добавлять
модульную декларацию
172
Польза Jigsaw
Для миграции на modulepath в Jigsaw придумана
целая система:
• Old Classpath образует Unnamed Modulе
• Жары из classpath можно временно
переносить в modulepath как Auto Module
• автомодулям можно постепенно добавлять
модульную декларацию
173
Польза Jigsaw
Для миграции на modulepath в Jigsaw придумана
целая система:
• Old Classpath образует Unnamed Modulе
• Жары из classpath можно временно
переносить в modulepath как Auto Module
• автомодулям можно постепенно добавлять
модульную декларацию
174
Польза Jigsaw
Для миграции на modulepath в Jigsaw придумана
целая система:
• Old Classpath образует Unnamed Modulе
• Жары из classpath можно временно
переносить в modulepath как Auto Module
• автомодулям можно постепенно добавлять
модульную декларацию
175
Польза Jigsaw
Но к сожалению, для большинства enterprise Java
разработчиков пользы от Jigsaw пока не будет:
• Java EE стандарты пока не определяют как они
собираются взаимодействовать с модульной
системой
• Даже стандарт servlet контейнеров не знает пока
про модули
– Зависимости в war файлах – это по сути тот же самый
classpath!
176
Польза Jigsaw
Но к сожалению, для большинства enterprise Java
разработчиков пользы от Jigsaw пока не будет:
• Java EE стандарты пока не определяют как они
собираются взаимодействовать с модульной
системой
• Даже стандарт servlet контейнеров не знает пока
про модули
– Зависимости в war файлах – это по сути тот же самый
classpath!
177
Роды неизбежны!
178
Заключение
• OSGi – милая попытка дать разработчикам
модули
– но к сожалению в OSGi есть много проблем
– в том числе фундаментальных
• Jigsaw – тщательно продуманная система без
видимых фундаментальных проблем
– но с системой сдержек и противовесов
– есть проблемы принятия сообществом
179
Вопросы и ответы
Никита Липский,
Excelsior
nlipsky@excelsior-usa.com
twitter: @pjBooms 180

More Related Content

What's hot

Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действииNikita Lipsky
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended versionIvan Krylov
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9JavaDayUA
 
AOT для Java: Мифы и Challenges
AOT для Java: Мифы и ChallengesAOT для Java: Мифы и Challenges
AOT для Java: Мифы и ChallengesNikita Lipsky
 
Tech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU
 
Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Nikita Lipsky
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программRoman Brovko
 
01 - Java. Введение в Java
01 - Java. Введение в Java01 - Java. Введение в Java
01 - Java. Введение в JavaRoman Brovko
 
. Kotlin для Автоматизации тестирования – первые впечатления
. Kotlin для Автоматизации тестирования – первые впечатления. Kotlin для Автоматизации тестирования – первые впечатления
. Kotlin для Автоматизации тестирования – первые впечатленияCOMAQA.BY
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотомRoman Grebennikov
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 днейГотовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 днейSkillFactory
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодRoman Grebennikov
 
Continuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons LearnedContinuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons LearnedAleksandr Tarasov
 
Java compilers and IDEs
Java compilers and IDEsJava compilers and IDEs
Java compilers and IDEschashnikov
 
Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыYuri Zhloba
 
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019corehard_by
 

What's hot (20)

Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действии
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9
 
AOT для Java: Мифы и Challenges
AOT для Java: Мифы и ChallengesAOT для Java: Мифы и Challenges
AOT для Java: Мифы и Challenges
 
Tech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция JavaTech Talks @NSU: AOT-компиляция Java
Tech Talks @NSU: AOT-компиляция Java
 
Java худеет. Спроси меня как.
Java худеет. Спроси меня как.Java худеет. Спроси меня как.
Java худеет. Спроси меня как.
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ
 
01 - Java. Введение в Java
01 - Java. Введение в Java01 - Java. Введение в Java
01 - Java. Введение в Java
 
. Kotlin для Автоматизации тестирования – первые впечатления
. Kotlin для Автоматизации тестирования – первые впечатления. Kotlin для Автоматизации тестирования – первые впечатления
. Kotlin для Автоматизации тестирования – первые впечатления
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
Java 9 - Back to the Future
Java 9 - Back to the FutureJava 9 - Back to the Future
Java 9 - Back to the Future
 
Continuousdelivery
ContinuousdeliveryContinuousdelivery
Continuousdelivery
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 днейГотовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный код
 
DevOps guide for awesome quality assurance
DevOps guide for awesome quality assuranceDevOps guide for awesome quality assurance
DevOps guide for awesome quality assurance
 
Continuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons LearnedContinuous Delivery with Jenkins: Lessons Learned
Continuous Delivery with Jenkins: Lessons Learned
 
Java compilers and IDEs
Java compilers and IDEsJava compilers and IDEs
Java compilers and IDEs
 
Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игры
 
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
 

Similar to Java 9 Модули. Почему не OSGi?

AOT-компиляция Java
AOT-компиляция JavaAOT-компиляция Java
AOT-компиляция JavaTech Talks @NSU
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilationNikita Lipsky
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовYandex
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовYandex
 
Андрей Кирпичев "Гибкая модульность инструментами АОП"
Андрей Кирпичев  "Гибкая модульность инструментами АОП"Андрей Кирпичев  "Гибкая модульность инструментами АОП"
Андрей Кирпичев "Гибкая модульность инструментами АОП"MskDotNet Community
 
BeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демоновBeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демоновAnton Piskunov
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned Alexander Syrotenko
 
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработкиБэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработкиITCrowd Almaty
 
Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)Pavel Chertorogov
 
Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаRoman Dvornov
 
Java Enterprise without Java
Java Enterprise without JavaJava Enterprise without Java
Java Enterprise without JavaOlena Syrota
 
Как быть с большими сайтами на Word press
Как быть с большими сайтами  на Word pressКак быть с большими сайтами  на Word press
Как быть с большими сайтами на Word pressvovasik
 
Делаем жизнь лучше с CocoaPods
Делаем жизнь лучше с CocoaPodsДелаем жизнь лучше с CocoaPods
Делаем жизнь лучше с CocoaPodsГлеб Тарасов
 
Внедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокВнедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокRoman_Lut
 
Liferay Portal и приемы разработки
Liferay Portal и приемы разработкиLiferay Portal и приемы разработки
Liferay Portal и приемы разработкиdevclub
 
Практика разработки веб-серверов на Rust
Практика разработки веб-серверов на RustПрактика разработки веб-серверов на Rust
Практика разработки веб-серверов на RustMichael Pankov
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - BytecodeAnton Arhipov
 

Similar to Java 9 Модули. Почему не OSGi? (20)

AOT-компиляция Java
AOT-компиляция JavaAOT-компиляция Java
AOT-компиляция Java
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
 
Андрей Кирпичев "Гибкая модульность инструментами АОП"
Андрей Кирпичев  "Гибкая модульность инструментами АОП"Андрей Кирпичев  "Гибкая модульность инструментами АОП"
Андрей Кирпичев "Гибкая модульность инструментами АОП"
 
BeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демоновBeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демонов
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
 
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработкиБэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
Бэкенд, Фронтенд — всё смешалось. Обзорная экскурсия в будущее веб-разработки
 
Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)Бэкенд, фронтенд — всё смешалось (nodkz)
Бэкенд, фронтенд — всё смешалось (nodkz)
 
Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтенда
 
Java Enterprise without Java
Java Enterprise without JavaJava Enterprise without Java
Java Enterprise without Java
 
2 bdw.key
2 bdw.key2 bdw.key
2 bdw.key
 
Как быть с большими сайтами на Word press
Как быть с большими сайтами  на Word pressКак быть с большими сайтами  на Word press
Как быть с большими сайтами на Word press
 
Step 1
Step 1Step 1
Step 1
 
Monotouch
MonotouchMonotouch
Monotouch
 
Делаем жизнь лучше с CocoaPods
Делаем жизнь лучше с CocoaPodsДелаем жизнь лучше с CocoaPods
Делаем жизнь лучше с CocoaPods
 
Внедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокВнедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движок
 
Liferay Portal и приемы разработки
Liferay Portal и приемы разработкиLiferay Portal и приемы разработки
Liferay Portal и приемы разработки
 
Практика разработки веб-серверов на Rust
Практика разработки веб-серверов на RustПрактика разработки веб-серверов на Rust
Практика разработки веб-серверов на Rust
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - Bytecode
 

More from Nikita Lipsky

Escaping The Jar hell with Jigsaw Layers
Escaping The Jar hell with Jigsaw LayersEscaping The Jar hell with Jigsaw Layers
Escaping The Jar hell with Jigsaw LayersNikita Lipsky
 
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...Nikita Lipsky
 
Java 9 Modules: The Duke Yet Lives That OSGi Shall Depose
Java 9 Modules: The Duke Yet Lives That OSGi Shall DeposeJava 9 Modules: The Duke Yet Lives That OSGi Shall Depose
Java 9 Modules: The Duke Yet Lives That OSGi Shall DeposeNikita Lipsky
 
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers Nikita Lipsky
 
Ahead-Of-Time Compilation of Java Applications
Ahead-Of-Time Compilation of Java ApplicationsAhead-Of-Time Compilation of Java Applications
Ahead-Of-Time Compilation of Java ApplicationsNikita Lipsky
 
Delivering Native User Experience In Client Side Java Applications
Delivering Native User Experience In Client Side Java ApplicationsDelivering Native User Experience In Client Side Java Applications
Delivering Native User Experience In Client Side Java ApplicationsNikita Lipsky
 
Java Restart with WebFX
Java Restart with WebFX Java Restart with WebFX
Java Restart with WebFX Nikita Lipsky
 
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?Nikita Lipsky
 
Занимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVMЗанимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVMNikita Lipsky
 
Неумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайлаНеумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайлаNikita Lipsky
 
История одной JVM в картинках
История одной JVM в картинкахИстория одной JVM в картинках
История одной JVM в картинкахNikita Lipsky
 

More from Nikita Lipsky (11)

Escaping The Jar hell with Jigsaw Layers
Escaping The Jar hell with Jigsaw LayersEscaping The Jar hell with Jigsaw Layers
Escaping The Jar hell with Jigsaw Layers
 
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...
JIT Versus AOT: Unity And Conflict of Dynamic and Static Compilers (JavaOne 2...
 
Java 9 Modules: The Duke Yet Lives That OSGi Shall Depose
Java 9 Modules: The Duke Yet Lives That OSGi Shall DeposeJava 9 Modules: The Duke Yet Lives That OSGi Shall Depose
Java 9 Modules: The Duke Yet Lives That OSGi Shall Depose
 
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
 
Ahead-Of-Time Compilation of Java Applications
Ahead-Of-Time Compilation of Java ApplicationsAhead-Of-Time Compilation of Java Applications
Ahead-Of-Time Compilation of Java Applications
 
Delivering Native User Experience In Client Side Java Applications
Delivering Native User Experience In Client Side Java ApplicationsDelivering Native User Experience In Client Side Java Applications
Delivering Native User Experience In Client Side Java Applications
 
Java Restart with WebFX
Java Restart with WebFX Java Restart with WebFX
Java Restart with WebFX
 
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
Веб 3.0. Есть ли будущее у Java в RIA и Mobile?
 
Занимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVMЗанимательные истории из жизни технической поддержки JVM
Занимательные истории из жизни технической поддержки JVM
 
Неумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайлаНеумолимая близость десктопа, веба и мобайла
Неумолимая близость десктопа, веба и мобайла
 
История одной JVM в картинках
История одной JVM в картинкахИстория одной JVM в картинках
История одной JVM в картинках
 

Java 9 Модули. Почему не OSGi?