SlideShare une entreprise Scribd logo
1  sur  136
Модули в Java
Евгений Козлов
Встреча Novosibirsk
Java User Group
24.05.2018
Обо мне
• Программирую на Java 7 лет
• Последние 5 лет в Axmor.
Программирую desktop (Eclipse).
• Веду Telegram-канал, посвящённый
Java: https://t.me/miniJUG
• Интересуюсь функциональным
программированием:
https://vk.com/lambdansk
2/136
Обо мне
• Программирую на Java 7 лет
• Последние 5 лет в Axmor.
Программирую desktop (Eclipse).
• Веду Telegram-канал, посвящённый
Java: https://t.me/miniJUG
• Интересуюсь функциональным
программированием:
https://vk.com/lambdansk
• Отвечаю на StackOverflow.
3/136
История версий Java
Версия Дата выхода Главные изменения
Java 1.4 06.02.2002 assert, NIO
Java 1.5 30.09.2004 enum, generics, annotations
Java 1.6 11.12.2006 @Override in interfaces, Deque
Java 1.7 07.07.2011 invokedynamic, try-with-resources
Java 1.8 18.03.2014 lambdas, default methods, Nashorn
Java 9 21.09.2017 modules, iface private methods, jshell
Java 10 20.03.2018 var, Graal
4/136
Java 8
5/136
Java 8
6/136
Проблемы монолитной JDK
7/136
Проблемы монолитной JDK
• Большой размер JRE 5
184MB
JRE 7 JRE 8
62MB
105MB
149MB
JRE 6
8/136
Проблемы монолитной JDK
• Большой размер
• Плоская структура (запутанный граф
зависимостей)
rt.jar
links
9/136
Проблемы монолитной JDK
• Большой размер
• Плоская структура (запутанный граф
зависимостей)
• Сложность разработки и поддержки
10/136
Проблемы монолитной JDK
• Большой размер
• Плоская структура (запутанный граф
зависимостей)
• Сложность разработки и поддержки
• Медленный старт и много памяти
11/136
Проблемы монолитной JDK
• Большой размер
• Плоская структура (запутанный граф
зависимостей)
• Сложность разработки и поддержки
• Медленный старт и много памяти
• Внутренние API торчат наружу
12/136
Цели
• Разделить JDK на компоненты и сделать платформу
масштабируемой
13/136
Цели
• Разделить JDK на компоненты и сделать платформу
масштабируемой
• Облегчить разработку и поддержку больших систем,
в том числе самой JDK
14/136
Цели
• Разделить JDK на компоненты и сделать платформу
масштабируемой
• Облегчить разработку и поддержку больших систем,
в том числе самой JDK
• Улучшить производительность и уменьшить
потребление памяти
15/136
Цели
• Разделить JDK на компоненты и сделать платформу
масштабируемой
• Облегчить разработку и поддержку больших систем,
в том числе самой JDK
• Улучшить производительность и уменьшить
потребление памяти
• Улучшить безопасность, инкапсулировать
внутренние API
16/136
История
• Всё началось в 2005 году с JSR 277: Java Module System
17/136
История
• Всё началось в 2005 году с JSR 277: Java Module System
• 2008 год – создание проекта Jigsaw
18/136
История
• Всё началось в 2005 году с JSR 277: Java Module System
• 2008 год – создание проекта Jigsaw
• 2010 год – Jigsaw перенесён в Java 8
• 2012 год – Jigsaw перенесён в Java 9
19/136
История
• Всё началось в 2005 году с JSR 277: Java Module System
• 2008 год – создание проекта Jigsaw
• 2010 год – Jigsaw перенесён в Java 8
• 2012 год – Jigsaw перенесён в Java 9
• 2014 год – старт фазы активной разработки Jigsaw
20/136
21/136
22/136
История
• Всё началось в 2005 году с JSR 277: Java Module System
• 2008 год – создание проекта Jigsaw
• 2010 год – Jigsaw перенесён в Java 8
• 2012 год – Jigsaw перенесён в Java 9
• 2014 год – старт фазы активной разработки Jigsaw
• 21.09.2017 – выход Java 9
23/136
Проект Jigsaw
• JEP 162: Prepare for Modularization
• JEP 200: The Modular JDK
• JEP 201: Modular Source Code
• JEP 220: Modular Run-Time Images
• JEP 260: Encapsulate Most Internal APIs
• JEP 261: Module System
• JEP 282: jlink: The Java Linker
24/136
Java 8
rt.jar
25/136
Java 8 Java 9+
rt.jar
lib/modules
26/136
Java 8
jdk1.8.0_172
├── bin
| ├── java.exe
| ├── javac.exe
| ├── jar.exe
| └── …
├── jre
| ├── bin
| | ├── java.exe
| | └── …
| ├── lib
| | ├── rt.jar
| | └── …
| └── …
├── lib
| ├── tools.jar
| └── …
├── src.zip
└── … 27/136
Java 8
jdk1.8.0_172
├── bin
| ├── java.exe
| ├── javac.exe
| ├── jar.exe
| └── …
├── jre
| ├── bin
| | ├── java.exe
| | └── …
| ├── lib
| | ├── rt.jar
| | └── …
| └── …
├── lib
| ├── tools.jar
| └── …
├── src.zip
└── … 28/136
Java 8 Java 9+
jdk1.8.0_172
├── bin
| ├── java.exe
| ├── javac.exe
| ├── jar.exe
| └── …
├── jre
| ├── bin
| | ├── java.exe
| | └── …
| ├── lib
| | ├── rt.jar
| | └── …
| └── …
├── lib
| ├── tools.jar
| └── …
├── src.zip
└── …
jdk10.0.1
├── bin
| ├── java.exe
| ├── javac.exe
| ├── jar.exe
| └── …
├── lib
| ├── modules
| ├── jrt-fs.jar
| ├── src.zip
| └── …
├── jmods
| ├── java.base.jmod
| ├── java.desktop.jmod
| ├── java.xml.jmod
| └── …
└── …
29/136
Java 8 Java 9+
jdk1.8.0_172
├── bin
| ├── java.exe
| ├── javac.exe
| ├── jar.exe
| └── …
├── jre
| ├── bin
| | ├── java.exe
| | └── …
| ├── lib
| | ├── rt.jar
| | └── …
| └── …
├── lib
| ├── tools.jar
| └── …
├── src.zip
└── …
jdk10.0.1
├── bin
| ├── java.exe
| ├── javac.exe
| ├── jar.exe
| └── …
├── lib
| ├── modules
| ├── jrt-fs.jar
| ├── src.zip
| └── …
├── jmods
| ├── java.base.jmod
| ├── java.desktop.jmod
| ├── java.xml.jmod
| └── …
└── …
30/136
Java 8 Java 9+
jdk1.8.0_172
├── bin
| ├── java.exe
| ├── javac.exe
| ├── jar.exe
| └── …
├── jre
| ├── bin
| | ├── java.exe
| | └── …
| ├── lib
| | ├── rt.jar
| | └── …
| └── …
├── lib
| ├── tools.jar
| └── …
├── src.zip
└── …
jdk10.0.1
├── bin
| ├── java.exe
| ├── javac.exe
| ├── jar.exe
| └── …
├── lib
| ├── modules
| ├── jrt-fs.jar
| ├── src.zip
| └── …
├── jmods
| ├── java.base.jmod
| ├── java.desktop.jmod
| ├── java.xml.jmod
| └── …
└── …
31/136
Нахождение системных модулей
32/136
Нахождение системных модулей
FileSystem fs =
FileSystems.getFileSystem(URI.create("jrt:/"));
33/136
Нахождение системных модулей
FileSystem fs =
FileSystems.getFileSystem(URI.create("jrt:/"));
// Получить стрим всех модулей:
Stream<Path> modules =
Files.list(fs.getPath("modules"));
34/136
Нахождение системных модулей
FileSystem fs =
FileSystems.getFileSystem(URI.create("jrt:/"));
// Получить стрим всех модулей:
Stream<Path> modules =
Files.list(fs.getPath("modules"));
// Получить массив байтов файла Object.class:
byte[] bytes =
Files.readAllBytes(fs.getPath("modules",
"java.base", "java/lang/Object.class"));
35/136
Java 9+
jdk10.0.1
├── bin
| ├── java.exe
| ├── javac.exe
| ├── jar.exe
| └── …
├── lib
| ├── modules
| ├── jrt-fs.jar
| ├── src.zip
| └── …
├── jmods
| ├── java.base.jmod
| ├── java.desktop.jmod
| ├── java.xml.jmod
| └── …
└── …
36/136
Терминология
• Static access – обычный доступ к полям и методам:
com.Foo.bar()
37/136
Терминология
• Static access – обычный доступ к полям и методам:
com.Foo.bar()
• Reflective access – рефлективный доступ к полям и методам:
Method m = Class.forName("com.Foo").getDeclaredMethod("bar");
m.invoke(null);
38/136
Терминология
• Static access – обычный доступ к полям и методам:
com.Foo.bar()
• Reflective access – рефлективный доступ к полям и методам:
Method m = Class.forName("com.Foo").getDeclaredMethod("bar");
m.invoke(null);
• Deep reflective access – приватный рефлективный доступ к
полям и методам:
Method m = Class.forName("com.Foo").getDeclaredMethod("baz");
m.setAccessible(true);
m.invoke(null);
39/136
Ага, используешь приватный API
40/136
Инкапсуляция внутренних API
• В Java 9/10 нестандартные API стали закрыты во время
компиляции, но открыты в рантайме
41/136
Инкапсуляция внутренних API
• В Java 9/10 нестандартные API стали закрыты во время
компиляции, но открыты в рантайме
• Во время deep reflective access к классам JVM выдаёт
предупреждение:
Field field =
ArrayList.class.getDeclaredField("elementData");
field.setAccessible(true);
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.example.Main
(…) to field java.util.ArrayList.elementData
42/136
А что Unsafe?
43/136
Неинкапсулированные API (пока)
• sun.misc.Unsafe
• sun.misc.Signal и sun.misc.SignalHandler
• sun.reflect.Reflection.getCallerClass(int)
• sun.reflect.ReflectionFactory.
newConstructorForSerialization()
44/136
Использует ли моё приложение
внутренние API?
45/136
Использует ли моё приложение
внутренние API?
> jdeps --jdk-internals hadoop-hdfs-2.2.0.jar
hadoop-hdfs-2.2.0.jar -> java.xml
org.apache.hadoop.hdfs.tools.offlineEditsViewer.XmlEditsVisitor ->
com.sun.org.apache.xml.internal.serialize.OutputFormat
JDK internal API (java.xml)
org.apache.hadoop.hdfs.tools.offlineEditsViewer.XmlEditsVisitor ->
com.sun.org.apache.xml.internal.serialize.XMLSerializer
JDK internal API (java.xml)
Warning: JDK internal APIs are unsupported and private to JDK implementation that
are subject to be removed or changed incompatibly and could break your
application.
Please modify your code to eliminate dependence on any JDK internal APIs.
For the most recent update on JDK internal API replacements, please check:
https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool
46/136
Пример объявления модуля
mylib
src
org.example.mylib
Main.java
Class1.java
org.example.mylib.impl
Class2.java
Class3.java
47/136
Пример объявления модуля
mylib
src
org.example.mylib
Main.java
Class1.java
org.example.mylib.impl
Class2.java
Class3.java
module-info.java
// module-info.java
module org.example.mylib {
exports org.example.mylib;
requires java.base;
requires transitive com.foo;
requires static com.bar;
}
48/136
Пример объявления модуля
mylib
src
org.example.mylib
Main.java
Class1.java
org.example.mylib.impl
Class2.java
Class3.java
module-info.java
// module-info.java
module org.example.mylib {
exports org.example.mylib;
requires java.base;
requires transitive com.foo;
requires static com.bar;
}
concealed package
49/136
java.base
requires
requires
transitive
org.example.mylib
requires
static
com.foo com.bar
50/136
module java.rmi {
requires java.logging;
exports java.rmi;
exports java.rmi.activation;
exports java.rmi.dgc;
exports java.rmi.registry;
exports java.rmi.server;
exports javax.rmi.ssl;
exports com.sun.rmi.rmid to java.base;
exports sun.rmi.registry to jdk.management.agent;
exports sun.rmi.server to
java.management.rmi, jdk.management.agent, jdk.jconsole;
exports sun.rmi.transport to
java.management.rmi, jdk.management.agent, jdk.jconsole;
uses java.rmi.server.RMIClassLoaderSpi;
}
qualified export
51/136
Уровни видимости
в Java 1-8:
• private
• <package>
• protected
• public
52/136
Уровни видимости
в Java 1-8:
• private
• <package>
• protected
• public
Уровни видимости
в Java 9+:
• private
• <package>
• protected
• public внутри модуля
• public для конкретных
модулей
• public для всех
53/136
module jdk.unsupported {
exports com.sun.nio.file;
exports sun.misc;
exports sun.reflect;
opens sun.misc;
opens sun.reflect;
}
Открытые пакеты
54/136
module jdk.unsupported {
exports com.sun.nio.file;
exports sun.misc;
exports sun.reflect;
opens sun.misc;
opens sun.reflect;
}
Открытые пакеты
открыты для
deep reflection
55/136
Запуск на Java 8
Через class path:
java -cp foo.jar;bar.jar;myapp.jar org.example.myapp.Main
56/136
Запуск на Java 9+
Через class path (по старинке):
java -cp foo.jar;bar.jar;myapp.jar org.example.myapp.Main
Через module path:
java -p foo.jar;bar.jar;myapp.jar -m org.example.myapp
57/136
Запуск модульного приложения
Java runtime гарантирует, что:
• Все зависимости найдены
58/136
Запуск модульного приложения
Java runtime гарантирует, что:
• Все зависимости найдены
• Нет циклических зависимостей
59/136
Запуск модульного приложения
Java runtime гарантирует, что:
• Все зависимости найдены
• Нет циклических зависимостей
• Нет расщеплённых пакетов (split packages)
60/136
Запуск по старинке (через -cp)
• module-info.class игнорируется
• Все ограничения игнорируются
• Циклы разрешены
• Расщеплённые пакеты разрешены
• Линейный поиск
61/136
-cp targetclasses;
libscomgoogleguavaguava25.0-jreguava-25.0-jre.jar;
libsorgcheckerframeworkchecker-compat-
qual2.0.0checker-compat-qual-2.0.0.jar;
libscomgoogleerrorproneerror_prone_annotations2.1.3
error_prone_annotations-2.1.3.jar;
libscomgooglej2objcj2objc-annotations1.1j2objc-
annotations-1.1.jar;
libsorgcodehausmojoanimal-sniffer-
annotations1.14animal-sniffer-annotations-1.14.jar
62/136
63/136
--module-path
-classpath
64/136
Аналоги директив в
опциях VM и runtime
65/136
Аналоги директив в
опциях VM и reflection
module-info.java VM option java.lang.Module
module foo {
requires bar;
}
--add-reads foo=bar foo.addReads(bar)
66/136
Аналоги директив в
опциях VM и reflection
module-info.java VM option java.lang.Module
module foo {
requires bar;
}
--add-reads foo=bar foo.addReads(bar)
module foo {
exports com.foo
to bar;
}
--add-exports foo/com.foo=bar foo.addExports("com.foo", bar)
67/136
Аналоги директив в
опциях VM и reflection
module-info.java VM option java.lang.Module
module foo {
requires bar;
}
--add-reads foo=bar foo.addReads(bar)
module foo {
exports com.foo
to bar;
}
--add-exports foo/com.foo=bar foo.addExports("com.foo", bar)
module foo {
opens com.foo
to bar;
}
--add-opens foo/com.foo=bar foo.addOpens("com.foo", bar)
68/136
Граф модулей
java.xml
foo
java.base
baz
quxbar
java.prefs
69/136
java -p foo.jar;bar.jar;qux.jar;baz.jar -m foo
Граф модулей
70/136
Граф модулей
java.xml
foo
java.base
корневой
модуль (root) baz
quxbar
java.prefs
71/136
Граф модулей
java.xml
foo
java.base
корневой
модуль (root) baz
quxbar
java.prefs
72/136
Граф модулей
java.xml
foo
java.base
корневой
модуль (root) baz
quxbar
java.prefs
73/136
java -p foo.jar;bar.jar;qux.jar;baz.jar -m foo
Добавление модулей в корневое
множество
74/136
Добавление модулей в корневое
множество
java -p foo.jar;bar.jar;qux.jar;baz.jar
--add-modules baz -m foo
75/136
Граф модулей
java.xml
foo baz
java.prefs
bar
java.base
qux
корневой
модуль (root)
корневой
модуль (root)
76/136
Виды модулей
Module
77/136
Виды модулей
Module
Unnamed Named
78/136
Виды модулей
Module
Unnamed
Automatic Explicit
Named
79/136
Виды модулей
Module
Unnamed
Automatic Explicit
System
Named
80/136
Кроме того, системные модули
могут быть:
• Aggregator (например, java.se)
81/136
Модуль java.se
module java.se {
requires transitive java.desktop;
requires transitive java.security.jgss;
requires transitive java.security.sasl;
requires transitive java.management;
requires transitive java.logging;
requires transitive java.datatransfer;
requires transitive java.sql.rowset;
requires transitive java.compiler;
requires transitive java.sql;
requires transitive java.naming;
requires transitive java.prefs;
requires transitive java.rmi;
requires transitive java.xml.crypto;
requires transitive java.management.rmi;
requires transitive java.xml;
requires transitive java.scripting;
requires transitive java.instrument;
}
82/136
Кроме того, системные модули
могут быть:
• Aggregator (например, java.se)
• Deprecated и Deprecated for removal (например, java.se.ee)
83/136
Модуль java.se.ee
@Deprecated(since="9", forRemoval=true)
module java.se.ee {
requires transitive java.se;
requires transitive java.activation;
requires transitive java.corba;
requires transitive java.transaction;
requires transitive java.xml.bind;
requires transitive java.xml.ws;
requires transitive java.xml.ws.annotation;
}
84/136
85/136
Кроме того, системные модули
могут быть:
• Aggregator (например, java.se)
• Deprecated и Deprecated for removal (например, java.se.ee)
• Upgradeable (например, jdk.internal.vm.compiler)
86/136
Кроме того, системные модули
могут быть:
• Aggregator (например, java.se)
• Deprecated и Deprecated for removal (например, java.se.ee)
• Upgradeable (например, jdk.internal.vm.compiler)
• Incubating (например, jdk.incubator.httpclient)
87/136
Миграция
88/136
app1
app3app2
foo-1.0.jar bar-0.0.1.jar
baz-3.17.jar qux-2.1.jar
java.prefsjava.xml
89/136
app1
app3app2
foo-1.0.jar bar-0.0.1.jar
baz-3.17.jar qux-2.1.jar
java.prefsjava.xml
<unnamed>
90/136
foo-1.0.jar bar-0.0.1.jar
baz-3.17.jar qux-2.1.jar
java.prefsjava.xml
app3app2
app1
91/136
foo-1.0.jar bar-0.0.1.jar
baz-3.17.jar qux-2.1.jar
java.prefsjava.xml
requires app3
requires app2
app3app2
app1
92/136
foo-1.0.jar bar-0.0.1.jar
baz-3.17.jar qux-2.1.jar
java.prefsjava.xml
requires app3
requires app2
requires ???
app3app2
app1
requires ???
93/136
foo-1.0.jar bar-0.0.1.jar
baz-3.17.jar qux-2.1.jar
java.prefsjava.xml
automatic
modules
automatic
modules
requires app3
requires app2
requires ???
app3app2
app1
requires ???
94/136
Automatic module
• Имя выводится из имени jar-файла (или из
атрибута Automatic-Module-Name)
95/136
foo-1.0.jar bar-0.0.1.jar
baz-3.17.jar qux-2.1.jar
java.prefsjava.xml
automatic
modules
automatic
modules
requires app3
requires app2
requires foo
app3app2
app1
requires bar
96/136
Automatic module
• Имя выводится из имени jar-файла (или из
атрибута Automatic-Module-Name)
• Requires all modules
• Exports all packages
• Opens all packages
97/136
app1
app3app2
foo-1.0.jar bar-0.0.1.jar
baz-3.17.jar qux-2.1.jar
java.prefsjava.xml
98/136
foo-1.0.jar bar-0.0.1.jar
baz-3.17.jar qux-2.1.jar
java.prefsjava.xml
app1
app2 app3
99/136
app1
app3app2
foo-1.0.jar bar-0.0.1.jar
baz-3.17.jar qux-2.1.jar
java.prefsjava.xml
100/136
app1
app3app2
foo-1.0.jar bar-0.0.1.jar
baz-3.17.jar qux-2.2.jar
java.prefsjava.xml
101/136
app1
app3app2
foo-1.0.jar bar-0.0.1.jar
baz-3.18.jar qux-2.2.jar
java.prefsjava.xml
102/136
app1
app3app2
foo-1.1.jar bar-0.0.1.jar
baz-3.18.jar qux-2.2.jar
java.prefsjava.xml
103/136
app1
app3app2
foo-1.0.jar bar-0.0.2.jar
baz-3.17.jar qux-2.2.jar
java.prefsjava.xml
104/136
Сервисы
105/136
Сервисы
• Появились в Java 6
106/136
Сервисы
• Появились в Java 6
• В Java 9 стали намного удобнее и безопаснее
107/136
package com.foo;
public interface Calculator {
int square(int x);
}
module foo {
exports com.foo;
}
108/136
package com.foo;
public interface Calculator {
int square(int x);
}
module foo {
exports com.foo;
}
public class Main {
…
}
109/136
package com.foo;
public interface Calculator {
int square(int x);
}
package com.bar;
public class CalculatorImpl
implements Calculator {
@Override
public int square(int x) {
return x * x;
}
}
module foo {
exports com.foo;
}
module bar {
requires foo;
}
public class Main {
…
}
110/136
package com.foo;
public interface Calculator {
int square(int x);
}
package com.bar;
public class CalculatorImpl
implements Calculator {
@Override
public int square(int x) {
return x * x;
}
}
module foo {
exports com.foo;
uses Calculator;
}
module bar {
requires foo;
provides Calculator
with CalculatorImpl;
}
public class Main {
…
}
111/136
package com.foo;
public interface Calculator {
int square(int x);
static Calculator get() {…}
}
package com.bar;
public class CalculatorImpl
implements Calculator {
@Override
public int square(int x) {
return x * x;
}
}
module foo {
exports com.foo;
uses Calculator;
}
module bar {
requires foo;
provides Calculator
with CalculatorImpl;
}
public class Main {
…
}
112/136
package com.foo;
import java.util.ServiceLoader;
public interface Calculator {
int square(int x);
static Calculator get() {
return ServiceLoader
.load(Calculator.class)
.findFirst() // Optional<Calculator>
.orElseThrow(() -> new RuntimeException(
"No Calculator provider found"));
}
}
113/136
package com.foo;
import java.util.ServiceLoader;
public interface Calculator {
int square(int x);
static List<Calculator> get() {
return ServiceLoader
.load(Calculator.class)
.stream()
.collect(Collectors.toUnmodifiableList());
}
}
114/136
java.scripting
ScriptEngineFactory
jdk.scripting.nashorn
NashornScriptEngineFactory
115/136
java.base
ToolProvider
jdk.compiler
JavacToolProvider
jdk.jlink
JlinkToolProvider
jdk.jartool
JarToolProvider
116/136
Optional<ToolProvider> jar = ToolProvider.findFirst("jar");
117/136
Optional<ToolProvider> jar = ToolProvider.findFirst("jar");
jar.get().run(
System.out,
System.err,
"--describe-module",
"--file",
"path/to/some/module.jar");
118/136
Демонстрация
• Java 10 приложение с использованием сервисов
• git clone https://github.com/orionll/services-demo
119/136
Демонстрация
• Java 10 приложение с использованием сервисов
• git clone https://github.com/orionll/services-demo
120/136
Демонстрация
• Java 10 приложение с использованием сервисов
• git clone https://github.com/orionll/services-demo
FigureDescriptorProvider
BaseFigureDescriptorProvider
ExtFigureDescriptorProvider
121/136
Резюме
122/136
Резюме
• Система модулей улучшает архитектуру проекта
123/136
Резюме
• Система модулей улучшает архитектуру проекта
• Делает приложение более безопасным
124/136
Резюме
• Система модулей улучшает архитектуру проекта
• Делает приложение более безопасным
• Предоставляет механизмы для облегчения разработки
крупных систем (сервисы, upgradeable modules)
125/136
Резюме
• Система модулей улучшает архитектуру проекта
• Делает приложение более безопасным
• Предоставляет механизмы для облегчения разработки
крупных систем (сервисы, upgradeable modules)
• Улучшает производительность
126/136
Недостатки
127/136
Недостатки
Сложность:
• -classpath vs --module-path vs --upgrade-module-path
• non-modular jar vs modular jar vs automatic jar
• Много новых опций (--add-modules, --add-exports, --patch-module…)
• Много новых инструментов (jlink, jimage, jmod, jdeps)
128/136
Недостатки
Сложность:
• -classpath vs --module-path vs --upgrade-module-path
• non-modular jar vs modular jar vs automatic jar
• Много новых опций (--add-modules, --add-exports, --patch-module…)
• Много новых инструментов (jlink, jimage, jmod, jdeps)
Закрытые split-пакеты запрещены.
129/136
Нужно ли прямо сейчас
переходить на модули?
130/136
Экосистема ещё довольно плохо готова
к модульности
• Инструменты плохо готовы (IDE, системы сборки,
контейнеры, тест-фреймворки)
131/136
Экосистема ещё довольно плохо готова
к модульности
• Инструменты плохо готовы (IDE, системы сборки,
контейнеры, тест-фреймворки)
• Automatic-Module-Name почти нигде нет
132/136
Экосистема ещё довольно плохо готова
к модульности
• Инструменты плохо готовы (IDE, системы сборки,
контейнеры, тест-фреймворки)
• Automatic-Module-Name почти нигде нет
• Split packages кругом (например, jsr305 и
java.xml.ws.annotation)
133/136
Экосистема ещё довольно плохо готова
к модульности
• Инструменты плохо готовы (IDE, системы сборки,
контейнеры, тест-фреймворки)
• Automatic-Module-Name почти нигде нет
• Split packages кругом (например, jsr305 и
java.xml.ws.annotation)
• Многие библиотеки используют private API
134/136
Полезные ссылки
• Project Jigsaw: http://openjdk.java.net/projects/jigsaw/
• Replacements for deprecated java.se.ee modules:
https://stackoverflow.com/questions/48204141/replacements
-for-deprecated-jpms-modules-with-java-ee-apis
• jdeps: https://docs.oracle.com/javase/10/tools/jdeps.htm
• jlink: https://docs.oracle.com/javase/10/tools/jlink.htm
• Services Demo: https://github.com/orionll/services-demo
135/136
Спасибо за внимание!
Java 10
136/136

Contenu connexe

Similaire à Модули в Java

What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9JavaDayUA
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Alexey Fyodorov
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1Technopark
 
Синхронизация без блокировок и СМС
Синхронизация без блокировок и СМССинхронизация без блокировок и СМС
Синхронизация без блокировок и СМСAlexey Fyodorov
 
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
 
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionJVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionNikita Lipsky
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Anton Arhipov
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilationNikita Lipsky
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Nikita Lipsky
 
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?Roman Timushev
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoFDmitry Buzdin
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended versionIvan Krylov
 
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"Yandex
 
webpack: 7 бед - один ответ
webpack: 7 бед - один ответwebpack: 7 бед - один ответ
webpack: 7 бед - один ответDenis Izmaylov
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - BytecodeAnton Arhipov
 
Будни тестирования Cassandr-ы
Будни тестирования Cassandr-ыБудни тестирования Cassandr-ы
Будни тестирования Cassandr-ыSQALab
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"Dev2Dev
 

Similaire à Модули в Java (20)

What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
 
Синхронизация без блокировок и СМС
Синхронизация без блокировок и СМССинхронизация без блокировок и СМС
Синхронизация без блокировок и СМС
 
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
 
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionJVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
 
Scala: что, как и зачем?
Scala: что, как и зачем?Scala: что, как и зачем?
Scala: что, как и зачем?
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoF
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
 
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
 
Java 9: Platform
Java 9: PlatformJava 9: Platform
Java 9: Platform
 
webpack: 7 бед - один ответ
webpack: 7 бед - один ответwebpack: 7 бед - один ответ
webpack: 7 бед - один ответ
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - Bytecode
 
Будни тестирования Cassandr-ы
Будни тестирования Cassandr-ыБудни тестирования Cassandr-ы
Будни тестирования Cassandr-ы
 
Bytecode
BytecodeBytecode
Bytecode
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"
 

Plus de Zheka Kozlov

Вещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиВещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиZheka Kozlov
 
Java 9 модули
Java 9 модулиJava 9 модули
Java 9 модулиZheka Kozlov
 
Введение в Scalaz
Введение в ScalazВведение в Scalaz
Введение в ScalazZheka Kozlov
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадZheka Kozlov
 
Введение в Akka
Введение в AkkaВведение в Akka
Введение в AkkaZheka Kozlov
 
Сервис MobiBarC
Сервис MobiBarCСервис MobiBarC
Сервис MobiBarCZheka Kozlov
 
Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13
Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13
Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13Zheka Kozlov
 

Plus de Zheka Kozlov (8)

Вещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиВещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не знали
 
Java 9 модули
Java 9 модулиJava 9 модули
Java 9 модули
 
Введение в Scalaz
Введение в ScalazВведение в Scalaz
Введение в Scalaz
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
 
Введение в Akka
Введение в AkkaВведение в Akka
Введение в Akka
 
Xtend
XtendXtend
Xtend
 
Сервис MobiBarC
Сервис MobiBarCСервис MobiBarC
Сервис MobiBarC
 
Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13
Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13
Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13
 

Модули в Java