Π Π°Π·Π½ΠΎΠ΅

Java 9 ΠΌΠΎΠ΄ΡƒΠ»ΠΈ: ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π² Java 9 / Π₯Π°Π±Ρ€

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Java 9. Project Jigsaw. ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ прСдстоящСго Ρ€Π΅Π»ΠΈΠ·Π° Java 9 являСтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ принСсёт Project Jigsaw. ЦСль этого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° β€” ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Java SE ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΎΠΉ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈ Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½ΠΎΠΉ Π·Π° счёт разбиСния JDK Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ внСдрСния ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ
Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ jar-Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ·Π½Π°Ρ‡Π°Π» для JVM лишь Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΊΠΎΠ΄Π° ΠΈ рСсурсов, jar-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ содСрТит класс module-info, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт:
Β  — имя модуля;
Β  — ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ модулях-зависимостях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½Ρ‹ для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ компиляции ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹;
Β  — ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ (экспортируСт) этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ;
Β  — список сСрвисов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ поставляСт ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅.

Π’ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ ΠΏΡƒΠ½ΠΊΡ‚Π΅ кроСтся ΠΎΠ΄Π½ΠΎ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ досСлС Ρ‚Π°ΠΊ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π»ΠΎ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли класс объявлСн ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΌ, это Π΅Ρ‰Ρ‘ Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ доступСн всСм модулям. ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости public становится Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎΠΉ:
Β  — public class Π² экспортируСмом ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ β€” доступСн всСм модулям, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² зависимостях;
Β  — public class Π² экспортируСмом ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ β€” доступСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ;
Β  — public class Π±Π΅Π· экспорта ΠΏΠ°ΠΊΠ΅Ρ‚Π° β€” доступСн всСм классам Π΄Π°Π½Π½ΠΎΠ³ΠΎ модуля.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ содСрТимого module-info.java:

  1. module com.example.samplemodule {

  2. Β  Β  requires com.example.sampleapp;

  3. Β  Β  requires public java.httpclient;

  4. Β  Β  exports com.example.samplemodule.model;

  5. Β  Β  exports com.example.samplemodule.spi;

  6. Β  Β  uses com.example.samplemodule.spi.DataProvider;

  7. Β  Β  provides com.example.sampleapp.spi.SettingsProvider

  8. Β  Β  Β  Β  with com.example.samplemodule.ModuleSettingsProvider;

  9. }

Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ имя com.example.samplemodule (принято ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΏΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²). Он зависит ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ com.example.sampleapp, java.httpclient ΠΈ java.base (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для всСх ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ). ΠŸΡ€ΠΈΡ‡Ρ‘ΠΌ java.httpclient Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒΡŽ для всСх ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ com.example.samplemodule. Наш ΠΌΠΎΠ΄ΡƒΠ»ΡŒ экспортируСт ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ com.example.samplemodule.model ΠΈ com.example.samplemodule.spi, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ всС ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ классы Π² этих ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ… Π±ΡƒΠ΄ΡƒΡ‚ доступны Π΄Ρ€ΡƒΠ³ΠΈΠΌ модулям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ зависят ΠΎΡ‚ Π½Π΅Π³ΠΎ. ΠœΠΎΠ΄ΡƒΠ»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ com.example.samplemodule.spi.DataProvider для получСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. А Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ½ поставляСт настройки сСрвису Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ модуля, рСализуя интСрфСйс com.example.sampleapp.spi.SettingsProvider Π² классС com.example.samplemodule.ModuleSettingsProvider.

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1. ΠŸΡ€ΡΠΌΠ°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π΄Π²ΡƒΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ
Π£ нас Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π²Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°: TimeApp β€” Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ врСмя, поставляСмоС Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ β€” TimeLocalModule.

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ TimeApp Π² Π³Π»Π°Π²Π½ΠΎΠΌ классС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ класса Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ модуля Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. Π§Ρ‚ΠΎΠ±Ρ‹ это Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ модуля, Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ с классом, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌ строку Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π˜Π½Π°Ρ‡Π΅ ΠΌΡ‹ Π΄Π°ΠΆΠ΅ Π½Π΅ смоТСм ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ модуля.

TimeApp

  1. // com/example/timeapp/Main.java

  2. package com.example.timeapp;

  3. Β 

  4. import com.example.timelocal.TimeLocal;

  5. Β 

  6. public final class Main {

  7. Β 

  8. Β  Β  public static void main(String[] args) {

  9. Β  Β  Β  Β  System.out.format(«Current time: %s%n», TimeLocal.now());

  10. Β  Β  }

  11. }

  1. // module-info.java

  2. module com.example.timeapp {

  3. Β  Β  requires java.base;

  4. Β  Β  requires com.example.timelocalmodule;

  5. }

TimeLocalModule

  1. // com/example/timelocal/TimeLocal.java

  2. package com.example.timelocal;

  3. Β 

  4. import java.time.LocalDateTime;

  5. import java.time.format.DateTimeFormatter;

  6. Β 

  7. public class TimeLocal {

  8. Β 

  9. Β  Β  public static String now() {

  10. Β  Β  Β  Β  return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(LocalDateTime.now());

  11. Β  Β  }

  12. }

  1. // module-info.java

  2. module com.example.timelocalmodule {

  3. Β  Β  exports com.example.timelocal;

  4. }

Π’ настройках Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° TimeLocalModule:

Netbeans ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ°ΠΊΠ΅Ρ‚Π°, com.example.timelocal Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ:

Для компиляции ΠΈ запуска ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ скриптом:

  1. @echo off

  2. Β 

  3. set JAVA9_HOME=D:\Program Files\Java\jdk-9

  4. set JAVA9=»%JAVA9_HOME%/bin/java»

  5. set JAVAC9=»%JAVA9_HOME%/bin/javac»

  6. Β 

  7. mkdir mods\com.example.timeapp

  8. mkdir mods\com.example.timelocalmodule

  9. Β 

  10. echo Compile timelocalmodule

  11. %JAVAC9% -d mods/com.example.timelocalmodule ^

  12. Β  Β  TimeLocalModule/src/module-info.java TimeLocalModule/src/com/example/timelocal/TimeLocal.java

  13. Β 

  14. echo Compile timeapp

  15. %JAVAC9% —module-path mods -d mods/com.example.timeapp ^

  16. Β  Β  TimeApp/src/module-info.java TimeApp/src/com/example/timeapp/Main.java

  17. Β 

  18. echo Run timeapp

  19. %JAVA9% —module-path mods ^

  20. Β  Β  Β  Β  -m com.example.timeapp/com.example.timeapp.Main

Π›ΠΈΠ±ΠΎ запускаСм Π² NetBeans IDE ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ:

  1. Current time: 2016-10-20T18:36:36.6763098

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° GitHub

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2. БСрвисы ΠΈ ServiceLoader
ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ лишь дСмонстрируСт Π½ΠΎΠ²Ρ‹ΠΉ способ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΆΠ΅ сдСлаСм настоящий ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ зависимо ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Π° Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ β€” ΠΌΠΎΠ΄ΡƒΠ»ΠΈ зависСли ΠΎΡ‚ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ прилоТСния. На этапС компиляции ΠΎΠ½ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ модулях, Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π», Π° Π²ΠΎΡ‚ Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π±Ρ€Π°Ρ‚ΡŒ доступныС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ.

Π Π°Π½Π΅Π΅, доступныС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π»Π΅ΠΆΠ°Π»ΠΈ Π² тСкстовом Ρ„Π°ΠΉΠ»Π΅ Π² META-INF/services/exampleservice, ServiceLoader Ρ‡ΠΈΡ‚Π°Π» ΠΎΡ‚Ρ‚ΡƒΠ΄Π° названия классов ΠΈ поставлял Π² ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйсов ΠΈΠ»ΠΈ абстрактных классов. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² module-info Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ:

  1. module additional {

  2. Β  provides com.example.spi.Provider // Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ интСрфСйс

  3. Β  Β  Β  with com.impl.ProviderImpl; // рСализация Π² классС этого модуля

  4. }

А для использования Π² основном ΠΌΠΎΠ΄ΡƒΠ»Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ

  1. module main {

  2. Β  uses com.example.spi.Provider;

  3. }

И ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

  1. ServiceLoader<Provider> sl = ServiceLoader.load(Provider.class);

  2. for (Provider p : sl) {

  3. Β  // ..

  4. }

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ старого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°, связь Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ провСряСтся Π½Π° этапС компиляции.

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ com.example.timeapp.spi, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΌ для ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ-зависимостСй. Π’ Π½Ρ‘ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ интСрфСйс, рСализуя ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.

TimeApp

  1. // com/example/timeapp/spi/TimeProvider.java

  2. package com.example.timeapp.spi;

  3. Β 

  4. public interface TimeProvider {

  5. Β 

  6. Β  Β  String now();

  7. }

  1. // module-info.java

  2. module com.example.timeapp {

  3. Β  Β  requires java.base;

  4. Β 

  5. Β  Β  exports com.example.timeapp.spi;

  6. }

НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ модуля Π² свойствах ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΈΠ½Π°Ρ‡Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ†ΠΈΠΊΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ.

TimeLocalModule

  1. // com/example/timelocal/TimeLocalProvider.java

  2. package com.example.timelocal;

  3. Β 

  4. import com.example.timeapp.spi.TimeProvider;

  5. import java.time.LocalDateTime;

  6. import java.time.format.DateTimeFormatter;

  7. Β 

  8. public class TimeLocalProvider implements TimeProvider {

  9. Β 

  10. Β  Β  @Override

  11. Β  Β  public String now() {

  12. Β  Β  Β  Β  return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(LocalDateTime.now());

  13. Β  Β  }

  14. }

  1. // module-info.java

  2. module com.example.timelocalmodule {

  3. Β  Β  requires com.example.timeapp;

  4. Β 

  5. Β  Β  provides com.example.timeapp.spi.TimeProvider

  6. Β  Β  Β  Β  with com.example.timelocal.TimeLocalProvider;

  7. }

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π³Π»Π°Π²Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π» ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅ ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ интСрфСйса TimeProvider. Для этого Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ систСма Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ сСрвисов β€” класс ServiceLoader. ΠŸΠ΅Ρ€Π΅Π΄Π°Π² Π΅ΠΌΡƒ класс интСрфСйса ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π° ΠΈ зарСгистрировав этот класс Π² module-info ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом uses, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ доступны Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅.

TimeApp

  1. // com/example/timeapp/Main.java

  2. package com.example.timeapp;

  3. Β 

  4. import com.example.timeapp.spi.TimeProvider;

  5. import java.util.ServiceLoader;

  6. Β 

  7. public final class Main {

  8. Β 

  9. Β  Β  public static void main(String[] args) {

  10. Β  Β  Β  Β  ServiceLoader<TimeProvider> serviceLoader = ServiceLoader.load(TimeProvider.class);

  11. Β  Β  Β  Β  serviceLoader.forEach(t -> {

  12. Β  Β  Β  Β  Β  Β  System.out.format(«Current time: %s%n», t.now());

  13. Β  Β  Β  Β  Β  Β  System.out.println(t.getClass());

  14. Β  Β  Β  Β  });

  15. Β  Β  }

  16. }

Если сСйчас Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ:

  1. Exception in thread «main» java.util.ServiceConfigurationError: com.example.timeapp.spi.TimeProvider: use not declared in module com.example.timeapp

  2. Β  Β  at java.util.ServiceLoader.fail(java.base@9-ea/ServiceLoader.java:386)

  3. Β  Β  at java.util.ServiceLoader.checkModule(java.base@9-ea/ServiceLoader.java:371)

  4. Β  Β  at java.util.ServiceLoader.<init>(java.base@9-ea/ServiceLoader.java:319)

  5. Β  Β  at java.util.ServiceLoader.<init>(java.base@9-ea/ServiceLoader.java:351)

  6. Β  Β  at java.util.ServiceLoader.load(java.base@9-ea/ServiceLoader.java:1021)

  7. Β  Β  at com.example.timeapp.Main.main(com.example.timeapp/Main.java:9)

Π­Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ зарСгистрировали класс Π² module-info. Π‘Π΄Π΅Π»Π°Π΅ΠΌ это:

  1. // module-info.java

  2. module com.example.timeapp {

  3. Β  Β  requires java.base;

  4. Β 

  5. Β  Β  exports com.example.timeapp.spi;

  6. Β 

  7. Β  Β  uses com.example.timeapp.spi.TimeProvider;

  8. }

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ запускС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ошибки, Π½ΠΎ ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ появятся. Всё ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² зависимости.

Π’ NetBeans IDE Π² свойствах ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Run Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² Modulepath, ΠΎΠ΄Π½Π°ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π° jar-Ρ„Π°ΠΉΠ» (ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ β€” Clean and Build).

ЗапускаСм ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄:

  1. Current time: 2016-10-20T20:41:39.9614732

  2. class com.example.timelocal.TimeLocalProvider

МоТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π±Ρ€Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ источника, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°.

TimeNetworkModule

  1. // com/example/timenetwork/TimeNetworkProvider.java

  2. package com.example.timenetwork;

  3. Β 

  4. import com.example.timeapp.spi.TimeProvider;

  5. import java.io.IOException;

  6. import java.net.URI;

  7. import java.net.http.HttpClient;

  8. import java.net.http.HttpResponse;

  9. Β 

  10. public class TimeNetworkProvider implements TimeProvider {

  11. Β 

  12. Β  Β  @Override

  13. Β  Β  public String now() {

  14. Β  Β  Β  Β  try {

  15. Β  Β  Β  Β  Β  Β  return HttpClient.getDefault()

  16. Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  .request(URI.create(«http://www.timeapi.org/utc/now»))

  17. Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  .header(«User-Agent», «Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36»)

  18. Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  .GET()

  19. Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  .response()

  20. Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  .body(HttpResponse.asString());

  21. Β  Β  Β  Β  } catch (IOException | InterruptedException ex) {

  22. Β  Β  Β  Β  Β  Β  throw new RuntimeException(«Network error»);

  23. Β  Β  Β  Β  }

  24. Β  Β  }

  25. }

  1. // module-info.java

  2. module com.example.timenetworkmodule {

  3. Β  Β  requires com.example.timeapp;

  4. Β  Β  requires java.httpclient;

  5. Β 

  6. Β  Β  provides com.example.timeapp.spi.TimeProvider

  7. Β  Β  Β  Β  Β  Β  with com.example.timenetwork.TimeNetworkProvider;

  8. }

Π£ Π½ΠΎΠ²ΠΎΠ³ΠΎ модуля Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ java.httpclient для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΎΠ²Ρ‹ΠΌ HTTP/2 ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ.

ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈ запускаСм Π² NetBeans IDE ΠΈΠ»ΠΈ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки:

  1. rem compile.cmd

  2. echo Compile timeapp

  3. %JAVAC9% -d mods/com.example.timeapp ^

  4. Β  Β  TimeApp/src/module-info.java TimeApp/src/com/example/timeapp/Main.java ^

  5. Β  Β  TimeApp/src/com/example/timeapp/spi/TimeProvider.java

  6. Β 

  7. echo Compile timelocalmodule

  8. %JAVAC9% —module-path mods -d mods/com.example.timelocalmodule ^

  9. Β  Β  TimeLocalModule/src/module-info.java TimeLocalModule/src/com/example/timelocal/TimeLocal.java ^

  10. Β  Β  TimeLocalModule/src/com/example/timelocal/TimeLocalProvider.java

  11. Β 

  12. echo Compile timenetworkmodule

  13. %JAVAC9% —module-path mods -d mods/com.example.timenetworkmodule ^

  14. Β  Β  TimeNetworkModule/src/module-info.java ^

  15. Β  Β  TimeNetworkModule/src/com/example/timenetwork/TimeNetworkProvider.java

  16. Β 

  17. echo Run timeapp

  18. %JAVA9% —module-path mods ^

  19. Β  Β  Β  Β  -m com.example.timeapp/com.example.timeapp.Main

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ:

  1. Current time: 2016-10-20T20:55:03.3944269

  2. class com.example.timelocal.TimeLocalProvider

  3. Current time: 2016-10-20T17:55:06+00:00

  4. class com.example.timenetwork.TimeNetworkProvider

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° GitHub

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3. ΠœΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ рСсурсы
Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы, рСсурсы модуля Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ этому ΠΌΠΎΠ΄ΡƒΠ»ΡŽ. Π—Π½Π°Ρ‡ΠΈΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΈΡ… ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅, Π° Π½Π° Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ модулям Π·Π°ΠΏΡ€Π΅Ρ‚ΠΎΠ² Π½Π΅Ρ‚.

Π”Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ, Π³Π΄Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ модуля Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΠΊΠ½ΠΎΠΏΠΊΠ°, ΠΏΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ врСмя.

Π’ Π³Π»Π°Π²Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ java.desktop, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ java.awt ΠΈ java.swing.

  1. // module-info.java

  2. module com.example.timeapp {

  3. Β  Β  requires java.base;

  4. Β  Β  requires java.desktop;

  5. Β 

  6. Β  Β  exports com.example.timeapp.spi;

  7. Β 

  8. Β  Β  uses com.example.timeapp.spi.TimeProvider;

  9. }

ИзмСним ΠΈ TimeProvider, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠΊΠΎΠ½ΠΊΡƒ модуля:

  1. // com/example/timeapp/spi/TimeProvider.java

  2. package com.example.timeapp.spi;

  3. Β 

  4. import java.awt.Image;

  5. Β 

  6. public interface TimeProvider {

  7. Β 

  8. Β  Β  String now();

  9. Β 

  10. Β  Β  Image icon();

  11. }

  1. // com/example/timeapp/Main.java

  2. public final class Main extends JFrame {

  3. Β 

  4. Β  Β  public static void main(String[] args) {

  5. Β  Β  Β  Β  final Main frame = new Main();

  6. Β  Β  Β  Β  ServiceLoader<TimeProvider> serviceLoader = ServiceLoader.load(TimeProvider.class);

  7. Β  Β  Β  Β  serviceLoader.forEach(t -> {

  8. Β  Β  Β  Β  Β  Β  final JButton button = new JButton();

  9. Β  Β  Β  Β  Β  Β  button.setText(t.getClass().getSimpleName());

  10. Β  Β  Β  Β  Β  Β  final Image icon = t.icon();

  11. Β  Β  Β  Β  Β  Β  if (icon != null) {

  12. Β  Β  Β  Β  Β  Β  Β  Β  button.setIcon(new ImageIcon(icon));

  13. Β  Β  Β  Β  Β  Β  }

  14. Β  Β  Β  Β  Β  Β  button.addActionListener(e -> {

  15. Β  Β  Β  Β  Β  Β  Β  Β  frame.outputLabel.setText(String.format(«Current time: %s%n», t.now()));

  16. Β  Β  Β  Β  Β  Β  });

  17. Β  Β  Β  Β  Β  Β  frame.modulesPanel.add(button);

  18. Β  Β  Β  Β  });

  19. Β  Β  Β  Β  frame.pack();

  20. Β  Β  Β  Β  frame.setVisible(true);

  21. Β  Β  }

  22. Β 

  23. Β  Β  private final JPanel modulesPanel;

  24. Β  Β  private final JLabel outputLabel;

  25. Β 

  26. Β  Β  public Main() {

  27. Β  Β  Β  Β  super(«Jigsaw Example»);

  28. Β 

  29. Β  Β  Β  Β  modulesPanel = new JPanel();

  30. Β  Β  Β  Β  modulesPanel.setLayout(new BoxLayout(modulesPanel, BoxLayout.LINE_AXIS));

  31. Β  Β  Β  Β  add(modulesPanel, BorderLayout.NORTH);

  32. Β 

  33. Β  Β  Β  Β  outputLabel = new JLabel(«output»);

  34. Β  Β  Β  Β  outputLabel.setHorizontalAlignment(SwingConstants.CENTER);

  35. Β  Β  Β  Β  add(outputLabel, BorderLayout.CENTER);

  36. Β 

  37. Β  Β  Β  Β  setDefaultCloseOperation(EXIT_ON_CLOSE);

  38. Β  Β  }

  39. }

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ модулям Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ Image icon() ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½ΠΎΠ³ΠΎ TimeProvider. Π’ΠΎΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ Π½ΠΎ. ΠœΠΎΠ΄ΡƒΠ»ΠΈ ΠΏΠΎΠΊΠ° Π΅Ρ‰Ρ‘ Π½Π΅ зависят ΠΎΡ‚ java.desktop, поэтому класс Image ΠΌΡ‹ Π½Π΅ смоТСм ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠΊΠ° Π½Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π² module-info. Как Π±Ρ‹Ρ‚ΡŒ? Для этого Π² module-info Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ синтаксис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° автоматичСски Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒΡΡ ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ:

  1. requires public java.desktop;

Π’ΠΎΠ³Π΄Π° module-info Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ прилоТСния Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

  1. // module-info.java

  2. module com.example.timeapp {

  3. Β  Β  requires java.base;

  4. Β  Β  requires public java.desktop;

  5. Β 

  6. Β  Β  exports com.example.timeapp.spi;

  7. Β 

  8. Β  Β  uses com.example.timeapp.spi.TimeProvider;

  9. }

Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

  1. public class TimeLocalProvider implements TimeProvider {

  2. Β 

  3. Β  Β  private static Image icon;

  4. Β 

  5. Β  Β  @Override

  6. Β  Β  public String now() {

  7. Β  Β  Β  Β  return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(LocalDateTime.now());

  8. Β  Β  }

  9. Β 

  10. Β  Β  @Override

  11. Β  Β  public Image icon() {

  12. Β  Β  Β  Β  if (icon == null) {

  13. Β  Β  Β  Β  Β  Β  try (InputStream is = getClass().getResourceAsStream(«/res/icon.png»)) {

  14. Β  Β  Β  Β  Β  Β  Β  Β  if (is != null)

  15. Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  icon = ImageIO.read(is);

  16. Β  Β  Β  Β  Β  Β  } catch (IOException ignore) { }

  17. Β  Β  Β  Β  }

  18. Β  Β  Β  Β  return icon;

  19. Β  Β  }

  20. }

Π’Π°ΠΊ ΠΆΠ΅ ΠΈ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅. ЗапускаСм β€” Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚!

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° GitHub

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4. АвтоматичСский ΠΌΠΎΠ΄ΡƒΠ»ΡŒ
Π₯ΠΎΡ€ΠΎΡˆΠΎ, Π° ΠΊΠ°ΠΊ Π±Ρ‹Ρ‚ΡŒ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ Ρ€Π°Π½Π½ΠΈΡ… вСрсий Java? ΠœΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠΌ module-info Π΄Π° ΠΈ ТСлания Π½Π΅Ρ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ. Как Π±Ρ‹Ρ‚ΡŒ? Π£ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²Ρ‹Π±ΠΎΡ€Π°:
Β Β Β Β  1. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π² modulepath, Ρ‚ΠΎΠ³Π΄Π° ΠΎΠ½Π° становится автоматичСским ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ: Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ имя jar-Ρ„Π°ΠΉΠ»Π°, ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ всС свои ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, Π° Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ всС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.
Β Β Β Β  2. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π² classpath, Ρ‚ΠΎΠ³Π΄Π° ΠΎΠ½Π° становится бСзымянным ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ: Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΌΡ‹ Π΅Π³ΠΎ, разумССтся, Π½Π΅ смоТСм, Π° Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½ смоТСт всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° создадим ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π±Π΅Π· module-info, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ TimeProvider (Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² classpath):

  1. // com/example/timemidnight/MidnightProvider.java

  2. package com.example.timemidnight;

  3. Β 

  4. import com.example.timeapp.spi.TimeProvider;

  5. import java.awt.Image;

  6. import java.io.IOException;

  7. import java.io.InputStream;

  8. import javax.imageio.ImageIO;

  9. Β 

  10. public class MidnightProvider implements TimeProvider {

  11. Β 

  12. Β  Β  private static Image icon;

  13. Β 

  14. Β  Β  @Override

  15. Β  Β  public String now() {

  16. Β  Β  Β  Β  return «00:00»;

  17. Β  Β  }

  18. Β 

  19. Β  Β  @Override

  20. Β  Β  public Image icon() {

  21. Β  Β  Β  Β  if (icon == null) {

  22. Β  Β  Β  Β  Β  Β  try (InputStream is = getClass().getResourceAsStream(«/res/icon.png»)) {

  23. Β  Β  Β  Β  Β  Β  Β  Β  if (is != null)

  24. Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  icon = ImageIO.read(is);

  25. Β  Β  Β  Β  Β  Β  } catch (IOException ignore) { }

  26. Β  Β  Β  Β  }

  27. Β  Β  Β  Β  return icon;

  28. Β  Β  }

  29. }

Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ, ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ jar Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ, Π½Π°Π·Π²Π°Π² Π΅Π³ΠΎ midnight.jar, ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² modulepath:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ автоматичСский ΠΌΠΎΠ΄ΡƒΠ»ΡŒ midnight:

  1. // module-info

  2. module com.example.timeapp {

  3. Β  Β  requires java.base;

  4. Β  Β  requires public java.desktop;

  5. Β  Β  requires midnight;

  6. Β 

  7. Β  Β  exports com.example.timeapp.spi;

  8. Β 

  9. Β  Β  uses com.example.timeapp.spi.TimeProvider;

  10. }

Π’ ServiceLoader MidnightProvider Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Ρ‘Ρ‚, Π·Π°Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр класса Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. НСмного ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ ΠΊΠΎΠ΄ Π² Main, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρ‹ ΠΈΠ· ServiceLoader с ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°ΠΌΠΈ, инстанцируСмыми прямо Π² ΠΊΠΎΠ΄Π΅:

  1. Stream.concat(

  2. Β  Β  Β  Β  StreamSupport.stream(serviceLoader.spliterator(), false),

  3. Β  Β  Β  Β  Stream.of(new MidnightProvider())) // we can directly access to class from automatic module

  4. Β  Β  Β  Β  .forEach(t -> …

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° GitHub


Β  Π’ΠΎΡ‚ ΠΈ всё. НадСюсь Ρƒ мСня ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΠΏΡ€ΠΈΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ завСсу Ρ‚Π°ΠΉΠ½Ρ‹ Project Jigsaw. Π—Π° вопросами Π΄ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ.

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° GitHub: https://github.com/annimon-tutorials/Java-9-Jigsaw-Example
ΠŸΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ:
Project Jigsaw: Quick Start Guide
The State of the Module System
Java Platform Module System: Requirements
First steps with Java 9 and Project Jigsaw — Part 1 (ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄)
First steps with Java 9 and Project Jigsaw — Part 2 (ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄)

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Jigsaw Π² Java 9. ΠœΠΎΠ΄ΡƒΠ»ΡΡ€Π½ΠΎΠ΅ Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ

О ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ модуляризации Java ΠΌΡ‹ ΡΠ»Ρ‹ΡˆΠΈΠΌ ΠΈΠ· Π³ΠΎΠ΄Π° Π² Π³ΠΎΠ΄. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΆΠ΄Ρ‘ΠΌ, слСдим Π·Π° анонсами. Нам говорят, Ρ‡Ρ‚ΠΎ Jigsaw практичСски Π³ΠΎΡ‚ΠΎΠ², Π½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· пСрСносят срок Π²Ρ‹Ρ…ΠΎΠ΄Π°. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, это Π½Π΅ Ρ‚Π°ΠΊΠΎΠΉ простой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΊΠ°ΠΊ видится ΠΌΠ½ΠΎΠ³ΠΈΠΌ? Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ измСнСния Π² Π½Π΅ΠΌ ΠΏΠΎΠ²Π»ΠΈΡΡŽΡ‚ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π² ΠΊΠΎΡ€Π½Π΅?Β ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, модулярная систСма β€” это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π΅Ρ€Ρ…ΡƒΡˆΠΊΠ° айсбСрга? ΠžΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° вопросы, связанныС с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Jigsaw,Β ΠΌΡ‹ попросили Ивана ΠšΡ€Ρ‹Π»ΠΎΠ²Π°.

Иван занимаСтся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин Java ΠΈ компиляторов Π±ΠΎΠ»Π΅Π΅ 10 Π»Π΅Ρ‚, Π² настоящСС врСмя Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Π½ΡƒΡŽ инфраструктуру Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС Zing Π² Azul Systems. РСгулярный Π΄ΠΎΠΊΠ»Π°Π΄Ρ‡ΠΈΠΊ Π½Π° конфСрСнциях JUG.ru ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… СвропСйских Java-конфСрСнциях.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Jigsaw, ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ повлияСт Π½Π° ΠΌΠΈΡ€ Java?

β€” Иван, Π΄ΠΎΠ±Ρ€Ρ‹ΠΉ дСнь. РасскаТитС, поТалуйста, ΠΊΠ°ΠΊΠΎΠ΅ влияниС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Jigsaw ΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π½Π° экосистСму Java?

β€” Π”ΠΎΠ±Ρ€Ρ‹ΠΉ. Для объяснСния ΠΌΠΎΠ΅Π³ΠΎ взгляда Π½Π° Java ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ стоит Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ ΠΌΠΎΠ΅ΠΉ Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. ΠšΠΎΠΌΠΌΠ΅Ρ€Ρ‡Π΅ΡΠΊΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ я занимаюсь ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π΄Π²Π°Π΄Ρ†Π°Ρ‚ΡŒ Π»Π΅Ρ‚. ПослСдниС ΠΎΠ΄ΠΈΠ½Π½Π°Π΄Ρ†Π°Ρ‚ΡŒ ΠΈΠ· Π½ΠΈΡ… β€” Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин. Π Π°Π±ΠΎΡ‚Π°Π» Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ HotSpot Runtime Π² Sun. ΠŸΠΎΡ‚ΠΎΠΌ компания Π±Ρ‹Π»Π° ΠΊΡƒΠΏΠ»Π΅Π½Π° Oracle. Π”Π°Π»Π΅Π΅ Π±Ρ‹Π»ΠΎ нСсколько ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΈ послСдниС Ρ‚Ρ€ΠΈ с ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ΠΎΠΉ Π³ΠΎΠ΄Π° Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Azul Systems, Π³Π΄Π΅ занимаюсь Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин.


Всё это я рассказал ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΉ взгляд Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ являСтся взглядом Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° JVM,Β Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ достаточно Π΄Π°Π»Ρ‘ΠΊ ΠΎΡ‚ ΠΌΠΈΡ€Π° Β«ΠΊΡ€ΠΎΠ²Π°Π²ΠΎΠ³ΠΎ энтСрпрайза», ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ высокого уровня абстракции.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ вопросу ΠΎ влиянии Jigsaw Π½Π° экосистСму Java, я Π±Ρ‹ сказал, Ρ‡Ρ‚ΠΎ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ это влияниС Π½Π΅ Ρ‚Π°ΠΊ Π²Π΅Π»ΠΈΠΊΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ. Начнём с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ссли Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π΅ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ. Π‘Ρ‚Π°Ρ€Ρ‹Π΅ способы взаимодСйствия с ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ областями видимости Π² Ρ†Π΅Π»ΠΎΠΌ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ начнутся Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ пытаСтся пСрСнСсти свой ΠΊΠΎΠ΄ Π² ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠ΄ Π΅Ρ‰Π΅ Π½Π΅ пСрСнСсён Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΡƒΡŽ инфраструктуру.

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ начнутся ΠΏΡ€ΠΈ использовании ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° OSGi, ΠΊΠΎΠ³Π΄Π° захотят ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ зависимостСй Jigsaw, Ρ‚ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΄Π²Π° способа написания этих зависимостСй ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, Π½ΠΎ это Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ частныС случаи. Π’ Ρ†Π΅Π»ΠΎΠΌ, для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ количСства Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Jigsaw ΠΏΡ€ΠΎΠΉΠ΄Ρ‘Ρ‚ достаточно Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ, поэтому ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ глобально для всСх, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

β€” Π’ Java 8 ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌΠΈ нововвСдСниями стали лямбда-выраТСния ΠΈ Stream API. Π‘ ΠΊΠ°ΠΊΠΈΠΌΠΈ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹ΠΌΠΈ измСнСниями ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Jigsaw?

β€” ΠœΠΎΠ΄ΡƒΠ»ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Jigsaw Π½Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ большого влияния Π½Π° написаниС ΠΊΠΎΠ΄Π° ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствия ΠΊΠΎΠ΄Π°. Jigsaw ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ прописываСтся взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, ΠΊΠ°ΠΊ ΠΌΡ‹ Π·Π°Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ ΠΊΠΎΠ΄ Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ абстракции. Π’ Java 9 ΠΈ Π½Π΅ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅Β API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π±Ρ‹ Ρ€Π΅Π²ΠΎΠ»ΡŽΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ сильно мСняли Ρ‚ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΠΈΡˆΡƒΡ‚ свой ΠΊΠΎΠ΄ сСгодня.

Π•ΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ измСнСния: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Java 8 появился Optional, Π² Java 9 Π² Optional добавится нСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π΅Ρ€ Π² Stream, ΠΌΠ΅Ρ‚ΠΎΠ΄ or, Π½ΠΎ это ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ измСнСния. ΠŸΠΎΡ‡ΡƒΠ²ΡΡ‚Π²ΠΎΠ²Π°Π»ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ β€” Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ΅ приятныС измСнСния Π² Process API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ позволят ΡƒΠ·Π½Π°Ρ‚ΡŒ pid Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π΅Ρ€Π΅Π²Π° процСссов, управлСния процСссами. Process API ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ количСства Ρ…Π°ΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π°Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² shell с парсингом output ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ способы, ΡƒΠΉΠ΄Ρ‘Ρ‚ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π·Π°Π»Π΅Π·Π°Ρ‚ΡŒ Π² native. Π’Π°ΠΊΠΈΠ΅ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ измСнСния разбросаны ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ class libraries, Π½ΠΎ Π½Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π² API ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠΎΡ‰Π½ΠΎΠ³ΠΎ синтаксичСского измСнСния.

ВсС сСмантичСскиС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ собраны Π² Milling Project Coin. Π‘Π°ΠΌΠΎΠ΅ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎΠ΅ β€” это, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, появлСниС ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… (default) интСрфСйсных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° Π΄Π²Π° ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… интСрфСйсных ΠΌΠ΅Ρ‚ΠΎΠ΄Π° содСрТат ΠΎΠ±Ρ‰ΠΈΠΉ ΠΊΠΎΠ΄. РаньшС Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ вынСсти Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² public ΠΌΠ΅Ρ‚ΠΎΠ΄, Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ смысла с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ API, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠ³ΠΎ Π΄Π°Π½Π½Ρ‹ΠΌ интСрфСйсом. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ объявлСн private. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄Π΅Π½ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ API этого интСрфСйса, Π·Π°Ρ‚ΠΎ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ спокойно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ этих Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π”Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒΒ Ρ‡ΠΈΡ‰Π΅ Ρ‚ΠΎΡ‚ API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ интСрфСйса ΠΈ, Π² частности, прСдлагая дСфолтныС рСализациями ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² этого интСрфСйса.

β€” ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ модуляризации сущСствуСт Π΄Π°Π²Π½ΠΎ, ΠΎΠΊΠΎΠ»ΠΎ дСвяти Π»Π΅Ρ‚, сроки Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠ»ΠΈΡΡŒ Π½Π΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. На ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ JavaOne 2015 эта Ρ‚Π΅ΠΌΠ° Π±Ρ‹Π»Π° удостоСна Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΄ΠΎΠΊΠ»Π°Π΄Ρ‡ΠΈΠΊΠΎΠ² (Alan Bateman, Alex Buckley, Mark Reinhold). Π’Π°ΠΊΠΎΠΉ Π°ΠΆΠΈΠΎΡ‚Π°ΠΆ Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Π°ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°?

β€” ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Jigsaw потянул Π·Π° собой ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ измСнСния. Π― Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽ Jigsaw ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΈΠ΅ Π΄Π²Π΅ составныС части, пСрвая β€” это ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² языкС ΠΌΠΎΠ΄Π΅Π»ΠΈ видимости, Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, синтаксис. Вторая Ρ‡Π°ΡΡ‚ΡŒ β€” это Ρ‚ΠΎ, ΠΊΠ°ΠΊ модСль ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π±Ρ‹Π»Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° нСпосрСдствСнно ΠΊ class libraries Π² jdk. Π§Π°ΡΡ‚ΡŒ классов ΠΏΠ΅Ρ€Π΅Π΅Ρ…Π°Π»Π°, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ стали deprecated ΠΈΠ»ΠΈ пСрСстали Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌΡ‹ снаруТи.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ΅ Π΄Π΅Π±Π°Ρ‚Ρ‹ Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ reflection. РаньшС ΠΎΠ½ позволял Π΄ΠΎΡΡ‚ΡƒΡ‡Π°Ρ‚ΡŒΡΡ Π΄ΠΎ любого ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ класса ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Π‘Ρ‹Π»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ измСнСния ΠΏΠΎΠ»Π΅ΠΉ Π½Π° Π»Π΅Ρ‚Ρƒ Ρ‡Π΅Ρ€Π΅Π· reflection ΠΈ ΠΈΡ… приватности. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π±Ρ‹Π»ΠΈ доступны, я Π±Ρ‹ сказал, эксплойты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ использовались большим количСством Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ это Π±Ρ‹ ΠΎΡ‚Ρ€Π°Π·ΠΈΠ»ΠΎΡΡŒ Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΡ…. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Π΅ Π²Π°ΠΌΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ языка Π²Ρ‹ΡˆΠ»ΠΈ ΠΊ сообщСству, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ измСнСния Π±ΡƒΠ΄ΡƒΡ‚, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ΠΈ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄ΡƒΡ‚, Π·Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ эти Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½Ρ‹Π΅ измСнСния. Π‘ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ количСство Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ сразу автоматичСски стало нСсовмСстимым. ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΊΠΎΠ΄Π° Π½Π° Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρƒ Π½ΠΈΡ… Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ врСмя, Ρ‡Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, сопровоТдаСтся ΡˆΡƒΠΌΠΎΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΠΈΠΌ: Β«ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° Π΄Π΅Π²ΡΡ‚ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π»ΠΎΠΌΠ°Π΅Ρ‚ всё». Π­Ρ‚ΠΈ объяснСния Π±Ρ‹Π»ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹.

Π‘ΠΎΠ»ΡŒΡˆΠΎΠ΅ количСство Π΄ΠΎΠΊΠ»Π°Π΄ΠΎΠ² ΠΏΡ€ΠΎ Jigsaw Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ Π³ΠΎΠ΄Ρƒ Π±Ρ‹Π»ΠΎ Π½Π° JavaOne, ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ количСство Π½Π° Devoxx Π² АнтвСрпСнС. Π’ этом Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ Π΄ΠΎΠΊΠ»Π°Π΄Ρ‹, Π½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ интСрСсныС ΠΎΡ‚ сторонних людСй, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, рСбята ΠΈΠ· IBM Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Π΅ΡΡ‚ΡŒ Π»ΠΈ Тизнь послС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. Π― с интСрСсом Π±ΡƒΠ΄Ρƒ ΠΆΠ΄Π°Ρ‚ΡŒ видСозаписСй с JavaOne 2016.

β€” НовоС понятиС β€” ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. Как ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ «составныС» части модуля: module name, exports ΠΈ requires? Π₯ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΏΠΎΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅ΠΉ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π½Π° Β«requiresΒ» ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ ΠΌΡ‹ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ смоТСм Β«Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΒ», Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Β«requires localΒ» ΠΈΠ»ΠΈ Β«requires optionalΒ»?

β€” Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ с простого ΠΊΠ½ΠΈΠΆΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ситуации, ΠΊΠΎΠ³Π΄Π° Ρƒ вас Π½Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°, Π²Ρ‹ просто ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π΅Π³ΠΎ с нуля. Π£ вас Π΅ΡΡ‚ΡŒ классы ΠΈ Π²Ρ‹ размСстили ΠΈΡ… Π² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ…, Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρƒ Π½ΠΈΡ… Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ тСсной ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΠΉ связи, ΠΈ ΠΎΠ½ΠΈ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… модулях. Когда ΠΊΠ°ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ классу ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ модуля Π½ΡƒΠΆΠ½Ρ‹ классы ΠΈΠ· Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ модуля, ΠΎΠ½ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ΅Π½, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ requires, Π²ΠΎΡ‚ этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π΄Π²Π°, указывая ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρƒ Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½Ρ‹. Вся иСрархия достаточно строгая, Ссли ΠΏΠ°ΠΊΠ΅Ρ‚ управляСт абстракциями Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ классов, Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ управляСт ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠ΅ΠΉ уровня ΠΏΠ°ΠΊΠ΅Ρ‚, это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ requires.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° происходит Π² ΠΎΠ±ΠΎΠΈΡ… случаях: ΠΈ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ компиляции ΠΈ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ исполнСния, ΠΊΠ°ΠΊ это довольно часто происходит ΠΈ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ элСмСнтами языка Java. JVM Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ всС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Ρ‹, скаТСм Ρ‚Π°ΠΊ, чСстно, Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ компиляции, Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΊΡƒΠ΄Π° ΡƒΠ³ΠΎΠ΄Π½ΠΎ, поэтому Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ Π² javac, ΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ JVM Runtime. Requires провСряСт, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ этого модуля ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ доступны, эти ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ находятся ΠΊΠ°ΠΊΠΎΠΌ Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»Π΅ Π΄Π²Π° ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ Ρ‚Ρ€ΠΈ. Если Ρ‚Π΅ΠΌ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π½ΡƒΠΆΠ½Ρ‹ Π΅Ρ‰Ρ‘ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Ρ‚ΠΎ строится такая транзитивная Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ Π² самом Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Ρ‡Ρ‚ΠΎ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½Π°ΠΌ доступны.

Π—Π°Ρ‚Π΅ΠΌ, exports β€” это ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ видимости. Он Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ прСдоставляСт Ρ‚Π°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠΌ модулям. МоТно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ всСм сразу β€” это условная «*», которая ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, всС, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ этим ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ всС классы доступны ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ, Π° лишь Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ public, Ρ‚.Π΅. Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ СскСйпятся, становятся доступны Π΄Ρ€ΡƒΠ³ΠΈΠΌ модулям Ρ‡Π΅Ρ€Π΅Π· этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ. МоТно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ export to ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСпосрСдствСнно ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ ΠΈ Π½ΠΈΠΊΠΎΠΌΡƒ большС ΠΈ этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ статичСской Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΅ΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Ρ€Π°Π½Ρ‚Π°ΠΉΠΌ Ρ„Π»Π°Π³ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° для ΡƒΠΆΠ΅ скомпилированного модуля ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ эти области видимости, с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. Если Π±Ρ‹ Ρƒ Π½Π΅Π³ΠΎ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π»ΠΎ экспортов для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡ… Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, Π½ΠΎ это видится ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ этап, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, ΠΏΠΎ ΠΈΠ΄Π΅Π΅, всС Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅. Π’.Π΅. ΠΌΠΎΠ΄ΡƒΠ»ΡŒ β€” нСкая закончСнная Π΅Π΄ΠΈΠ½ΠΈΡ†Π° с Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΈ Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ этому ΠΌΠΎΠ΄ΡƒΠ»ΡŽ ΠΈ Ρ‡Ρ‚ΠΎ ΠΎΠ½ прСдоставляСт Π΄Ρ€ΡƒΠ³ΠΈΠΌ модулям для использования.

Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ сама jdk пСрСстроСна Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вСсь Π½Π°Π±ΠΎΡ€ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ jdk прСдставлял Π½Π°Π±ΠΎΡ€ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ с понятными зависимостями. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΈΠΉ subset jre, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹. Π’ этой связи появилась ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° jlink, которая позволяСт ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Run-Time Image Ρ‚ΠΎΠ»ΡŒΠΊΠΎ лишь ΠΈΠ· Ρ‚Π΅Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹. Π­Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ ΠΈΠ΄Π΅ΠΈ, которая появилась Π² Java 8 с профилями.Β Π’ jdk 8 ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎΒ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ jdk ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ с Ρ€Π°Π·Π½Ρ‹ΠΌ количСством классов ΠΈ Ρ€Π°Π·Π½Ρ‹ΠΌ количСством Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π½ΠΎ это, скаТСм Ρ‚Π°ΠΊ, статичСская сборка, Π±Π΅Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ понадобится. А jlink ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π°ΠΌ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΈΠΉ пСрСносимый Runtime, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, модуля java.base, Π΅Ρ‰Π΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΎ количСства ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ.

Π’ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π°Π²Ρ‚ΠΎΡ€Ρ‹ ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΡ€ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π² java 9 Paul Bakker ΠΈ Sander Mak ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹. Π‘ΠΎΠ±Ρ€Π°Π»ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ простого тСкстового Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠΎΠΌ β€” получился дистрибутив ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 20 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚. Когда Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Β swing-окошки, Ρ‚ΠΎ добавились Π½ΠΎΠ²Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠ³ΠΎ дистрибутива вырос Π΄ΠΎ 50 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚. Π“Ρ€Π°Π½ΠΈΡ†Ρ‹ JDK Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΏΡ€ΠΈ этом Ρ€Π°Π·ΠΌΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ находятся Π²Π½ΡƒΡ‚Ρ€ΠΈ jdk ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ вмСстС с jdk, Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Ρ‚.Π΅. Ρ‚Π°ΠΊΠΈΠ΅ дистрибутивы ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΏΠΎ Ρ€Π°Π·Π½ΠΎΠΌΡƒ Π±ΡƒΠ΄ΡƒΡ‚ скомпонованы. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΠΎ Π½ΠΎΠ²ΠΎΠΌΡƒ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½Π΅ трСбуСтся Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊ пошСл ΠΈ скачал Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ jdk, Π° ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ нСпосрСдствСнно собранным Runtime`ΠΎΠΌ.

β€” О ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ «Dependency hell» ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π±Ρ‹Ρ‚ΡŒ навсСгда?

β€” Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ часто Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½-систСмах ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Π΄Π»ΠΈΠ½Π½ΡƒΡŽ строчку classpath, Π³Π΄Π΅ пСрСчислСно большоС количСство jar, ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², Π³Π΄Π΅ находится скомпилированный ΠΊΠΎΠ΄. Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ оказываСтся Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π² классах Π·Π°Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ классы ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΈ Ρ‚ΠΎΠ³Π΄Π° Runtime Π±Π΅Ρ€Π΅Ρ‚ Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π½ΡŒΡˆΠ΅ появился Π² classpath. Π’ связи с этим ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ людСй ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΈ Ρ‚Π°ΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΊΠΎΠ³Π΄Π° ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Ρ‹ мСст jar Π² class-ΠΏΡƒΡ‚ΠΈ мСнялось ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²ΠΎΡ‚ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° ΠΊΠΎΡ€Π½ΡŽ.

ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: Ссли Ρƒ нас классы Ρ€Π°Π·Π»ΠΎΠΆΠ΅Π½Ρ‹ ΠΏΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌ, Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½-СдинствСнный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ссли, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρƒ нас находятся Π΄Π²Π° модуля Π² Π΄Π²ΡƒΡ… jar ΠΈ ΠΎΠ±Π° ΠΎΠ½ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ элСмСнты ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Ρ‚ΠΎ такая ситуация Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ прСдполагаСтся, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Ρ‚.ΠΊ. ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ. ΠŸΡ€ΠΈ этом Jigsaw Π½Π΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ вСрсионного контроля, Ρ‚.Π΅. соотвСтствиС вСрсий Π² Ρ‚ΠΎΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π²Β package manager-Π°Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Linux.

Π—Π°Π΄Π°Ρ‡Π° вСрсионного контроля ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ стояла Π² Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях, Π½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌ Π΅Ρ‘ сняли, СдинствСнноС, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ β€” Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ Π² ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅. МоТно ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ эти ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅, Π½ΠΎ нСпосрСдствСнно ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ классов Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚, это ΠΎΡ‚Π΄Π°Π½ΠΎ Π½Π° ΠΎΡ‚ΠΊΡƒΠΏ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ OSGi, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Ρ‹ ΠΏΠΎΠ²Π΅Ρ€Ρ…. Π­Ρ‚ΠΎ сдСлано ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… слоТностСй. Π­Ρ‚ΠΎ достаточно слоТная Π·Π°Π΄Π°Ρ‡Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒ classloader`Ρƒ, поэтому Π΅Ρ‘ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡŽ.

β€” ΠŸΠΎΡΠ²ΡΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ: Named Modules, The Unnamed Module, Automatic Modules. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ Π½ΠΈΡ…? Π’ Ρ‡Π΅ΠΌ состоят ΠΈΡ… отличия ΠΈ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ привносит Π² ΠΎΠ±Ρ‰ΡƒΡŽ структуру?

β€” Если Π²Ρ‹ ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ «с нуля», ΠΏΠΎ всСм ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅ Π΅Π³ΠΎ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ модуля, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅Β Ρ„Π°ΠΉΠ» module-info.java, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ содСрТится дСкларация модуля, Π½Π°Π·Π²Π°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, с пСрСчислСниСм exports ΠΈ requires. Π’Π°ΠΊΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ β€” это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.

Если Π²Ρ‹ ΠΆΠΈΠ²Π΅Ρ‚Π΅ ΠΏΠΎ старинкС ΠΈ Ρƒ вас Π΅ΡΡ‚ΡŒ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ просто ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ Π·Π°ΠΊΠΈΠ΄Ρ‹Π²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· classpath, ΠΎΠ½ΠΈ Ρ‚ΠΎΠΆΠ΅ окаТутся Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ называСтся Unnamed Module. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ Π½Π΅ Π½Π°Π·Π²Π°Π»ΠΈ, Π΅ΡΡ‚ΡŒ бСзымянноС послСднСС ΠΏΡ€ΠΈΠ±Π΅ΠΆΠΈΡ‰Π΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ дСвятка Π½Π΅ смоТСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π±Π΅Π· ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.

Π•ΡΡ‚ΡŒ нСкая промСТуточная стадия, ΠΊΠΎΠ³Π΄Π° Ρƒ вас, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, jar Ρ„Π°ΠΉΠ», Π² Π½Π΅ΠΌ находятся ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, Π²Ρ‹ Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΠ»ΠΈ Π½Π΅ Π² classpath, Π° Π² modulepath, Ρ‚ΠΎΠ³Π΄Π° Runtime Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ сСбС этот Ρ„Π°ΠΉΠ» ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΈΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ совпадаСт с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ jar-Ρ„Π°ΠΉΠ»Π°, ΠΈ с Π½ΠΈΠΌ дальшС ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ с Named ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ, ΠΈ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Π½Π΅Π³ΠΎ.

НапримСр, Ссли Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ свой ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. Π’Ρ‹ зависитС ΠΎΡ‚ ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, которая Π΅Ρ‰Ρ‘ Π½Π΅ Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π° Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΡƒΡŽ структуру, Ρ‚ΠΎ смоТСтС ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ jar с этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Π² modulepath. Он станСт автоматичСским ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Π² module-info.java ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ: requires ΠΈ дальшС имя модуля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π΅ΠΌΡƒ автоматичСски.

И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, послСднСС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ происходит послСдниС Π½Π΅Π΄Π΅Π»ΠΈ, ΠΈ Π΅Ρ‰Ρ‘ Π½Π΅ совсСм понятно, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ принят это proposal ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π― ΡƒΠΆΠ΅ сказал Ρ‡ΡƒΡ‚ΡŒ Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‡Ρ‚ΠΎ сущСствуСт опрСдСлСнная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с reflection, Ссли Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π΄ΠΎΡΡ‚ΡƒΡ‡Π°Ρ‚ΡŒΡΡ Π΄ΠΎ Ρ‡Π΅Π³ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ, Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ сущСствуСт Π·Π°Ρ‰ΠΈΡ‚Π°, ΠΈ появляСтся новая концСпция, которая сСйчас ΠΈΠ΄Ρ‘Ρ‚ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ Π² стандарт, хотя это Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ β€” weak ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.

Weak ΠΌΠΎΠ΄ΡƒΠ»ΡŒ β€” это Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠ΄ Π² этом ΠΌΠΎΠ΄ΡƒΠ»Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· reflection Π΄ΠΎΡΡ‚ΡƒΡ‡Π°Ρ‚ΡŒΡΡ Π΄ΠΎ классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ находятся Π² ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… модулях, ΠΈ Π΄Π°ΠΆΠ΅ Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ экспортированы ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½ΠΎ ΠΏΡ€ΠΈ этом сам Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свою Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π°Ρ€ΡƒΠΆΡƒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚. Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ сдСлано ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ этот ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· reflection Π΄ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒ, Π΄ΠΎΡΡ‚ΡƒΡ‡Π°Ρ‚ΡŒΡΡ Π΄ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ для этого Π½Π΅ прСдназначался.

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ использованиС weak ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ сойдСт Π½Π° Π½Π΅Ρ‚, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, ΠΎΠ½ΠΈ останутся Π² ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… цСлях. Как ΠΈ Automatic ΠΌΠΎΠ΄ΡƒΠ»ΠΈ β€” это ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ ΠΎΡ‚ нСмодуляризованного ΠΊΠΎΠ΄Π° ΠΊ модуляризованному.

OSGi vs Jigsaw: Ρ…ΠΎΠ»ΠΈΠ²Π°Ρ€Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚

β€” ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ Π±Ρ‹Π»Π° ΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½Π° OSGi для модуляризации Java? Π’Ρ‹ согласны со словами Mark Reinhold: Β«The OSGi module layer is not operative at compile time; it only addresses modularity during packaging, deployment, and execution. As it 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Β»? БущСствуСт ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Penrose для взаимодСйствия OSGi/Jigsaw. (ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ слой OSGi Π½Π΅ дСйствуСт Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ компиляции; обращаСтся ΠΊ модулярности Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя Π°Ρ€Ρ…ΠΈΠ²Π°Ρ†ΠΈΠΈ, развёртывания ΠΈΠ»ΠΈ выполнСния. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² Ρ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ½ (OSGi) Π΅ΡΡ‚ΡŒ, ΠΎΠ½ ΠΏΠΎΠ»Π΅Π·Π΅Π½ для Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ создаётся строго Π½Π° основС Java SE Platform ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для модуляризации своСй ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ (ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π°Π²Ρ‚ΠΎΡ€Π°).

β€” Π― ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΠ» OSGi, ΠΈ Ρƒ мСня появилось ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅ Π½Π° счёт Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ всё-Ρ‚Π°ΠΊΠΈ Π½Π΅ OSGi стал Jigsaw. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° повСрхности, Π΅Π³ΠΎ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠ» Mark Reinhold: сам ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ написан ΠΏΠΎΠ²Π΅Ρ€Ρ… спСцификации Java SE, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ поставку Java SE Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ модулями, Ρ‚ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ OSGi Π½Π°ΠΌ Π½Π΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π° Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅. Π’ Ρ†Π΅Π»ΠΎΠΌ OSGi Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ class loading`Π°, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ появляСтся сначала ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Ρ‰ΠΈΠΉ OSGi environment classloader, ΠΏΠΎΡ‚ΠΎΠΌ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ bundle OSGi появляСтся ΠΏΠΎ своСму classloader’Ρƒ, ΠΈ благодаря этому происходит Π½Π΅ΠΊΠΎΠ΅ Ρ€Π°Π·Π³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ видимости классов.

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Jigsaw Π΄Π΅Π»Π°Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π½ΠΎ ΡƒΠΆΠ΅ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Ρ‡Ρ‚ΠΎ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, достаточно сущСствСнно для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ самой Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹. НС сСкрСт, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ класс адрСсуСтся Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ: classloader ΠΈ дальшС ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈ имя класса, Ρ‡Π΅Ρ€Π΅Π· Π²ΠΎΡ‚ эту ΠΏΠ°Ρ€Ρƒ. И Ссли ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈ имя класса — это ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ строковыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΠΌΡƒ соотвСтствуСт, Ρ‚ΠΎ classloader β€” это просто рСфСрСнс Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ class loading’a. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² случаС persist’a, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ эти Π΄Π°Π½Π½Ρ‹Π΅ пытаСмся Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, этот рСфСрСнс тСряСт ΠΊΠ°ΠΊΠΎΠΉ Π»ΠΈΠ±ΠΎ смысл, Ρƒ classloader’Π° Π½Π΅Ρ‚ собствСнного строкового Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°. Π­Ρ‚ΠΎ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ ограничСния Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π²ΠΎΡ‚ Π² Ρ‚Π°ΠΊΠΎΠΌ ahead of time стилС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Jigsaw Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ базирования этого ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° видимости Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ class loading’a, ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ сдСлано Π² OSGi. Π’ OSGi Ρ‚Π°ΠΊ сдСлали, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это Π±Ρ‹Π»ΠΎ СдинствСнноС, Ρ‡Ρ‚ΠΎ ΠΈΠΌ доступно ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ прСдоставляСт Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина, ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π²ΠΌΠ΅ΡˆΠ°Ρ‚ΡŒΡΡ Π² ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ class resolution.

β€” ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ фактичСски рСализация Ρƒ OSGi ΠΈ Jigsaw Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… уровнях.

β€” Π”Π°, ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π²Π΅Ρ€Π½ΠΎ. Jigsaw Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π° Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ ΠΈΠ»ΠΈ Π½Π΅ΡΡ‡Π°ΡΡ‚ΡŒΡŽ. НавСрноС, ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½Π΅ΡΡ‡Π°ΡΡ‚ΡŒΡŽ для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ ΡƒΠΆΠ΅ успСл Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ OSGi. Π’Π΅ΠΏΠ΅Ρ€ΡŒ придётся ΠΊΠ°ΠΊ-Ρ‚ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΄Π²Π° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… описания зависимостСй, ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Penrose, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ОписаниС задаётся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JSON-скрипта, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ΅ описаниС, Jigsaw-описаниС зависимостСй ΠΈ OSGi-описаниС. ΠŸΡ€ΠΈΠ΄Ρ‘Ρ‚ΡΡ ΡΠΊΡ€Π΅Ρ‰ΠΈΠ²Π°Ρ‚ΡŒ эти Π΄Π²Π° ΠΌΠΈΡ€Π°, ΠΈ Ρƒ Ρ‚Π΅Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ OSGiΒ Π² настоящСС врСмя, Тизнь станСт Π½Π΅ΠΌΠ½ΠΎΠΆΠΊΠΎ слоТнСС.

β€” КакиС измСнСния ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄ΡƒΡ‚ Π² Ρ€Π°Π±ΠΎΡ‚Π΅ classloader’ΠΎΠ²?

β€” ИзмСнСния Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ Ρ‚Π°ΠΊΠΈΠ΅ ΡƒΠΆ ΠΈ большиС. РаньшС Ρƒ нас Π±Ρ‹Π» ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, состоящий ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ступСнСй, это Bootstrap classloader, Extension classloader ΠΈΒ Application classloader, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π½ΡŒΡˆΠ΅Β Π±Ρ‹Π» instance of URL classloader. ИзмСнСния Π² Java 9 состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Extension classloader прСобразуСтся Π² Platform classloader ΠΈ связано это с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ссли Ρ€Π°Π½ΡŒΡˆΠ΅ Extension использовался для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° классов, Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ ΠΊ jdk, ΠΈΡ… Π±Ρ‹Π»ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ. Π’ Java 9 ΠΏΡ€ΠΎΠ²Π΅Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ поняли, Ρ‡Ρ‚ΠΎ Ρƒ большого количСства ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠ·ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ пСрСнСсти Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈΠ· Bootstrap classloader, ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Platform classloader. НаконСц, Application classloader, Ссли Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΎΠ½ Π±Ρ‹Π» instance of URL classloader, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ это instance Π½Π΅ΠΊΠΎΠ³ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ класса. Π­Ρ‚ΠΎ, Π² частности, Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ сломало Gradle, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ использовал это Π·Π½Π°Π½ΠΈΠ΅, ΠΎΠ½ искал instance of URL classloader β€” это Π±Ρ‹Π»ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Π’Ρ€ΠΎΠ΄Π΅ ΠΊΠ°ΠΊ Gradle ΡƒΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Jigsaw ΠΈ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚Π°ΠΌ Ρ€Π΅ΡˆΠ΅Π½Π°.

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эти знания, прСдставлСния, ΠΊΠ°ΠΊ это Π΄Π΅Π»Π°Π» Gradle, Π½ΠΈΡ‡Π΅Π³ΠΎ сильно Π½Π΅ измСнится. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠ°ΠΊ Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с Application classloader’ΠΎΠΌ. Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° людСй эти измСнСния ΠΏΡ€ΠΎΠΉΠ΄ΡƒΡ‚ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ.

На ΡƒΡ€ΠΎΠ²Π½Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, Π΅ΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ измСнСния, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ видимости классов β€” появляСтся Π½ΠΎΠ²Ρ‹ΠΉ класс ошибок.

ΠžΠ±Π»Π°ΡΡ‚ΡŒ, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ β€” это Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ связаны с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ссли класс Π½Π΅ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ модуля, Ρ‚.Π΅. ΠΎΠ½ Π½Π΅ экспортируСтся Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°ΠΊΠ΅Ρ‚ Π½Π°Ρ€ΡƒΠΆΡƒ, Ρƒ нас появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒΒ Whole Program Optimization, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π½ΡŒΡˆΠ΅ Π±Ρ‹Π»ΠΈ нСдоступны, Ρ‚.ΠΊ. Ρ€Π°Π½ΡŒΡˆΠ΅ класс ΠΌΠΎΠ³ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Π² Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Ρ†Π΅Π»Ρ‹ΠΉ пласт jit-ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Ρ‹Π» Π½Π°ΠΌ нСдоступСн. Π’ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ опрСдСлённая информация, Ρ‡Ρ‚ΠΎ Oracle Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°Π΄ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ahead of time компиляции ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ ΡƒΠΆΠ΅ Π±ΠΈΠ½Π°Ρ€Π½ΠΎ скомпилированного ΠΊΠΎΠ΄Π° Π² jmod, это Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ для хранСния ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ для Π±ΠΎΠ»Π΅Π΅ быстрого старта ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π² эти ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. Но ΠΏΠΎ этому ΠΏΠΎΠ²ΠΎΠ΄Ρƒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ я Π²ΠΈΠ΄Π΅Π» ΠΏΠΎΠΊΠ° ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ, посмотрим, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° Π΅Ρ‰Π΅ Π½Π΅ Π΄ΠΎΠ²Π΅Π΄Π΅Π½Π° Π΄ΠΎ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°.

РСшаСм Π³ΠΎΠ»ΠΎΠ²ΠΎΠ»ΠΎΠΌΠΊΡƒ: ошибки, прСдупрСТдСния ΠΈ прСдостСрСТСния

β€” КакоС ΠΌΠ½Π΅Π½ΠΈΠ΅ Ρƒ вас слоТилось ΠΎ систСмС ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΈ ошибок Π²ΠΎ врСмя компиляции?

β€” НС ΠΌΠΎΠ³Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ мСня ΠΏΠΎΠΊΠ° ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ ΠΎΠΏΡ‹Ρ‚ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Jigsaw ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, я ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹. ΠœΠΎΠ³Ρƒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Ρ‚ΡŒ читатСлям Π²Π·ΡΡ‚ΡŒ хрСстоматийный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с двумя модулями, Π³Π΄Π΅ ΠΎΠ΄ΠΈΠ½ экспортируСт, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ requires. Π”Π°Π»Π΅Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Β«Hello WorldΒ». А ΠΏΠΎΡ‚ΠΎΠΌ стоит Π²Π·ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ: ΡƒΠ±Ρ€Π°Ρ‚ΡŒ requires ΠΈΠ»ΠΈ exports. ΠŸΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ модуля, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π½Π΅ совпадал с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ Π»Π΅ΠΆΠΈΡ‚, ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π½Π° ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Ρƒ, Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ символ Π² Π½Π°Π·Π²Π°Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ΄Ρ‡Ρ‘Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ случится.

Π― Π±Ρ‹ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΡ‚ Π² Ρ‚Π°ΠΊΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π½Π° ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π° своСм ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠ΄Π΅. Аналогично ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с IDE, сначала ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π΅Π³ΠΎ ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒ ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ошибки ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ.

По ΠΌΠΎΠΈΠΌ прСдставлСниям ошибки Ρ„Π°Π·Ρ‹ компиляции Π±ΡƒΠ΄ΡƒΡ‚ сродни Ρ‚Π°ΠΊΠΎΠ²Ρ‹ΠΌ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ Π΄ΠΎΡΡ‚ΡƒΡ‡Π°Ρ‚ΡŒΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΊ private классу ΠΎΡ‚ΠΊΡƒΠ΄Π°-Ρ‚ΠΎ, Ρƒ вас ошибка видимости. Π’Π°ΠΊΡƒΡŽ диагностику javac компилятор Π΄Π΅Π»Π°Π΅Ρ‚ для ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ Π΄ΠΎΡΡ‚ΡƒΡ‡Π°Ρ‚ΡŒΡΡ Π΄ΠΎ класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π²ΠΈΠ΄ΠΈΠΌ. Π’ части диагностики я Π½Π΅ Π²ΠΈΠΆΡƒ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ помСнялись ΠΏΡ€Π°Π²ΠΈΠ»Π° видимости ΠΈ class resolution, я Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ сильная Ρ€Π°Π·Π½ΠΈΡ†Π° с ошибками, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… видимости, связанныС с ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ. Π’.Π΅. это Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ абстракции, Π½ΠΎ катСгория ошибок Ρ‚ΠΎΡ‡Π½ΠΎ такая ΠΆΠ΅.

β€” Π’ основной массС, IDE ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€Π° языкового уровня Β«JigsawΒ». Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ ΠΈ контроля Π±ΡƒΠ΄Π΅Ρ‚ сдСлана Π·Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π§Ρ‚ΠΎ Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅ ΠΏΠΎ этому ΠΏΠΎΠ²ΠΎΠ΄Ρƒ?

β€” Бамая большая связанная с модулями ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΌΠ½Π΅ каТСтся, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈΠ΄Ρ‘Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ Π΄ΠΎΠ»Π³ΠΎ, само слово module ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ, ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π½Π°ΠΉΡ‚ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π½Π° StackOverflow ΠΈΠ»ΠΈ Π² Google Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ приводят Π½Π° ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ тСксты, поэтому ΠΎΡ‡Π΅Π½ΡŒ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Π΄Π°Ρ‚Ρƒ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ².

Аналогично с IDE: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ»Ρ‚ΠΎΡ€Π° Π³ΠΎΠ΄Π° Π½Π°Π·Π°Π΄ я ΠΎΡ‚ΠΊΡ€Ρ‹Π» IDEA, ΠΈ Ρ‚Π°ΠΌ ΡƒΠΆΠ΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»ΠΎΡΡŒ слово Β«ΠΌΠΎΠ΄ΡƒΠ»ΡŒΒ», Π½ΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π»ΠΈΡΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ Jigsaw. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли Π²Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² IDE, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ IDE свСТая, Ρ‚.ΠΊ. ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ€Π²Π°Ρ‚ΡŒΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΏΡ€ΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ слова Β«ΠΌΠΎΠ΄ΡƒΠ»ΡŒΒ».

β€” Одно ΠΈΠ· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Jigsaw β€” Β«Π³ΠΎΠ»ΠΎΠ²ΠΎΠ»ΠΎΠΌΠΊΠ°Β». Насколько слоТной стала Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, Π½Π° ваш взгляд?

β€” Если Π±Ρ‹ Ρƒ мСня Π±Ρ‹Π» Π±Ρ‹ Π±Π°Π³Π°ΠΆ Π·Π½Π°Π½ΠΈΠΉ ΠΎ модулях Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках, ΠΈΠ»ΠΈ Π±ΠΎΠ³Π°Ρ‚Ρ‹ΠΉ ΠΎΠΏΡ‹Ρ‚ с OSGi, я Π±Ρ‹, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, хватался Π·Π° Π³ΠΎΠ»ΠΎΠ²Ρƒ ΠΈ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ΠΈ Π΅Π³ΠΎ Ρ‚Π°ΠΊ сдСлали, Π° Π½Π΅ эдак. Π£ мСня Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΎΠΏΡ‹Ρ‚Π° Π½Π΅Ρ‚, ΠΈ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Π²ΠΎΡ‚ это Π½ΠΎΠ²Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ абстракции, ΠΊΠ°ΠΊ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ зависимости Π±Ρ‹Π»ΠΎ достаточно просто.

Π’ Java 8 появилась ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° jdep, ΠΎΠ½Π° Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ поставку jdk, которая позволяСт ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ ΠΈ Π² Java 9 появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°Ρ‚Ρ€Π°Π²ΠΈΡ‚ΡŒ Π²ΠΎΡ‚ эту ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ Π½Π° jar Ρ„Π°ΠΉΠ» ΠΈ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ module-info.java Π² Ρ„Π°ΠΉΠ», Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π° Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π³Π»Π°Π·Π°ΠΌΠΈ, ΠΏΠΎΠ΄Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΎ requires Π½Π°ΠΌ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ ΠΈΠ»ΠΈ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ. Jdep Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ module-info.java, ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈ привСсти Π² Ρ‚Π°ΠΊΠΎΠ΅ состояниС, Π² ΠΊΠ°ΠΊΠΎΠΌ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΅Π³ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‚.Π΅. Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ с нуля, Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС свои зависимости, jdep прСкрасно с этим справляСтся ΠΈ ΠΎΡ‡Π΅Π½ΡŒ сильно Π² этом ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚.

Π― Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ созданию модуля Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ слоТной, инструмСнтарий достаточно Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ написан, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈ.


О модулярности Java 9 Π½Π° Joker 2016 расскаТСт Sander Mak, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сСйчас Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ ΠΊΠ½ΠΈΠ³Ρƒ Java 9 Modularity для O’Reilly, Π² своём Π΄ΠΎΠΊΠ»Π°Π΄Π΅ Java 9 Modularity in Action.

Если Π²Ρ‹ Π»ΡŽΠ±ΠΈΡ‚Π΅ Β«ΠΊΠΈΡˆΠΎΡ‡ΠΊΠΈΒ» JVM ΠΈ ΠΆΠ΄Π΅Ρ‚Π΅ Java 9 Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹, Ρ‚ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Π²Π°ΠΌ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄ΠΎΠΊΠ»Π°Π΄Ρ‹ Joker 2016:

Полная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ – Π½Π° сайтС.

БСрвисы модуля Java 9 — CoderLessons.com

ΠŸΡ€ΠΎΠ²ΠΎΠ΄ΠΊΠ° ΠΈ поиск

Π’ Java ΡƒΠΆΠ΅ Π΄Π°Π²Π½ΠΎ Π΅ΡΡ‚ΡŒ класс ServiceLoader . Он Π±Ρ‹Π» прСдставлСн Π² 1.6, Π½ΠΎ с Ρ‚Π΅Ρ… ΠΏΠΎΡ€ ΠΎΠΊΠΎΠ»ΠΎ Java 1.2 использовалась похоТая тСхнология. НСкоторыС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ использовали Π΅Π³ΠΎ, Π½ΠΎ использованиС Π½Π΅ Π±Ρ‹Π»ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎ распространСно. Он ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ прилоТСния (ΠΈ Π΄Π°ΠΆΠ΅ большС) ΠΈ для обСспСчСния возмоТности Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ прилоТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ зависят ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции прилоТСния. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, конфигурация этих сСрвисов ΠΎΡ‡Π΅Π½ΡŒ проста: просто ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ ΠΊ классу / ΠΌΠΎΠ΄ΡƒΠ»ΡŽ. ΠœΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π΄Π΅Ρ‚Π°Π»ΠΈ.

Π—Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ слуТбы ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… интСрфСйсов. Π’ срСдС EE Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для настройки Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ. Π’ срСдС, Π½Π΅ относящСйся ΠΊ EE, Spring стал вСздСсущим, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ΅, хотя ΠΈ Π½Π΅ совсСм Ρ‚ΠΎ ΠΆΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ аналогичная, Π½ΠΎ Π½Π΅ совсСм Ρ‚Π° ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Π˜Π½Π²Π΅Ρ€ΡΠΈΡ управлСния (IoC) ΠΈ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ зависимостСй (DI), прСдоставляСмыС Spring, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΊΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΎΡ‚Ρ€Π°ΡΠ»Π΅Π²ΡƒΡŽ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒ, ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ описаниС / ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΊΠΈ ΠΎΡ‚ фактичСской Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ классы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ.

ЀактичСски, Spring Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ использованиС Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° слуТб, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½ΡƒΡŽ ΠΈ ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΎΠΌ слуТб. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΎΠ± этом здСсь .

ServiceLoader большС ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π½Π°ΠΉΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ смоТСм Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Π΅Π΅ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² Π½Π΅ΠΉ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ. МладшиС программисты ΠΈΠ½ΠΎΠ³Π΄Π° ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ ΡΠΌΠ΅ΡˆΠΈΠ²Π°ΡŽΡ‚ ΠΈΡ…, ΠΈ это Π½Π΅ Π±Π΅Π· ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹: ΠΎΠ½ΠΈ сильно связаны.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠ·-Π·Π° этого Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я Π²ΠΈΠ΄Π΅Π», Π½Π΅ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΊΡƒ ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΈ прилоТСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Spring для поиска ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΈ это просто Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ. Π₯отя это ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΆΠΈΡ‚ΡŒ с Π½ΠΈΠΌ ΠΈ Π±Ρ‹Ρ‚ΡŒ счастливыми. ΠœΡ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈΡ…. Они Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ сидят Π½Π° простой строкС XML-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ прилоТСния Spring.

ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ абстракции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ, Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ абстрактным.

Π”Π°, это ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ являСтся ΠΏΠ΅Ρ€Π΅Ρ„Ρ€Π°Π·ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ высказывания, приписываСмого Π­ΠΉΠ½ΡˆΡ‚Π΅ΠΉΠ½Ρƒ. Если Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅ ΠΎΠ± этом, Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ это ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ β€” Π½Π΅ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ KISS (ΠΏΡƒΡΡ‚ΡŒ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ простым ΠΈ Π³Π»ΡƒΠΏΡ‹ΠΌ). Код, Π° Π½Π΅ Π²Ρ‹.

ServiceLoader Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ класса. НС всС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π° ΠΏΡƒΡ‚ΠΈ ΠΊ классам. Он Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Β«Ρ€Π΅ΠΊΠ»Π°ΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡΒ». (Π― расскаТу ΠΏΠΎΠ·ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«Ρ€Π΅ΠΊΠ»Π°ΠΌΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉΒ».) ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° Java Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Ρ‡Π΅Ρ€Π΅Π· всС классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ находятся Π² ΠΏΡƒΡ‚ΠΈ ΠΊ классам, ΠΈΠ»ΠΈ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚?

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΠΏΡƒΡ‚ΠΈ ΠΊ классам

Π­Ρ‚ΠΎΡ‚ Ρ€Π°Π·Π΄Π΅Π» Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ обходится, Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ServiceLoader Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π΄Π°ΠΆΠ΅ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ обсудим, ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Код Java Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ классов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список всСх классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ находятся Π² ΠΏΡƒΡ‚ΠΈ ΠΊ классам. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ я Π»Π³Ρƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Spring просматриваСт классы ΠΈ автоматичСски Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ² Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. ВСсна Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΠ±ΠΌΠ°Π½Ρ‹Π²Π°Π΅Ρ‚. Π― расскаТу Π²Π°ΠΌ, ΠΊΠ°ΠΊ это происходит. Пока Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ·Π½Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡƒΡ‚ΡŒ ΠΊ классам Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ просмотрСн. Если Π²Ρ‹ посмотритС Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ класса ClassLoader Π²Ρ‹ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π» массив, ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ»ΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ классов. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ массив ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², Π½ΠΎ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ классы Π΄Π°ΠΆΠ΅ ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ².

ΠŸΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ этому являСтся ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ абстракции Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Java ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ классы. Π—Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ классов Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ классы Π² JVM, ΠΈ JVM всС Ρ€Π°Π²Π½ΠΎ ΠΎΡ‚ΠΊΡƒΠ΄Π°. Π­Ρ‚ΠΎ Π½Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ фактичСскиС классы находятся Π² Ρ„Π°ΠΉΠ»Π°Ρ…. Π•ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ классы, Π° Π½Π΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°. На самом Π΄Π΅Π»Π΅, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ классы с Ρ€Π°Π·Π½Ρ‹Ρ… носитСлСй. Π’Π°ΠΊΠΆΠ΅ ваши ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²Ρ‹ просто Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π½Π°Ρ‚ΡŒ это. Π’Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ использовали Spring, Hibernate ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ? Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· этих срСд ΡΠΎΠ·Π΄Π°ΡŽΡ‚ прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π²ΠΎ врСмя выполнСния ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· памяти, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ классов. Π—Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ классов Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, созданный ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΡƒΡ‚ΡŒ ΠΊ классам Π½Π΅ являСтся статичСским. Для этих ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΎΠ² классов Π΄Π°ΠΆΠ΅ Π½Π΅ сущСствуСт classpath. Они находят классы динамичСски.

Π›Π°Π΄Π½ΠΎ. Π₯ΠΎΡ€ΠΎΡˆΠΎ сказано ΠΈ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описано. Но ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅: ΠΊΠ°ΠΊ Spring Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ классы? ВСсна Π½Π° самом Π΄Π΅Π»Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ смСлоС ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ классов являСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ: URLClassLoader . ( Как ΠΏΠΈΡˆΠ΅Ρ‚ Николай ΠŸΠ°Ρ€Π»ΠΎΠ³ Π² своСй ΡΡ‚Π°Ρ‚ΡŒΠ΅, с Java 9 это ΡƒΠΆΠ΅ Π½Π΅ Ρ‚Π°ΠΊ.) Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с classpath, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит URL-адрСса, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ массив URL-адрСсов.

ServiceLoader Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ прСдполоТСния ΠΈ поэтому Π½Π΅ просматриваСт классы.

Как ServiceLoader Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ класс

ServiceLoader ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляры классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ интСрфСйс. Когда ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ ServiceLoader.load(interfaceKlass) , ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ «список» классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ этот интСрфСйс. Π― использовал «список» ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ тСхничСски ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ экзСмпляр ServiceLoader , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сам Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Iterable поэтому ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ экзСмпляры классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ интСрфСйс. Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ выполняСтся Π² Ρ†ΠΈΠΊΠ»Π΅ for вызывая ΠΌΠ΅Ρ‚ΠΎΠ΄ load() послС двоСточия (:).

Для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ поиска экзСмпляров Ρ„Π°ΠΉΠ»Ρ‹ JAR, содСрТащиС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ META-INF/service ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя интСрфСйса. Π”Π°, Π² ΠΈΠΌΠ΅Π½ΠΈ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΈ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°, Π½ΠΎ, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, это Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ тСкстовый Ρ„Π°ΠΉΠ». Он Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс Π² этом Ρ„Π°ΠΉΠ»Π΅ JAR.

ServiceLoader Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ findResources для получСния URL-адрСсов Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ считываСт ΠΈΠΌΠ΅Π½Π° классов, Π° Π·Π°Ρ‚Π΅ΠΌ снова Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ ClassLoader для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ этих классов. ΠšΠ»Π°ΡΡΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ конструктор с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ServiceLoader ΠΌΠΎΠ³ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ….

НаличиС Π² этих Ρ„Π°ΠΉΠ»Π°Ρ… ΠΈΠΌΠ΅Π½ классов для совмСщСния Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ классов ΠΈ создания экзСмпляров с использованиСм Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ рСсурсов Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ это Π½Π΅ слишком элСгантно.
Java 9, сохраняя Π½Π°Π΄ΠΎΠ΅Π΄Π»ΠΈΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ META-INF/services прСдставила Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π‘ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Jigsaw Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ дСскрипторы ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. ΠœΠΎΠ΄ΡƒΠ»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ сСрвис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ServiceLoader ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ сСрвисы Π΅ΠΌΡƒ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· ServiceLoader . Π­Ρ‚ΠΎΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ способ обнаруТСния Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйса слуТбы пСрСмСщаСтся ΠΈΠ· тСкстовых рСсурсов Π² ΠΊΠΎΠ΄ Java. Чистым прСимущСством этого являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ошибки кодирования, связанныС с Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π²ΠΎ врСмя компиляции ΠΈΠ»ΠΈ Π²ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ модуля, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ сбой ΠΊΠΎΠ΄Π°.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Π΅Ρ‰ΠΈ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌΠΈ ΠΈΠ»ΠΈ просто ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… бСсполСзно Π±ΠΎΠ»Π΅Π΅ слоТными (Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚), Java 9 Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ссли класс Π½Π΅ являСтся Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ интСрфСйса слуТбы, Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ public static provider() ΠΌΠ΅Ρ‚ΠΎΠ΄ public static provider() ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ экзСмпляр класса ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс. (ΠœΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΡ‡ΠΈΠΌ, Π² этом случаС класс ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°ΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс слуТбы, Ссли ΠΎΠ½ этого Ρ…ΠΎΡ‡Π΅Ρ‚, Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, это Ρ„Π°Π±Ρ€ΠΈΠΊΠ°, Ρ‚Π°ΠΊ Π·Π°Ρ‡Π΅ΠΌ это Π΄Π΅Π»Π°Ρ‚ΡŒ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° SRP.)

ΠžΠ±Ρ€Π°Π·Π΅Ρ† ΠΊΠΎΠ΄Π°

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Maven с https://github.com/verhas/module-test .

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ содСрТит Ρ‚Ρ€ΠΈ модуля Consumer , Provider ΠΈ ServiceInterface . ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ServiceLoader ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ слуТбу, которая опрСдСляСтся интСрфСйсом javax0.serviceinterface.ServiceInterface Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ ServiceInterface ΠΈ рСализуСтся Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Provider . Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρƒ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ рисункС:

Π€Π°ΠΉΠ»Ρ‹ module-info содСрТат объявлСния:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

module Provider {

Β Β Β Β requires ServiceInterface;

Β Β Β Β provides javax0.serviceinterface.ServiceInterface

Β Β Β Β Β Β with javax0.serviceprovider.Provider;

}

Β 

module Consumer {

Β Β Β Β requires ServiceInterface;

Β Β Β Β uses javax0.serviceinterface.ServiceInterface;

}

Β 

module ServiceInterface {

Β Β Β Β exports javax0.serviceinterface;

}

Π›ΠΎΠ²ΡƒΡˆΠΊΠΈ

Π—Π΄Π΅ΡΡŒ я расскаТу Π²Π°ΠΌ ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π³Π»ΡƒΠΏΡ‹Ρ… ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΠ» Π²ΠΎ врСмя создания этого ΠΎΡ‡Π΅Π½ΡŒ простого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° ΠΌΠΎΠΈΡ… ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, Π° Π½Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ ΠΈΡ…. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ Java 9 Π² ServiceLoader ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ гласит:

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ссли слуТба Π½Π΅ находится Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ прилоТСния, Ρ‚ΠΎ объявлСниС модуля Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ require, которая ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ экспортируСт слуТбу.

Π― Π½Π΅ знаю, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ…ΠΎΡ‡Π΅Ρ‚ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚ для мСня, Π½Π΅ соотвСтствуСт Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, я Π½Π΅Π²Π΅Ρ€Π½ΠΎ истолковал это ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ вСроятно.

Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Consumer ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π½Π΅Ρ‡Ρ‚ΠΎ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅Π΅ интСрфСйс javax0.serviceinterface.ServiceInterface . Π­Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, Π½Π° самом Π΄Π΅Π»Π΅ являСтся ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ Provider ΠΈ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, Π½ΠΎ ΠΎΠ½ΠΎ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя выполнСния ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΎ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ подходящСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ½ нуТдаСтся Π² интСрфСйсС ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ require Π² ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ модуля, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ трСбуСтся ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ServiceInterface . Для этого Π½Π΅ трСбуСтся ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Provider ! ΠœΠΎΠ΄ΡƒΠ»ΡŒ Provider Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ зависит ΠΎΡ‚ модуля ServiceInterface ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. ΠœΠΎΠ΄ΡƒΠ»ΡŒ ServiceInterface Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚. Он экспортируСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚, содСрТащий интСрфСйс.

Π’Π°ΠΊΠΆΠ΅ Π²Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Provider Π½ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Consumer Π½Π΅ обязаны ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚. Provider прСдоставляСт сСрвис, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ интСрфСйсом ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ классом, Π½Π°Π·Π²Π°Π½Π½Ρ‹ΠΌ Π² Ρ‡Π΅ΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова with Π² Ρ„Π°ΠΉΠ»Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ модуля. Он прСдоставляСт этот СдинствСнный класс для всСго ΠΌΠΈΡ€Π° ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ большС. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ этот класс, Π±Ρ‹Π»ΠΎ Π±Ρ‹ излишним ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚, содСрТащий Π΅Π³ΠΎ, ΠΈ это, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, излишнС ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΎ Π±Ρ‹ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅, Π½ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ. Consumer вызываСтся ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° –m , ΠΈ ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ экспортировал ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚.
Команда, ΠΊΠ°ΠΊ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ

1

2

3

4

java -p Consumer/target/Consumer-1.0.0-SNAPSHOT.jar:

Β Β ServiceInterface/target/ServiceInterface-1.0.0-SNA

Β Β PSHOT.jar:Provider/target/Provider-1.0.0-SNAPSHOT.

Β Β jar -m Consumer/javax0.serviceconsumer.Consumer

ΠΈ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ послС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ установки mvn . ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½ компилятора maven Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ вСрсии 3.6, ΠΈΠ½Π°Ρ‡Π΅ ServiceInterface-1.0.0-SNAPSHOT.jar Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΏΡƒΡ‚ΠΈ ΠΊ классам вмСсто ΠΏΡƒΡ‚ΠΈ ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ Π²ΠΎ врСмя компиляции, ΠΈ Π²ΠΎ врСмя компиляции Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π° информация ΠΎ module-info.class Ρ„Π°ΠΉΠ» module-info.class .

Какой смысл

ServiceLoader ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ модулям Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя выполнСния. Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ являСтся ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ. Π― сам столкнулся с этим ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π» ScriptBasic для Java с Java 7 Π½Π° Java 9. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ языка BASIC ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ классами, содСрТащими общСдоступныС статичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΈ ΠΈΡ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ BasicFunction . Π’ послСднСй вСрсии Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ хост-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ встраивало ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π² список всСх классов Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… API Π² ΠΊΠΎΠ΄Π΅. Π­Ρ‚ΠΎ лишнСС ΠΈ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. ServiceLoader ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ слуТбы, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ интСрфСйс ( ClassSetProvider ) ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² основной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π° Π·Π°Ρ‚Π΅ΠΌ основная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ слуТбы ΠΎΠ΄Π½Ρƒ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ классы, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ Π² Π½Π°Π±ΠΎΡ€Π°Ρ…. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, хост-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ классах Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ, достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ классы Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π»ΠΈΡΡŒ Π² ΠΏΡƒΡ‚ΡŒ модуля ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… прСдоставлял услугу.

Π‘Π°ΠΌ JDK Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для опрСдСлСния мСстополоТСния рСгистраторов. Новый Java 9 JDK содСрТит класс System.LoggerFinder ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΊΠ°ΠΊ сСрвис Π»ΡŽΠ±Ρ‹ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ, ΠΈ Ссли Π΅ΡΡ‚ΡŒ рСализация, ServiceLoader ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ System.getLogger() ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°ΠΉΠ΄Π΅Ρ‚ это. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ привязано ΠΊ JDK, Π½Π΅ привязано ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π²ΠΎ врСмя компиляции. Достаточно ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ рСгистратор Π²ΠΎ врСмя выполнСния ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈ JDK Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ срСдство вСдСния ΠΆΡƒΡ€Π½Π°Π»Π°.

Π‘ΠΎ всСми этими измСнСниями Π² ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ сСрвисов ΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ Π΅Π³ΠΎ Π² язык, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ поддСрТиваСтся ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ рСсурсов, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π΄Π΅ΡΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ этот Ρ‚ΠΈΠΏ обнаруТСния сСрвисов ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΈΠΌΠΏΡƒΠ»ΡŒΡ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎΠΌ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π΅, ΠΊΠ°ΠΊ ΠΎΠ½ использовался Ρ€Π°Π½Π΅Π΅.

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ Π½Π° Java Code Geeks с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠŸΠΈΡ‚Π΅Ρ€Π° ВСрхаса, ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€Π° нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ JCG . Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ здСсь: Java 9 Module Services

МнСния, высказанныС участниками Java Code Geeks, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈΡ… собствСнными.

Π‘Π°Π½Π΄Π΅Ρ€ Мак ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΊ Java-модулям β€” JUG.ru

Π’Ρ‹ΡˆΠ»Π° Java 10 β€” Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Java 9! Π¨ΡƒΡ‚ΠΊΠΈ ΡˆΡƒΡ‚ΠΊΠ°ΠΌΠΈ, Π½ΠΎ с Π½Π΅Ρ‚ΠΎΡ€ΠΎΠΏΠ»ΠΈΠ²ΠΎΡΡ‚ΡŒΡŽ индустрии сСйчас Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΏΠΎΡ€Ρƒ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Jigsaw: ΡˆΡƒΠΌΠΈΡ…Π° Π²ΠΎΠΊΡ€ΡƒΠ³ Π½ΠΈΡ… Π±Ρ‹Π»Π° Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ Π³ΠΎΠ΄Ρƒ, Π° Π²ΠΎΡ‚ ΠΏΠΎ-настоящСму ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π·Π°Π΄ΡƒΠΌΠ°ΡŽΡ‚ΡΡ ΡƒΠΆΠ΅ Π² этом.

Π’ Π½ΠΎΠ²ΠΎΠΌ выпускС подкаста InfoQ Π½Π° вопросы ΠΎ модулях ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ» Π‘Π°Π½Π΄Π΅Ρ€ Мак β€” соавтор ΠΊΠ½ΠΈΠ³ΠΈ Β«Java 9 modularityΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° этой Ρ‚Π΅ΠΌΠ΅ ΠΏΠ΅Ρ‡Π΅Π½ΡŒΠΊΡƒ съСл. А Ρƒ нас Π½Π° ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ JPoint ΠΎΠ½ ΠΊΠ°ΠΊ Ρ€Π°Π· выступит с Ρ‚Π΅ΠΌΠΎΠΉ Β«Designing for modularity with Java modulesΒ». И ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ пСрСвСсти Π½Π° русский Ρ‡Π°ΡΡ‚ΡŒ сказанного Π² подкастС: Ссли Π²Ρ‹ Π½Π΅ слСдили ΠΏΡ€ΠΈΡΡ‚Π°Π»ΡŒΠ½ΠΎ Π·Π° модулями, ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ быстро ΠΏΠΎΠ½ΡΡ‚ΡŒ Π³Π»Π°Π²Π½ΠΎΠ΅, Π° Ссли сами Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π½Π° JPoint β€” станСт «прСдисловиСм» ΠΊ Π΄ΠΎΠΊΠ»Π°Π΄Ρƒ.

β€” Java-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π² ΠΌΠΈΡ€Π΅ порядка ΡˆΠ΅ΡΡ‚ΠΈ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ², Π½ΠΎ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всС ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Java 9. Будя ΠΏΠΎ вашим наблюдСниям, насколько Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ люди пСрСходят Π½Π° Π½Π΅Ρ‘?

β€” Π”Π°, Π΄ΡƒΠΌΠ°ΡŽ, ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· особого риска ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠ· этих ΡˆΠ΅ΡΡ‚ΠΈ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² Π½Π° «дСвяткС» сСйчас ΠΌΠ΅Π½ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ. На Java 8 люди ΠΏΡ€Ρ‹Π³Π°Π»ΠΈ довольно быстро, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²ΠΈΠ΄Π΅Π»ΠΈ лямбды ΠΈ стримы, Π° это ΠΎΡ‡Π΅Π½ΡŒ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΠΈΡ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ просто Π±Ρ€Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. А с Java 9 ситуация другая. Мало Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΅Ρ‘ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π΄ΠΎΠ»Π³ΠΎ ΠΆΠ΄Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ Π΅Ρ‰Ρ‘ ΠΈ главная Ρ„ΠΈΡ‡Π° Π² Π²ΠΈΠ΄Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы β€” совсСм Π½Π΅ такая, ΠΊΠ°ΠΊ лямбды ΠΈ стримы. Она большС ΠΏΡ€ΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΎΠ½Π° влияСт Π½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ инструмСнты β€” Π² ΠΎΠ±Ρ‰Π΅ΠΌ, это Ρ„ΠΈΡ‡Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ трСбуСтся ΠΊΡƒΠ΄Π° большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ мСня Π½Π΅ удивляСт, Ρ‡Ρ‚ΠΎ люди Π½Π΅ ΠΏΡ€Ρ‹Π³Π°ΡŽΡ‚ Π½Π° Java 9 Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠ»ΠΈ Π½Π° Java 8. Ну ΠΈ Π΅Ρ‰Ρ‘ сказываСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Oracle Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊ Π²Ρ‹Ρ…ΠΎΠ΄Π° вСрсий Π½Π° ΠΏΠΎΠ»ΡƒΠ³ΠΎΠ΄ΠΎΠ²ΠΎΠΉ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Java 9 ΡƒΠΆΠ΅ оказываСтся смСнСна Java 10. ΠšΠΎΠΌΡŒΡŽΠ½ΠΈΡ‚ΠΈ Π΅Ρ‰Ρ‘ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ эту Π½ΠΎΠ²ΡƒΡŽ схСму, ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ ΠΈ людям Π½Π°Π΄ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊ со всСм этим Π±Ρ‹Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΡƒΠΆΠ΅ Π² сСнтябрС Java 11 Π²Ρ‹ΠΉΠ΄Π΅Ρ‚. По-ΠΌΠΎΠ΅ΠΌΡƒ, ΠΈΠ·-Π·Π° этого люди ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ заняли Π²Ρ‹ΠΆΠΈΠ΄Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ.

И это ΠΏΠ΅Ρ‡Π°Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ измСнСния ΠΌΠ΅ΠΆΠ΄Ρƒ Java 8 ΠΈ 9 довольно большиС β€” ΠΈ ΠΈΠ·-Π·Π° модуляризации, ΠΈ ΠΈΠ·-Π·Π° ΠΊΡƒΡ‡ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΠΈΡ‡, это большой Ρ€Π΅Π»ΠΈΠ·. Если Π²Ρ‹ Π΄ΠΎ сих ΠΏΠΎΡ€ Π½Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ с Π½ΠΈΠΌ, ΠΏΠΎ-ΠΌΠΎΠ΅ΠΌΡƒ, Π²Ρ‹ ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ сСбС мСдвСТью услугу. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅-Ρ‚Π°ΠΊΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ β€” Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ Ρ…ΠΎΡ‚ΡŒ 9, Ρ…ΠΎΡ‚ΡŒ 10, Ρ…ΠΎΡ‚ΡŒ 11 β€” Π²Ρ‹ всё Ρ€Π°Π²Π½ΠΎ ΡΡ‚ΠΎΠ»ΠΊΠ½Ρ‘Ρ‚Π΅ΡΡŒ с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΡƒΠΆΠ΅ сСйчас.

β€” Π₯ΠΎΡ€ΠΎΡˆΠ΅Π΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. К словам ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ лямбды ΠΈ стримы ΠΌΠ°Π½ΠΈΠ»ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²: Π° Π² случаС с модуляризациСй Π² Ρ‡Ρ‘ΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ главная Π²Ρ‹Π³ΠΎΠ΄Π°? Она явно Π΄Π΅Π»Π°Π΅Ρ‚ всё мСньшС, Π½ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Ρ‚Π°ΠΊ Π²Π°ΠΆΠ½ΠΎ?

β€” Ну, я Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ Π² Π½Π΅ΠΉ Β«Π΄Π΅Π»Π°Ρ‚ΡŒ всё мСньшС», я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ β€” Π΄Π΅Π»Π°Ρ‚ΡŒ всё Π±ΠΎΠ»Π΅Π΅ управляСмым ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌ. ΠœΠΎΠ΄ΡƒΠ»ΡΡ€ΠΈΠ·Π°Ρ†ΠΈΡ β€” это, ΠΏΠΎ сути, Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ стоит ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с большими ΠΊΠΎΠ΄ΠΎΠ²Ρ‹ΠΌΠΈ Π±Π°Π·Π°ΠΌΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, стартуя с чистого листа, ΠΏΠΎΠ½Π°Ρ‡Π°Π»Ρƒ всё Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈ Ρ„ΠΈΡ‡ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΠ΄Π½Π° Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ врСмя ΡƒΠΏΠΈΡ€Π°Π΅ΡˆΡŒΡΡ Π² стСну. Кодовая Π±Π°Π·Π° становится Π³ΠΎΡ€Π°Π·Π΄ΠΎ слоТнСС β€” Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Π΅Ρ€Π΅Π· Π³ΠΎΠ΄, ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· Π΄Π²Π°, ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅, Π½ΠΎ настаёт ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° Π΅Ρ‘ всё слоТнСС ΠΈ слоТнСС ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ, Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΠΈΡ‡ΠΈ Π±Π΅Π· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π΄Π΅-Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ сломалось. И Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘ ΡƒΠΆΠ΅ слоТно.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρƒ Java-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅ Π±Ρ‹Π»ΠΈ инструмСнты для Ρ‚Π°ΠΊΠΎΠ³ΠΎ. ΠŸΡ€ΠΈ ΠΈΡ… Π³Ρ€Π°ΠΌΠΎΡ‚Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΈ ΠΏΡ€ΠΈ осознании стоящих Π·Π° Π½ΠΈΠΌΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠ³ΠΎ. Но Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΅ΡΡ‚ΡŒ «родная» ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Π°Ρ систСма, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰Π°Ρ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, Π° инкапсуляция Ρ‚ΡƒΡ‚ Π²Π°ΠΆΠ½Π°. Если Π·Π°Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ ΠΎ модуляризации β€” ΠΎΠ½Π° ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΡΡ‚Π°Ρ‚ΡŒ Π²Π΅Ρ‰ΠΈ. Если Π²Ρ‹ прячСтС Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ выставляСтС Π½Π°Ρ€ΡƒΠΆΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ API, это ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ «внутрСнности» Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρƒ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π΅ΡΡ‚ΡŒ явно прописанныС зависимости, ΠΎΠ½ΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‚, ΠΊΠ°ΠΊΠΈΠ΅ Π΅Ρ‰Ρ‘ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈΠΌ Π½ΡƒΠΆΠ½Ρ‹, ΠΈ это Π·Π½Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использовано Ρ‚ΡƒΠ»ΠΈΠ½Π³ΠΎΠΌ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, компилятором ΠΈΠ»ΠΈ Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠΎΠΌ β€” Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ всё Π½Π° мСстС.

И это большой шаг Π²ΠΏΠ΅Ρ€Ρ‘Π΄ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΌ classpath. Π£ JAR-Ρ„Π°ΠΉΠ»ΠΎΠ² Π² classpath Π½Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ зависимостях, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΈ это даст ΠΎ сСбС Π·Π½Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅. А ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, любой ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ класс Π² JAR-Ρ„Π°ΠΉΠ»Π΅ Π²ΠΈΠ΄Π΅Π½ Π»ΡŽΠ±ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠΌΡƒ классу Π² classpath. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ модуляризация ΠΈ привносит ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽ, ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΈ Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ софт.

β€” Но Ρ‚ΠΎ, ΠΎ Ρ‡Ρ‘ΠΌ Π²Ρ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅, Π·Π²ΡƒΡ‡ΠΈΡ‚ подходящим для Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². А Ссли сСйчас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ запущСнная Π½Π° Β«Π²ΠΎΡΡŒΠΌΡ‘Ρ€ΠΊΠ΅Β» систСма, Ρ‚ΠΎ Π²Ρ‹Π³ΠΎΠ΄Π° ΠΎΡ‚ Π΅Ρ‘ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° «дСвятку» Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π°. Π§Ρ‚ΠΎ ΠΌΠΎΠ³Ρƒ Π²Ρ‹ΠΈΠ³Ρ€Π°Ρ‚ΡŒ? Π‘ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ быстрСС запуск? Π‘ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ мСньшС ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π°Ρ‚Π°ΠΊΠΈ, Ρ€Π°Π· Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π²Π΅Ρ‰ΠΈ Π²Ρ€ΠΎΠ΄Π΅ CORBA?

β€” ΠžΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎ, это большС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Π½ΠΎΠ²Ρ‹ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌ, Π° ΠΌΠΈΠ³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΊΠΎΠ΄ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ слоТно. Но с ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ Π½Π° Java 9 Π΄Π°ΠΆΠ΅ Π±Π΅Π· ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΡˆΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ прСимущСства. НапримСр, сборщиком мусора ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ стал G1GC, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ, ΠΈ Π΅ΡΡ‚ΡŒ Compact Strings β€” Ссли Π² вашСм ΠΊΠΎΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ASCII-строк, ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠΆΠ΅ упомянули, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ сам JDK модуляризован, ΠΈ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ Π²Ρ…ΠΎΠ΄ΠΈΠ²ΡˆΠΈΠ΅ Π² состав JDK Π²Π΅Ρ‰ΠΈ Π²Ρ€ΠΎΠ΄Π΅ CORBA ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ статус deprecated ΠΈ deprecated for removal (Β«Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… вСрсиях»), Π° ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ (Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π·Π° Π΄ΠΎΠ»Π³ΠΎΠ΅ врСмя). Но Ρ‚ΡƒΡ‚ Π΅ΡΡ‚ΡŒ ΠΈ обратная сторона: Ссли вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΠ΅ ΡˆΡ‚ΡƒΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚, Ρ‚ΠΎ Ρƒ вас Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

β€” ΠŸΡ€ΠΎ Β«Π²ΠΎΠΎΠ±Ρ‰Π΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΎΒ» β€” Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ, ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Oracle ΠΈΠΌΠ΅Π½Π½ΠΎ Π² этой вСрсии Ρ€Π΅ΡˆΠΈΠ»ΠΈΡΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ?

β€” Если ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ помню, ΡƒΠ΄Π°Π»ΠΈΠ»ΠΈ ΡˆΠ΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², связанных с PropertyChangeListener. И это связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ β€” Ρ‡Π°ΡΡ‚ΡŒ JavaBeans, Π° JavaBeans ΠΏΠΎΠΏΠ°Π»ΠΈ Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒ java.desktop. Π§Ρ‚ΠΎ довольно странно, Π½ΠΎ это лСгаси, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π°ΠΌ ΠΆΠΈΡ‚ΡŒ. И ΠΏΡ€ΠΈ этом, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρƒ java.util.logging.LogManager Π±Ρ‹Π» ΠΌΠ΅Ρ‚ΠΎΠ΄ AddPropertyChangeListener. Π§Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° всё Π² classpath β€” ΠΊΠΎΠΌΡƒ ΠΊΠ°ΠΊΠΎΠ΅ Π΄Π΅Π»ΠΎ. Но всё пСрСстаёт Π±Ρ‹Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ, ΠΊΠΎΠ³Π΄Π° Ρƒ LogManager Π² JDK Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ дСсктопного модуля: ΠΎΠ½ довольно большой ΠΈ посвящён Π²Π΅Ρ‰Π°ΠΌ Π²Ρ€ΠΎΠ΄Π΅ AWT ΠΈ Swing. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ€Π΅ΡˆΠΈΠ»Π° ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ.

Π― Π΄ΡƒΠΌΠ°ΡŽ, это Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Ρ€Π΅ΠΉΠ΄-ΠΎΡ„Ρ„Ρ‹ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΊ модулям. Π’ вашСй ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ заковыристыС зависимости, ΠΈ всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ссли просто Π·Π°ΠΊΠΈΠ΄Ρ‹Π²Π°Ρ‚ΡŒ всё Π² classpath. Но ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π½Π°Π·Π²Π°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ Π΄ΠΈΠ·Π°ΠΉΠ½ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° Ρƒ вас рСализация логирования зависит ΠΎΡ‚ дСсктопного API? Π’Π°ΠΊΠΈΠΌΠΈ вопросами стоит Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ, Π²ΠΎΡ‚ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Java 9 ΠΈ задались. Π”ΡƒΠΌΠ°ΡŽ, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΊ модулям Ρƒ людСй всплывёт ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΈΡ… скрытных ΠΈ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹Ρ… зависимостСй, указывая Π½Π° Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹Π΅ мСста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠΎΠ±Ρ‰Π΅-Ρ‚ΠΎ стоит Ρ€Π°ΡΠΏΡƒΡ‚Π°Ρ‚ΡŒ.

β€” Π§Ρ‚ΠΎ Π²Ρ‹ сСйчас Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅: ΠΊΠΎΠ³Π΄Π° люди с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ пСрСходят с Java 8 Π½Π° 9, ΠΎΠ½ΠΈ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ с classpath, ΠΈΠ»ΠΈ ΠΈΠ΄ΡƒΡ‚ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡΡ€ΠΈΠ·ΡƒΡŽΡ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅?

β€” Π― Π² основном Π²ΠΈΠΆΡƒ ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΡ…ΡΡ с classpath. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎ людям, ΠΎΠ½ΠΈ это Π·Π½Π°ΡŽΡ‚, ΠΈ Π΄Π°ΠΆΠ΅ с этим Ρƒ Π½ΠΈΡ… Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ слоТности. Если Ρƒ вас ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Java 8, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ Π½Π° 9 Π΄Π°ΠΆΠ΅ Π±Π΅Π· ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ. НапримСр, Ссли Ρƒ вас ваш ΠΊΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ API ΠΈΠ· JDK, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ оказались инкапсулированы. Вопросы Π΅ΡΡ‚ΡŒ, Π½ΠΎ ΠΎΠ½ΠΈ Ρ€Π΅ΡˆΠ°Π΅ΠΌΡ‹Π΅.

Но, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΡƒΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΡˆΡ‘Π» Π½Π° Java 9 с classpath, Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ вопросом становится Β«ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π»ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈΒ». НСт ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ подходящСго всСм сразу ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° это. Если ваша кодовая Π±Π°Π·Π° сама ΠΏΠΎ сСбС ΡƒΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ довольно ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΡƒΡŽ структуру, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Java-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, ΠΈ Π²Ρ‹Π³ΠΎΠ΄Π½ΠΎ. Но Ссли Ρƒ вас ΠΎΠ΄ΠΈΠ½ большой JAR со спагСтти-ΠΊΠΎΠ΄ΠΎΠΌ, Ρ‚ΠΎ Π²Π°ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ модулям Π±ΡƒΠ΄Π΅Ρ‚ нСпросто. ΠœΠΎΠ΄ΡƒΠ»ΠΈ β€” это Π½Π΅ какая-Ρ‚ΠΎ магичСская языковая Ρ„ΠΈΡ‡Π°, Π³Π΄Π΅ просто Π²ΡΡ‚Π°Π²Π»ΡΠ΅ΡˆΡŒ нСсколько ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов. Π­Ρ‚ΠΎ слоТная Π·Π°Π΄Π°Ρ‡Π° разбиСния вашСго ΠΊΠΎΠ΄Π° Π½Π° ΠΏΠΎΠ΄Π΄Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ нСзависимыС части. И никакая Ρ„ΠΈΡ‡Π° Π·Π° вас эту Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π΅ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π΅Ρ‚. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Ρ‚ΡƒΡ‚ Π½Π°Π΄ΠΎ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΠΎ ситуации ΠΈ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ случаС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ.

β€” ВмСстС с Java 9 появился Π΅Ρ‰Ρ‘ ΠΈ инструмСнт jlink β€” ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎ Π½Ρ‘ΠΌ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ?

β€” Π”Π°, это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ инструмСнт ΠΈΠ· JDK 9, ΠΈ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это ΠΎΡ‡Π΅Π½ΡŒ ΠΊΠ»Ρ‘Π²ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы. Битуация такая: с jlink ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ своё ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΈ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ jlink ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π· Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ° ΠΏΠΎΠ΄ вас. Π­Ρ‚ΠΎ практичСски кастомная JRE β€” содСрТит ваши ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Π΅ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈΠ· JDK, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½Ρ‹ для запуска Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ. Π­Ρ‚ΠΎ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, основано Π½Π° ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… дСскрипторах ΠΈΠ· вашСго прилоТСния.

Если Π²Π·ΡΡ‚ΡŒ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° дСсктопноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ java.desktop, зависимостями этого модуля ΠΈ ΠΊΠΎΠ΄ΠΎΠΌ самого прилоТСния. А всякого Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ ΡΡ‚Π°Ρ€ΡŒΡ Π²Ρ€ΠΎΠ΄Π΅ CORBA Ρ‚Π°ΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Если Π²Π·ΡΡ‚ΡŒ совсСм простой Java-класс, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ java.base (ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для JDK), Ρ‚ΠΎΠ³Π΄Π° вСсь ΠΎΠ±Ρ€Π°Π· Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ° получится ΠΎΠΊΠΎΠ»ΠΎ 20 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚ β€” Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ мСньшС, Ρ‡Π΅ΠΌ Ρ€Π°ΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ JDK Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. И Π΅Ρ‰Ρ‘ Π² этом процСссС ΠΊΠΎ всСм модулям ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ кэш всСх Π²Π°ΡˆΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… дСскрипторов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ ΠΈΡ… ΠΏΡ€ΠΈ запускС.

β€” Π’Ρ‹Ρ…ΠΎΠ΄ Jigsaw Π² своё врСмя оказался ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ отчасти ΠΈΠ·-Π·Π° вопросов совмСстимости с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌΠΈ систСмами Π²Ρ€ΠΎΠ΄Π΅ OSGi ΠΈ JBoss Modules. Π§Ρ‚ΠΎ с этим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ?

β€” На Java 9 ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ OSGi-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ classpath, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ JBoss. Но Ссли хочСтся ΠΏΠΎΠΉΡ‚ΠΈ дальшС, Ссли Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π΅ΡˆΡŒΡΡ ΠΎ взаимодСйствии OSGi ΠΈ Java-ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ β€” Π½Ρƒ, Π±Ρ‹Π»ΠΈ экспСримСнты, Π² основном со стороны OSGi Alliance, Π½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ подходящСго для ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½Π°. Пока Ρ‡Ρ‚ΠΎ Ρƒ Jigsaw ΠΈ OSGi Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΎΠΏΠ°. Они просто ΡΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΠΎΠ΄Π½ΠΎΠΉ сфСрС.

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ, Ссли Ρƒ вас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ OSGi-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, вряд Π»ΠΈ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° Java-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, просто Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ classpath. А Ссли Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ с нуля Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‚ΠΎΠ³Π΄Π° Ρƒ вас Π΅ΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€. Π§Ρ‚ΠΎ стоит ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅ΡΡ‚ΡŒ, зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ. Если хочСтся Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ Ρ€ΠΎΠ΄Π½ΠΎΠ³ΠΎ для ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, понятно, Ρ‡Ρ‚ΠΎ Π½Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ΡΡ Java-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. Но Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠΈ OSGi, Ρ‚Π°ΠΌ Π΅ΡΡ‚ΡŒ Π²Π΅Ρ‰ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄Π΅Ρ‚ нСпросто Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Ρ€Ρ… Java-ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. (ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ JUG.ru: Ссли Π²Ρ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ ΠΈΠ· Jigsaw ΠΈ OSGi, вас ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ видСозапись Π΄ΠΎΠΊΠ»Π°Π΄Π° Никиты Липского)

β€” Π§Π΅Π³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅ ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, ΡƒΠΆΠ΅ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ «дСвятки»?

β€” Π’ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, насколько ΠΌΠ½Π΅ извСстно, Π½Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… JEP, связанных с ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмой. Π­Ρ‚ΠΎ Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ происходит, Π½ΠΎ Π² основном космСтичСская. Но Ρ‡Π΅Π³ΠΎ я Π»ΠΈΡ‡Π½ΠΎ ΠΆΠ΄Ρƒ ΠΎΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы, Ρ‚Π°ΠΊ это вСрсионирования.

БСйчас ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Π°Ρ систСма ΠΌΠΎΠΆΠ΅Ρ‚ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вСрсии ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Π½ΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ это для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ ΠΈΠ»ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, связанных с вСрсиями. И для ΠΌΠ½ΠΎΠ³ΠΈΡ… это Π·Π²ΡƒΡ‡ΠΈΡ‚ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… систСм этим Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ. Но ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Π½Π°Π΄ Jigsaw это Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ Β«out of scopeΒ». Π£ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ систСмы сборки Π²Ρ€ΠΎΠ΄Π΅ Maven ΠΈ Gradle, Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Π΅ систСмы Π²Ρ€ΠΎΠ΄Π΅ OSGi, ΠΈ всС ΠΎΠ½ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ с вСрсиями, Π½ΠΎ Ρƒ всСх разная сСмантика, Ρ€Π°Π·Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π±Ρ€Π°Ρ‚ΡŒ ΠΈ сразу ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ Π² JDK ΠΈ Π² ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ языка Π½Π΅ Π·Π°Ρ…ΠΎΡ‚Π΅Π»ΠΈ, ΠΈ я ΠΌΠΎΠ³Ρƒ это ΠΏΠΎΠ½ΡΡ‚ΡŒ. Но Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя вСрсионированиС ΠΈ модуляризация Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΈΠ΄ΡƒΡ‚ Ρ€ΡƒΠΊΠ° ΠΎΠ± Ρ€ΡƒΠΊΡƒ, ΠΈ я надСюсь, Ρ‡Ρ‚ΠΎ это станСт Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы Π² Java.

ΠŸΠΎΡΠ»ΡƒΡˆΠ°Ρ‚ΡŒ выпуск подкаста Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π° SoundCloud, Π° ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π΄ΠΎΠΊΠ»Π°Π΄ Π‘Π°Π½Π΄Π΅Ρ€Π° ΠΎ модулях β€” 7 апрСля Π½Π° ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ JPoint.

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ шаги с Java 9 ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Jigsaw – Ρ‡Π°ΡΡ‚ΡŒ вторая

ЗдравствуйтС, Π₯Π°Π±Ρ€.

ПослС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ промСдлСния ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Jigsaw ΠΈ Java 9, Π²Ρ‹ΡˆΠ΅Π΄ΡˆΡƒΡŽ Π² Π±Π»ΠΎΠ³Π΅ Codecentric. ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΏΠ΅Ρ€Π²ΠΎΠΉ части находится здСсь.

Π­Ρ‚ΠΎ вторая Ρ‡Π°ΡΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΠΈ для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΠ±Π»ΠΈΠΆΠ΅ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Jigsaw. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ части ΠΌΡ‹ ΠΊΡ€Π°Ρ‚ΠΊΠΎ обсудили, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΈ ΠΊΠ°ΠΊ Π±Ρ‹Π»Π° модуляризована ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ срСда Java Runtime. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ рассмотрСли простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ компиляции, ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ ΠΈ запуска ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ³ΠΎ прилоТСния.

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ постараСмся ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ вопросы:

  • МоТно Π»ΠΈ ввСсти ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ смогут Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ экспортированный ΠΏΠ°ΠΊΠ΅Ρ‚?
  • Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ вСрсиями ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ модуля, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π² ΠΏΡƒΡ‚ΠΈ ΠΊ модулям?
  • Как Jigsaw взаимодСйствуСт с Π½Π΅ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌ унаслСдованным ΠΊΠΎΠ΄ΠΎΠΌ?
  • Как ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ собствСнный ΠΎΠ±Ρ€Π°Π· ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉ срСды Java?

Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ Π·Π° основу ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· части 1 ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½ΠΈΠΌ. Код ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ находится здСсь.

ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²Π° Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ модулям

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ части ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ развиваСтся Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Java Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Jigsaw. Один ΠΈΠ· ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ доступности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» упомянут, Π½ΠΎ Π½Π΅ Ρ€Π°Π·ΡŠΡΡΠ½Π΅Π½ ΠΊΠ°ΠΊ слСдуСт, Ρ‚Π°ΠΊΠΎΠ²: β€œΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Ρ‚Π΅Ρ…, Ρ‡Ρ‚ΠΎ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒβ€. Π’Π°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΊΡ€ΡƒΠ³ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ наши экспортированныС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹. Допустим, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ de.codecentric.zipvalidator
Ρ‚Π΅Ρ€ΠΏΠ΅Ρ‚ΡŒ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² de.codecentric.nastymodule
, поэтому ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ свой module-info.java
Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

module de.codecentric.zipvalidator{

    exports de.codecentric.zipvalidator.api 
        to de.codecentric.addresschecker;
}

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, лишь addresschecker
ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ API zipvalidator
. Π”Π°Π½Π½ΠΎΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ выполняСтся Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², поэтому Π½ΠΈΡ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ доступ для ΠΎΠ΄Π½ΠΈΡ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя прСдоставив ΠΏΠΎΠ»Π½Ρ‹ΠΉ доступ для Π΄Ρ€ΡƒΠ³ΠΈΡ…. Вакая ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° имСнуСтся Β«ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ экспорт». Если ΠΌΠΎΠ΄ΡƒΠ»ΡŒ de.codecentric.nastymodule
попытаСтся ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ ΠΈΠ· de.codecentric.zipvalidator.api
, Ρ‚ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ошибка компиляции:


./de.cc.nastymodule/de/cc/nastymodule/internal/AddressCheckerImpl.java:4: 
error: ZipCodeValidatorFactory is not visible 
       because package de.cc.zipvalidator.api is not visible

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ ругаСтся Π½Π° module-info.java
, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ zipvalidator
Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ ΠΌΠΎΠ³ Π±Ρ‹ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π² nastymodule
. НапримСр, ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ экспорт ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ структуру вашСго прилоТСния, Π½ΠΎ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ экспортируСмыми ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ с ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ.

ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ вСрсиями ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ

Часто случаСтся Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Ρ‡Π΅Ρ€Π΅Π· Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ зависимости Π² ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ β€” Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π²Π°ΠΆΠ΄Ρ‹ Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΡƒΡ‚ΠΈ ΠΊ модулям. Π‘Ρ€Π°Π·Ρƒ приходят Π½Π° ΡƒΠΌ Π΄Π²Π° сцСнария:

  • ΠœΠΎΠ΄ΡƒΠ»ΠΈ доступны Π²ΠΎ врСмя компиляции Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ… ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… jar, Π½ΠΎ имя Ρƒ Π½ΠΈΡ… всС Ρ€Π°Π²Π½ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅
  • Π Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ вСрсии ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ модуля ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ ΡΡ†Π΅Π½Π°Ρ€ΠΈΡŽ. Π‘ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π»ΠΈ zipvalidator
:


two-modules-multiple-versions
β”œβ”€β”€ de.codecentric.addresschecker
β”‚   β”œβ”€β”€ de
β”‚   β”‚   └── codecentric
β”‚   β”‚       └── addresschecker
β”‚   β”‚           β”œβ”€β”€ api
β”‚   β”‚           β”‚   β”œβ”€β”€ AddressChecker.java
β”‚   β”‚           β”‚   └── Run.java
β”‚   β”‚           └── internal
β”‚   β”‚               └── AddressCheckerImpl.java
β”‚   └── module-info.java
β”œβ”€β”€ de.codecentric.zipvalidator.v1
β”‚   β”œβ”€β”€ de
β”‚   β”‚   └── codecentric
β”‚   β”‚       └── zipvalidator
β”‚   β”‚           β”œβ”€β”€ api
β”‚   β”‚           β”‚   β”œβ”€β”€ ZipCodeValidator.java
β”‚   β”‚           β”‚   └── ZipCodeValidatorFactory.java
β”‚   β”‚           β”œβ”€β”€ internal
β”‚   β”‚           β”‚   └── ZipCodeValidatorImpl.java
β”‚   β”‚           └── model
β”‚   └── module-info.java
β”œβ”€β”€ de.codecentric.zipvalidator.v2
β”‚   β”œβ”€β”€ de
β”‚   β”‚   └── codecentric
β”‚   β”‚       └── zipvalidator
β”‚   β”‚           β”œβ”€β”€ api
β”‚   β”‚           β”‚   β”œβ”€β”€ ZipCodeValidator.java
β”‚   β”‚           β”‚   └── ZipCodeValidatorFactory.java
β”‚   β”‚           β”œβ”€β”€ internal
β”‚   β”‚           β”‚   └── ZipCodeValidatorImpl.java
β”‚   β”‚           └── model
β”‚   └── module-info.java

Π”ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ находятся Π² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…, Π½ΠΎ имя модуля остаСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ. Как Jigsaw Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° это Π²ΠΎ врСмя компиляции?

./de.codecentric.zipvalidator.v2/module-info.java:1: 
error: duplicate module: de.codecentric.zipvalidator

Π˜Ρ‚Π°ΠΊ, здСсь Π½Π°ΠΌ Π»Π΅Π³ΠΊΠΎ Π½Π΅ ΠΎΡ‚Π΄Π΅Π»Π°Ρ‚ΡŒΡΡ. Jigsaw Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции, ΠΊΠΎΠ³Π΄Π° Π² ΠΏΡƒΡ‚ΠΈ ΠΊ модулям ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹Ρ… модуля.

Π§Ρ‚ΠΎ насчСт Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ случая? Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² остаСтся ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΉ, Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Π° zipvalidator’а ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° (de.codecentric.zipvalidator.v{1|2}
), ΠΈ addresschecker Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΎΠ±Π° этих ΠΈΠΌΠ΅Π½ΠΈ.

module de.codecentric.addresschecker{
     exports de.codecentric.addresschecker.api;
     requires de.codecentric.zipvalidator.v1;
     requires de.codecentric.zipvalidator.v2;
}

Π‘ΠΊΠΎΡ€Π΅Π΅ всСго, ΠΈ здСсь Π½Π΅ скомпилируСтся? Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π²Π° модуля, ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹? ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, скомпилируСтся. Π― сам удивился: компилятор распознаСт Π²ΠΎΠ·Π½ΠΈΠΊΡˆΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, Π½ΠΎ ограничиваСтся лишь Ρ‚Π°ΠΊΠΈΠΌΠΈ прСдупрСТдСниями:

./de.cc.zipvalidator.v1/de/codecentric/zipvalidator/api/ZipCodeValidator.java:1: 
warning: package exists in another module: de.codecentric.zipvalidator.v2

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ с Π³ΠΎΡ‚ΠΎΠ²Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈ запустит ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Но Jigsaw явно Π½Π΅ нравится Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ Π²ΠΎ врСмя выполнСния:

java.lang.module.ResolutionException: 
Modules de.codecentric.zipvalidator.v2 and de.codecentric.zipvalidator.v1 export 
package de.codecentric.zipvalidator.api to module de.codecentric.addresschecker

МнС это каТСтся малопонятным, ΠΏΠΎ-ΠΌΠΎΠ΅ΠΌΡƒ, ΠΎΡˆΠΈΠ±ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡ„ΠΎΡ€ΠΌΠΈΡ‚ΡŒ ΠΈ ΠΏΠΎΠ°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½Π΅Π΅. Π― поинтСрСсовался Π² рассылкС, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Π½ΠΎ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π° Π΅Ρ‰Π΅ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ».

АвтоматичСскиС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ бСзымянный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ

Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Π² ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ модуляризованной срСдС. Но Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π² Ρ‚Π°ΠΊΠΈΡ… вСсьма вСроятных случаях, ΠΊΠΎΠ³Π΄Π° придСтся ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ с Π½Π΅ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌΠΈ Jar-Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ? Π—Π΄Π΅ΡΡŒ Π²ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ Π² ΠΈΠ³Ρ€Ρƒ автоматичСскиС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ бСзымянный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.

НачнСм с автоматичСских ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. АвтоматичСский ΠΌΠΎΠ΄ΡƒΠ»ΡŒ β€” это jar-Ρ„Π°ΠΉΠ», поставлСнный Π² modulepath. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ Π΅Π³ΠΎ Ρ‚ΡƒΠ΄Π° Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° Ρ‚Ρ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… вопроса ΠΎΠ± этом ΠΌΠΎΠ΄ΡƒΠ»Π΅:

Π’: Каково Π΅Π³ΠΎ имя?

О: это имя jar-Ρ„Π°ΠΉΠ»Π°. Если Π²Ρ‹ поставитС Π² ΠΏΡƒΡ‚ΡŒ ΠΊ модулям Ρ„Π°ΠΉΠ» guava.jar, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ автоматичСский ΠΌΠΎΠ΄ΡƒΠ»ΡŒ guava.

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ смоТСтС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Jar прямо ΠΈΠ· рСпозитория Maven, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ guava-18.0 Π½Π΅ являСтся допустимым ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ Java.

Π’: Π§Ρ‚ΠΎ ΠΎΠ½ экспортируСт?

О: АвтоматичСский ΠΌΠΎΠ΄ΡƒΠ»ΡŒ экспортируСт всС свои ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹. Π˜Ρ‚Π°ΠΊ, всС ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π±ΡƒΠ΄ΡƒΡ‚ доступны Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ, Ρ‡ΠΈΡ‚Π°ΡŽΡ‰Π΅ΠΌΡƒ автоматичСский ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.

Π’: Π§Ρ‚ΠΎ ΠΎΠ½ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚?

О: АвтоматичСский ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ всС (*all*) ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ доступныС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ бСзымянный, ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± этом Π½ΠΈΠΆΠ΅). Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ! Из автоматичСского модуля ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊΠΎ всСм экспортированным Ρ‚ΠΈΠΏΠ°ΠΌ любого модуля. Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½ΠΈΠ³Π΄Π΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, ΠΎΠ½ подразумСваСтся.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€. ΠœΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ com.google.common.base.Strings Π² zipvalidator-Π΅. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ доступ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π΅Π±Ρ€ΠΎ считывания для автоматичСского модуля Guava:

module de.codecentric.zipvalidator{
       exports de.codecentric.zipvalidator.api;
       requires public de.codecentric.zipvalidator.model;
       requires guava;

 }

Для компиляции потрСбуСтся ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» guava.jar Π² ΠΏΡƒΡ‚ΠΈ ΠΊ модулям (ΠΎΠ½ находится Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ../jars):


javac -d . -modulepath ../jars -modulesourcepath .  $(find . -name "*.java")

ВсС прСкрасно компилируСтся ΠΈ запускаСтся.

(ΠœΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΡ‡ΠΈΠΌ, Π±Ρ‹Π»ΠΎ Π½Π΅ Ρ‚Π°ΠΊ просто Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Работая со сборкой Jigsaw 86, я столкнулся с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ: систСма Ρ€ΡƒΠ³Π°Π»Π°ΡΡŒ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ зависимостСй ΠΎΡ‚ модуля jdk.management.resource
. Π― спросил ΠΎΠ± этом Π² рассылкС, обсуТдСниС находится здСсь.

НуТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΌΠΎΠ΅ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ я Π½Π΅ пользовался Β«Ρ€Π°Π½Π½Π΅ΠΉΒ» сборкой (early access build), Π° собирал JDK сам. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с OSX Mavericks Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ Π΅Ρ‰Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΎ Ρ‡Π΅ΠΌ написано Π² Ρ‚Ρ€Π΅Π΄Π΅, ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ makefile, Π½ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ я всС Π½Π°Π»Π°Π΄ΠΈΠ». Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ Ρ€Π΅Π»ΠΈΠ·Π°ΠΌΠΈ придСтся ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ ΡƒΠΆΠ΅ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ самоС врСмя ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒ вас с ΠΏΠ°Π»ΠΎΡ‡ΠΊΠΎΠΉ-Π²Ρ‹Ρ€ΡƒΡ‡Π°Π»ΠΎΡ‡ΠΊΠΎΠΉ, которая Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΠ° ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ Π½Π° Jigsaw. Π­Ρ‚ΠΎΡ‚ инструмСнт называСтся jdeps
. Он просматриваСт ваш нСмодуляризованный ΠΊΠΎΠ΄ ΠΈ сообщаСт Π²Π°ΠΌ ΠΎ зависимостях.

Рассмотрим guava:

jdeps -s ../jars/guava.jar

ИмССм Ρ‚Π°ΠΊΠΎΠΉ Π²Ρ‹Π²ΠΎΠ΄:

guava.jar -> java.base

guava.jar -> java.logging

guava.jar -> not found

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ автоматичСский ΠΌΠΎΠ΄ΡƒΠ»ΡŒ guava Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ java.base
, java.logging
ΠΈ … β€œΠ½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎβ€œ?! Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅? Если ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ -s
, Ρ‚ΠΎ jdeps
ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ с уровня ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈ спускаСтся Π½Π° шаг Π²Π½ΠΈΠ·, Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² (список Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ сокращСн, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Ρƒ guava довольно ΠΌΠ½ΠΎΠ³ΠΎ):

   com.google.common.xml (guava.jar)
      -> com.google.common.escape               guava.jar
      -> java.lang
      -> javax.annotation                                   not found

Π—Π΄Π΅ΡΡŒ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ com.google.common.xml
зависит ΠΎΡ‚ com.google.common.escape
, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ располоТСн Π² самом ΠΌΠΎΠ΄ΡƒΠ»Π΅, java.lang
, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ€ΠΎΡˆΠΎ извСстСн, ΠΈ ΠΎΡ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ javax.annotation
, которая Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°. Π”Π΅Π»Π°Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ jar с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ JSR-305, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π°ΠΌ содСрТится javax.annotation
(кстати, я Π±Π΅Π· Π½ΠΈΡ… ΠΎΠ±Ρ…ΠΎΠΆΡƒΡΡŒ – Π² ΠΌΠΎΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΌΠ½Π΅ Π½Π΅ трСбуСтся Π½ΠΈ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΏ ΠΈΠ· этих ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΈ Π½ΠΈ компилятор, Π½ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ срСда ΠΏΡ€ΠΈ этом Π½Π΅ Π²ΠΎΠ·Ρ€Π°ΠΆΠ°ΡŽΡ‚).

БСзымянный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ бСзымянный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ? Π’Π½ΠΎΠ²ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠΌ Π½Π° Ρ‚Ρ€ΠΈ вопроса:

Π’: Какого Π΅Π³ΠΎ имя?

О: Как Π²Ρ‹ ΡƒΠΆΠ΅ догадались, ΠΈΠΌΠ΅Π½ΠΈ Ρƒ Π½Π΅Π³ΠΎ Π½Π΅Ρ‚

Π’: Π§Ρ‚ΠΎ ΠΎΠ½ экспортируСт?

О: БСзымянный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ экспортируСт всС свои ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π»ΡŽΠ±ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ. Π­Ρ‚ΠΎ Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ модуля – Ρƒ Π½Π΅Π³ΠΎ Π½Π΅Ρ‚ ΠΈΠΌΠ΅Π½ΠΈ, ΠΈ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΅Π³ΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ! Команда requires unnamed; Π½Π΅ сработаСт.

Π’: Π§Ρ‚ΠΎ ΠΎΠ½ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚?

О: БСзымянный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ всС ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ доступныС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ.

Π˜Ρ‚Π°ΠΊ, Ссли Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ бСзымянный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΈΠ· Π»ΡŽΠ±Ρ‹Ρ… Π²Π°ΡˆΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Ρ‚ΠΎ Π² Ρ‡Π΅ΠΌ ΠΆΠ΅ ΡΡƒΡ‚ΡŒ? На этот вопрос ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ наш старый Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΉ β€” ΠΏΡƒΡ‚ΡŒ ΠΊ классам. Π›ΡŽΠ±ΠΎΠΉ Ρ‚ΠΈΠΏ, считанный ΠΈΠ· ΠΏΡƒΡ‚ΠΈ ΠΊ классам (Π° Π½Π΅ ΠΈΠ· ΠΏΡƒΡ‚ΠΈ ΠΊ модулям), автоматичСски помСщаСтся Π² бСзымянном ΠΌΠΎΠ΄ΡƒΠ»Π΅ β€” ΠΈΠ»ΠΈ, ΠΈΠ½Ρ‹ΠΌΠΈ словами, любой Ρ‚ΠΈΠΏ Π² бСзымянном ΠΌΠΎΠ΄ΡƒΠ»Π΅ загруТаСтся Ρ‡Π΅Ρ€Π΅Π· ΠΏΡƒΡ‚ΡŒ ΠΊ классам. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ бСзымянный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ всС Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊΠΎ всСм экспортированным Ρ‚ΠΈΠΏΠ°ΠΌ ΠΈΠ· любого Ρ‚ΠΈΠΏΠ°, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΏΡƒΡ‚ΡŒ ΠΊ классам. Π’ Java 9 использованиС ΠΏΡƒΡ‚ΠΈ ΠΊ классам ΠΈ ΠΏΡƒΡ‚ΠΈ ΠΊ модулям Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Ρ‚Π°ΠΊ ΠΈ совмСстно, для обСспСчСния ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости. Рассмотрим нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ нас Π΅ΡΡ‚ΡŒ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ zipvalidator, Π½ΠΎ addresschecker ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π½Π΅ модуляризован, Ρƒ Π½Π΅Π³ΠΎ Π½Π΅Ρ‚ module-info.java
. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π½Π°ΡˆΠΈΡ… исходников Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ:

one-module-with-unnamed-ok/
β”œβ”€β”€ classpath
β”‚   └── de.codecentric.legacy.addresschecker
β”‚       └── de
β”‚           └── codecentric
β”‚               └── legacy
β”‚                   └── addresschecker
β”‚                       β”œβ”€β”€ api
β”‚                       β”‚   β”œβ”€β”€ AddressChecker.java
β”‚                       β”‚   └── Run.java
β”‚                       └── internal
β”‚                           └── AddressCheckerImpl.java
β”œβ”€β”€ modulepath
β”‚   └── de.codecentric.zipvalidator
β”‚       β”œβ”€β”€ de
β”‚       β”‚   └── codecentric
β”‚       β”‚       └── zipvalidator
β”‚       β”‚           β”œβ”€β”€ api
β”‚       β”‚           β”‚   β”œβ”€β”€ ZipCodeValidator.java
β”‚       β”‚           β”‚   └── ZipCodeValidatorFactory.java
β”‚       β”‚           └── internal
β”‚       β”‚               └── ZipCodeValidatorImpl.java
β”‚       └── module-info.java

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ classpath, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ содСрТится унаслСдованный ΠΊΠΎΠ΄, завязанный Π½Π° доступ ΠΊ zipvalidator, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ modulepath, содСрТащий ΠΌΠΎΠ΄ΡƒΠ»ΡŒ zipvalidator. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ наши ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ унаслСдованный ΠΊΠΎΠ΄, Π½Π°ΠΌ потрСбуСтся ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. ΠŸΡ€ΠΎΡΡ‚ΠΎ запишСм Π΅Π΅ Π² ΠΏΡƒΡ‚ΡŒ ΠΊ классам:


javac -d classpath/de.codecentric.legacy.addresschecker  
  -classpath modulepath/de.codecentric.zipvalidator/ $(find classpath -name "*.java")

ВсС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ.

Π’ΠΎ врСмя исполнСния ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ открываСтся Π΄Π²Π΅ возмоТности. А ΠΈΠΌΠ΅Π½Π½ΠΎ:

  • Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² ΠΏΡƒΡ‚ΡŒ ΠΊ классам
  • Π‘ΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊ классам ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΊ модулям

Выбирая ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΌΡ‹, фактичСски, отказываСмся ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы. ВсС Ρ‚ΠΈΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ запишСм Π² бСзымянный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ смогут свободно ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ ΠΊ Π΄Ρ€ΡƒΠ³Ρƒ.

java -cp modulepath/de.cc.zipvalidator/:classpath/de.cc.legacy.addresschecker/
    de.codecentric.legacy.addresschecker.api.Run 76185

Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΊΠ°ΠΊ java-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ Π²Π°ΠΌΠΈ сСгодня.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, смСшанноС использованиС ΠΏΡƒΡ‚ΠΈ ΠΊ модулям ΠΈ ΠΏΡƒΡ‚ΠΈ ΠΊ классам Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ:

java -modulepath modulepath  -addmods de.codecentric.zipvalidator 
    -classpath classpath/de.codecentric.legacy.addresschecker/ 
    de.codecentric.legacy.addresschecker.api.Run

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π²Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Ρ: -classpath
ΠΈ -modulepath
. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ -addmods
– ΠΏΡ€ΠΈ смСшивании ΠΏΡƒΡ‚ΠΈ ΠΊ классам ΠΈ ΠΏΡƒΡ‚ΠΈ ΠΊ модулям, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ просто Ρ‚Π°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ… modulepath, Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· Π½ΠΈΡ… Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ доступны.

Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Π½ΠΎ здСсь Π΅ΡΡ‚ΡŒ Π·Π°Π³Π²ΠΎΠ·Π΄ΠΊΠ°! ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° вопрос β€œΡ‡Π΅Π³ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ бСзымянный ΠΌΠΎΠ΄ΡƒΠ»ΡŒβ€ β€” это β€œΠ²ΡΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ модули”. Если ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ zipvalidator Ρ‡Π΅Ρ€Π΅Π· modulepath, Ρ‚ΠΎ смоТСм Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ лишь с Π΅Π³ΠΎ экспортированными ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ. ВсС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ IllegalAccessError Π²ΠΎ врСмя исполнСния. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Π²Π°ΠΌ придСтся ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€Π°Π²ΠΈΠ» систСмы ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉ срСды ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ jlink

Достаточно ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² с модулями; появился Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π½ΠΎΠ²Ρ‹ΠΉ инструмСнт, Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ нашСго внимания. jlink
– это ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° Java 9 для создания собствСнных дистрибутивов JVM. Π‘Π°ΠΌΠΎΠ΅ интСрСсноС, Ρ‡Ρ‚ΠΎ, благодаря Π½ΠΎΠ²ΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ JDK, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ сами Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² этот дистрибутив! Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π· ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉ срСды, содСрТащий наш addresschecker, Ρ‚ΠΎ Π΄Π°Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

jlink --modulepath $JAVA9_BIN/../../images/jmods/:two-modules-ok/ 
    --addmods de.codecentric.addresschecker --output linkedjdk

Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ всСго Ρ‚Ρ€ΠΈ Π²Π΅Ρ‰ΠΈ:

  • ΠŸΡƒΡ‚ΡŒ ΠΊ модулям (Π² Ρ‚ΠΎΠΌ числС, наши ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ jmods Π² вашСм JDK – здСсь находятся стандартныС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ java)
  • ΠœΠΎΠ΄ΡƒΠ»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ваш дистрибутив
  • ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ Π²Ρ‹Π²ΠΎΠ΄Π°

Команда создаСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ структуру:

linkedjdk/

β”œβ”€β”€ bin

β”‚ β”œβ”€β”€ java

β”‚ └── keytool

β”œβ”€β”€ conf

β”‚ β”œβ”€β”€ net.properties

β”‚ └── security

β”‚ β”œβ”€β”€ java.policy

β”‚ └── java.security

└── lib

β”œβ”€β”€ classlist

β”œβ”€β”€ jli

    β”‚   └── libjli.dylib
    β”œβ”€β”€ jspawnhelper
    β”œβ”€β”€ jvm.cfg
    β”œβ”€β”€ libjava.dylib
    β”œβ”€β”€ libjimage.dylib
    β”œβ”€β”€ libjsig.diz
    β”œβ”€β”€ libjsig.dylib
    β”œβ”€β”€ libnet.dylib
    β”œβ”€β”€ libnio.dylib
    β”œβ”€β”€ libosxsecurity.dylib
    β”œβ”€β”€ libverify.dylib
    β”œβ”€β”€ libzip.dylib
    β”œβ”€β”€ modules
    β”‚   └── bootmodules.jimage
    β”œβ”€β”€ security
    β”‚   β”œβ”€β”€ US_export_policy.jar
    β”‚   β”œβ”€β”€ blacklisted.certs
    β”‚   β”œβ”€β”€ cacerts
    β”‚   └── local_policy.jar
    β”œβ”€β”€ server
    β”‚   β”œβ”€β”€ Xusage.txt
    β”‚   β”œβ”€β”€ libjsig.diz
    β”‚   β”œβ”€β”€ libjsig.dylib
    β”‚   β”œβ”€β”€ libjvm.diz
    β”‚   └── libjvm.dylib
    └── tzdb.dat

Π’ΠΎΡ‚ ΠΈ всС. Π’ OSX Mavericks всС это Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 47 MB. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€Ρ…ΠΈΠ²Π°Ρ†ΠΈΡŽ ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Π΅ возмоТности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ всС Ρ€Π°Π²Π½ΠΎ Π½Π΅ понадобятся Π½Π°ΠΌ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅. Π‘Π°ΠΌΡ‹ΠΉ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ дистрибутив, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠ½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ, получился ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:


jlink --modulepath $JAVA9_BIN/../../images/jmods/:two-modules-ok/bin 
    --addmods de.codecentric.addresschecker --output linkedjdk --exclude-files *.diz 
    --compress-resources on --strip-java-debug on --compress-resources-level 2

Π Π°Π·ΠΌΠ΅Ρ€ дистрибутива ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π΄ΠΎ 18 MB, ΠΏΠΎ-ΠΌΠΎΠ΅ΠΌΡƒ – просто Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½ΠΎ. Π’ Linux, вСроятно, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΆΠ°Ρ‚ΡŒΡΡ ΠΈ Π΄ΠΎ 13.

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅

/bin/java --listmods

Выводится список ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, содСрТащихся Π² этом дистрибутивС

de.codecentric.addresschecker
de.codecentric.zipvalidator
[email protected]

Π˜Ρ‚Π°ΠΊ, всС прилоТСния, зависящиС ΠΎΡ‚ максимального количСства этих ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° Π΄Π°Π½Π½ΠΎΠΉ JVM. Но ΠΌΠ½Π΅ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ наш основной класс для запуска этого сцСнария. Для этого я пошСл Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡƒΡ‚Π΅ΠΌ.

Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠ³ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹Π·ΠΎΠ² дСлаСтся ΠΊ jlink, ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΊ модулям Ρ‚Π°ΠΌ ΠΈΠ½ΠΎΠΉ, Π½Π΅ΠΆΠ΅Π»ΠΈ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ bin. Π­Ρ‚ΠΎΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ содСрТит ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Π΅ jar-Ρ„Π°ΠΉΠ»Ρ‹, ΠΈ jar для addresschecker Ρ‚Π°ΠΊΠΆΠ΅ содСрТит Π² своСм манифСстС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± основном классС. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° jlink ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² bin-ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ нашСй JVM:

linkedjdk/
β”œβ”€β”€ bin
β”‚   β”œβ”€β”€ de.codecentric.addresschecker
β”‚   β”œβ”€β”€ java
β”‚   └── keytool
...

Π˜Ρ‚Π°ΠΊ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. ΠšΡ€Π°ΡΠΎΡ‚Π°!

./linkedjdk/bin/de.codecentric.addresschecker 76185

Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚

76185 is a valid zip code

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ΠΎΡ‚ ΠΈ подошло ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ нашС знакомство с Jigsaw. ΠœΡ‹ рассмотрСли ряд ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ…, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Ρ‡Π΅Π³ΠΎ нСльзя ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Jigsaw ΠΈ Java 9. Jigsaw привносит ΠΊΠΎΡ€Π΅Π½Π½Ρ‹Π΅ измСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСльзя Ρ‚Π°ΠΊ запросто ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ рСсурсов try-with
. Π’Π΅ΡΡŒ наш Ρ‚ΡƒΠ»Ρ‡Π΅ΠΉΠ½ ΠΎΡ‚ сборочных инструмСнтов Π²Ρ€ΠΎΠ΄Π΅ Maven ΠΈΠ»ΠΈ Gradle Π΄ΠΎ IDE придСтся Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмС. На ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ JavaOne Π₯анс Π”ΠΎΠΊΡ‚Π΅Ρ€ ΠΈΠ· Gradle Inc. ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π» Π΄ΠΎΠΊΠ»Π°Π΄ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ написанию ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π΄Π°ΠΆΠ΅ Π½Π° Java 8 ΠΈ Π½ΠΈΠΆΠ΅. Gradle выполняСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π²ΠΎ врСмя компиляции ΠΈ Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΡ‚ΠΊΠ°Π·, Ссли Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ модуля оказываСтся Π½Π°Ρ€ΡƒΡˆΠ΅Π½Π°. Π­Ρ‚Π° (ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ) Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π±Ρ‹Π»Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² послСдний Ρ€Π΅Π»ΠΈΠ· Gradle 2.9. Нас ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΠΆΠ΄ΡƒΡ‚ интСрСсныС Π²Ρ€Π΅ΠΌΠ΅Π½Π°!

Для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ знакомства с Jigsaw вновь Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π²Π°ΠΌ домашнюю страницу Jigsaw Project, особСнно слайды ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄ΠΎΠ² ΠΎ Jigsaw с послСднСй ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ JavaOne.

ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Π΅ прилоТСния Π½Π° Java. Как? / Π‘Π»ΠΎΠ³ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π˜Π½Ρ„ΠΎΡΠΈΡΡ‚Π΅ΠΌΡ‹ Π”ΠΆΠ΅Ρ‚ / Π₯Π°Π±Ρ€

Π’ΠΎ, Ρ‡Ρ‚ΠΎ Π² Java Π½Π΅ поддСрТиваСтся ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ, извСстно всСм. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° сущСствуСт Π΄Π°Π²Π½ΠΎ, ΠΈ Π±Ρ‹Π»ΠΎ Π½Π΅ΠΌΠ°Π»ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ. Π­Ρ‚ΠΎΠΉ Ρ†Π΅Π»ΠΈ посвящСн ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Jigsaw. Π’ 2011 ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² Java 7, Π² 2014 – Π² Java 8, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π±Ρ‹Π»ΠΎ анонсировано, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅ июля 2017 Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ Java 9 с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ модуляризации. Но Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Π΄Π΅Π»Π°Ρ‚ΡŒ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ этого прСкрасного ΠΌΠΈΠ³Π°?

OSGi ΡΠΏΠ΅ΡˆΠΈΡ‚ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ

Для создания ΠΏΠΎ-настоящСму ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π½Π° языкС Java ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ OSGi (Open Services Gateway Initiative) – спСцификациСй динамичСской ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы ΠΈ сСрвисной ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ для Java-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ OSGi Alliance). Она описываСт модСль Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ПО, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ трСмя основными ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ°ΠΌΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ³ΠΎ прилоТСния. Π Π΅Ρ‡ΡŒ ΠΎΠ± инкапсуляции (ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ скрываСт свою Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΡ‚ внСшнСго окруТСния), слабой связности (ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠ³ΠΎΠ²ΠΎΡ€Π΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²) ΠΈ динамичности (ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π½Π° Π»Π΅Ρ‚Ρƒ, Π±Π΅Π· остановки всСго прилоТСния). Основой ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ OSGi ΡΠ²Π»ΡΡŽΡ‚ΡΡ 2 сущности: Π½Π°Π±ΠΎΡ€Ρ‹ (Bundles) ΠΈ сСрвисы (Services).

Bundles

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ПО Π½Π° Java, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ сторонниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π’ ΠΌΠΈΡ€Π΅ Java-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ JAR (Java ARchive) β€’ ΠΎΠ±Ρ‹ΠΊΠ½ΠΎΠ²Π΅Π½Π½Ρ‹ΠΉ ZIP-Π°Ρ€Ρ…ΠΈΠ², содСрТащий Java-классы (Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .class). ΠŸΡ€ΠΈ этом использованиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сопряТСно с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ слоТностями.

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, Π²Π°ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, становятся доступны всС классы Π² Π½Π΅ΠΉ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ возмоТности ΡΠΏΡ€ΡΡ‚Π°Ρ‚ΡŒ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΡ… Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ прСдполагался для примСнСния Π²Π½Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈ использовании Π½ΠΎΠ²ΠΎΠΉ вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ»ΠΈ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ Π΅Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

Другая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° – Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ JAR Hell, ΠΎΠ± ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сломали Π½Π΅ΠΌΠ°Π»ΠΎ ΠΊΠΎΠΏΠΈΠΉ. Π‘ΡƒΡ‚ΡŒ Π΅Π³ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ: ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии ΠΎΠ΄Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (Ρ‚Π°ΠΊΠΎΠ΅ случаСтся Π² Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‚ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ), Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ класс ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² Ρ€Π°Π·Π½Ρ‹Ρ… вСрсиях Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Java ΠΆΠ΅ устроСна Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ использована пСрвая вСрсия Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°ΠΉΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ классов. Π’Π΅ΠΌ самым, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΡΡŒ Π² ΠΊΠΎΠ΄Π΅ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Π»ΠΈΠ±ΠΎ классу Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ΡΡŒ, Π½Π΅ сущСствуСт. Бвязано это с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° этапС выполнСния Java Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, которая Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌ случаС.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ OSGi Π½Π΅ стали ΠΌΠ΅Π½ΡΡ‚ΡŒ структуру JAR-Ρ„Π°ΠΉΠ»ΠΎΠ² для обСспСчСния ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π° просто Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² Π½ΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ срСдой OSGi. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ, информация эта Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ влияСт Π½Π° использованиС JAR-Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Java-прилоТСниях. Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ JAR-Ρ„Π°ΠΉΠ» стал OSGi-Π½Π°Π±ΠΎΡ€ΠΎΠΌ, Π² Π½Π΅Π³ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Export-Package (ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ этого Π½Π°Π±ΠΎΡ€Π°, доступныС для использования Π²Π½Π΅ Π΅Π³ΠΎ) ΠΈ Import-Package (ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ², Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ этого Π½Π°Π±ΠΎΡ€Π°). ΠŸΡ€ΠΈ этом Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π²Π΅Ρ€ΡΠΈΡŽ API, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°Π±ΠΎΡ€ прСдоставляСт для Π΄Ρ€ΡƒΠ³ΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ², Ρ‚Π°ΠΊ ΠΈ Π²Π΅Ρ€ΡΠΈΡŽ ΠΈΠ»ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ вСрсий API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π±ΠΎΡ€ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ для своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΡ‚ Π½ΠΈΡ… ΠΆΠ΅. ВсС классы Π½Π°Π±ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ находятся Π² Π΅Π³ΠΎ экспортируСмой сСкции, Π½Π΅ доступны Π²Π½Π΅ Π½Π°Π±ΠΎΡ€Π° (Private). Π’Π°ΠΊΠΈΠΌ способом OSGi-Π½Π°Π±ΠΎΡ€ выполняСт Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ слабой связности.

БСгодня Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Java-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΡƒΠΆΠ΅ OSGi ready, Ρ‚.Π΅. содСрТат ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для возмоТности выполнСния Π² OSGi-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΌΠ°Π»ΠΎ инструмСнтов ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ для OSGi ΠΈΠ· ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… JAR-Ρ„Π°ΠΉΠ»ΠΎΠ².

Рис. 1.

Π’ OSGi ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ ситуаций JAR Hell, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ ΠΈ интСрфСйсы, прСдоставляСмыС этими Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ, ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‡Π΅Ρ‚ΠΊΠΈΠ΅ вСрсии. МоТно динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΈ Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π½Π°Π±ΠΎΡ€Ρ‹ Π²ΠΎ врСмя выполнСния. OSGi отслСТиваСт зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ ΠΈ динамичСски Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΈΡ….

Services

Π˜Ρ‚Π°ΠΊ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ OSGi-Π½Π°Π±ΠΎΡ€ΠΎΠ² ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Π΅ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ посрСдством интСрфСйсов (API). Но Π³Π΄Π΅ Π²Π·ΡΡ‚ΡŒ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ интСрфСйс? Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ Β«Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² API Π½Π°Π±ΠΎΡ€Π°Β» Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ – Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ΠΌΡ‹ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈΡΡŒ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ классы Π½Π°Π±ΠΎΡ€ΠΎΠ² Π²Π½Π΅ этих Π½Π°Π±ΠΎΡ€ΠΎΠ². Π”Ρ€ΡƒΠ³ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ β€’ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ шаблон Β«Ρ„Π°Π±Ρ€ΠΈΠΊΠ°Β», рСализуя интСрфСйс, ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² API Π½Π°Π±ΠΎΡ€Π°. Но ΠΈ ΠΎΠ½ΠΎ Π½Π΅ слишком ΡƒΠ΄Π°Ρ‡Π½ΠΎ, Ρ‚.ΠΊ. для сокрытия Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйса придСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ класс.

Поиск Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйса Π² OSGi осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рССстра сСрвисов. Π’ этом рССстрС Π½Π°Π±ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ с ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΌ Π΅Ρ‘ интСрфСйсом. Набор, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π°, ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ Π² рССстрС Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π΅ΠΌΡƒ интСрфСйса. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π°Π±ΠΎΡ€Ρ‹ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ сСрвисы ΠΏΡ€ΠΈ запускС Π² OSGi-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅. Плюс ΠΊΠΎ всСму Π² рССстрС сСрвисов ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ зарСгистрированы ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ интСрфСйсы с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ рСализациями ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ, Π½Π°Π±ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π² рССстрС Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ подходящий ΠΈΠ· прСдставлСнных сСрвисов.

Рис. 2.

ΠœΠΈΠΊΡ€ΠΎΡΠ΅Ρ€Π²ΠΈΡΡ‹ Java Virtual Machine

ΠœΠΈΠΊΡ€ΠΎΡΠ΅Ρ€Π²ΠΈΡΠ½Π°Ρ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° прСдставляСт собой Π½Π°Π±ΠΎΡ€ нСзависимых ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ – ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ВзаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ происходит посрСдством Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… интСрфСйсов с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ лСгковСсных ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² (REST, Protocol Buffers, MQ ΠΈ Ρ‚.Π΄.). По Ρ„Π°ΠΊΡ‚Ρƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ – это микросСрвис, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈ содСрТащий, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, минимальноС количСство ΠΊΠΎΠ΄Π°. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ПО:

  • Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒ (ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ микросСрвиса рСализуСтся лишь ΠΎΠ΄Π½Π° Ρ‡Π°ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹).
  • простота Π·Π°ΠΌΠ΅Π½Ρ‹ (Ссли сСрвис Π½Π΅ справляСтся со своСй Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π±Π΅Π· остановки Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ПО).
  • ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС (микросСрвис ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΎΠ½ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚).

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ OSGi Π΄Π°Π²Π½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ всСми этими прСимущСствами, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Java. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ с OSGi, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ сСрвис Π² рССстр, являСтся микросСрвисом Π²Π½ΡƒΡ‚Ρ€ΠΈ Java Virtual Machine, JVM (Π² ΠΌΠΈΡ€Π΅ OSGi Ρ‚Π°ΠΊΠΈΠ΅ микросСрвисы Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Β΅Services).

Red Hat JBoss Fuse

ΠœΡ‹ Π² Β«Π”ΠΆΠ΅Ρ‚Π΅Β» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ всС прСимущСства OSGi ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ПО для Ρ‚Π΅Π»Π΅ΠΊΠΎΠΌ-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², страховых, процСссинговых ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ. Для этого ΠΌΡ‹ примСняСм Red Hat JBoss Fuse (конфигурация Fuse Fabric). Π­Ρ‚Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° прСдоставляСт Π³ΠΈΠ±ΠΊΡƒΡŽ OSGi-срСду для выполнСния ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ³ΠΎ прилоТСния.

ΠΠ΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния, Π»Π΅Π³ΠΊΠΎΠ΅ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, простота развСртывания, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ срСдств управлСния кластСром для кластСрного ПО – всС эти возмоТности доступны Π² Fuse Fabric. ВСхнология позволяСт Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ нСсколько экзСмпляров Red Hat JBoss Fuse ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΈΡ… Π² кластСр, Π° Ρ‚Π°ΠΊΠΆΠ΅ прСдоставляСт Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ инструмСнт управлСния ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅ΠΉΡΡ срСдой.

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… Fuse Fabric ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ абстракции:

Π€ΠΈΡ‡ΠΈ (features) – ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ OSGi-Π½Π°Π±ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π».
ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈ (profiles) – ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Ρ„ΠΈΡ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ настройки для Π½Π°Π±ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ входят Π² Ρ„ΠΈΡ‡Ρƒ.
ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ (containers) – ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ JVM-процСссы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΡƒΠ·Π»Π΅ кластСра Fuse Fabric ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Red Hat JBoss Fuse.

Рис. 3.

Π›ΡŽΠ±ΠΎΠ΅ ПО Π½Π° Π±Π°Π·Π΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Fuse Fabric состоит ΠΈΠ· OSGi-Π½Π°Π±ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Ρ„ΠΈΡ‡ΠΈ ΠΈ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ JVM-процСсса Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΡƒΠ·Π»Π°Ρ… кластСра Π² соотвСтствии с Π·Π°Ρ€Π°Π½Π΅Π΅ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΌ.

Π‘Ρ€Π΅Π΄Π° Fuse Fabric Π΄Π°Π΅Ρ‚ мноТСство инструмСнтов для Π»Π΅Π³ΠΊΠΎΠ³ΠΎ управлСния ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ кластСром. МоТно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ (Π° Π½Π° ΠΈΡ… основС β€’ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹), ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ/ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ/Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ/ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Π½Π° любом хостС, входящСм Π² кластСр, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΡƒΠ·Π»Ρ‹ кластСра ΠΈ Ρ‚.Π΄. И всС это online – Π±Π΅Π· прСрывания функционирования ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ² кластСра. Π•ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ нСсколько вСрсий ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ, Ρ„ΠΈΡ‡, OSGi-Π½Π°Π±ΠΎΡ€ΠΎΠ².

Благодаря Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Distributed OSGi, Π² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ срСдС OSGi-Π½Π°Π±ΠΎΡ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊ ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΈ Π΄Π°ΠΆΠ΅ Ρ€Π°Π·Π½Ρ‹Ρ… хостов. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ (ΠΏΡ€ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Ρ‚Ρ€Π°Ρ‚Π°Ρ… Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ) ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ сСрвис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт OSGi-Π½Π°Π±ΠΎΡ€, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π² REST/web-сСрвис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ· Π²Π½Π΅ΡˆΠ½ΠΈΡ… систСм.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Fuse Fabric, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΌΠΈΠΊΡ€ΠΎΡΠ΅Ρ€Π²ΠΈΡΠ½ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ, которая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ простоту настройки ΠΈ развСртывания, ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ сСрвисов Π² Ρ€Π°ΠΌΠΊΠ°Ρ… своих JVM-процСссов (со своими спСцифичными настройками, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ настройками сборщика мусора), ΠΏΡ€ΠΈ этом сСрвисы Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΠΏΠΎ сСти с использованиСм лСгковСсного ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°.

Π’.ΠΊ. ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ Red Hat JBoss Fuse основан Π½Π° Open Source стСкС Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ Apache ServiceMix, Π² нашСм распоряТСнии Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΌΠΎΡ‰Π½Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, ΠΊΠ°ΠΊ Apache ActiveMQ (рСализация спСцификации JMS), Apache Camel (рСализация шаблонов ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ), Apache CXF (Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ REST/web-сСрвисов), Blueprint (прСдоставляСт возмоТности внСдрСния зависимостСй), Spring ΠΈ Ρ‚.Π΄. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ бСсшовно ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ собой Π² Red Hat JBoss Fuse, это Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сниТаСт врСмя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π°.

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ экспСртами Π¦Π΅Π½Ρ‚Ρ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Β«Π˜Π½Ρ„ΠΎΡΠΈΡΡ‚Π΅ΠΌΡ‹ Π”ΠΆΠ΅Ρ‚Β».

JAVA 9. Π§Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ? / Π‘Π»ΠΎΠ³ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ OTUS. Онлайн-ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ / Π₯Π°Π±Ρ€

Java β€” ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ язык программирования. На сСгодняшний дСнь насчитываСтся ΠΎΠΊΠΎΠ»ΠΎ 6.5 ΠΌΠ»Π½ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Java ΠΏΠΎ всСму ΠΌΠΈΡ€Ρƒ. И всС благодаря Π΅Π³ΠΎ утилитарности, простотС использования, бСзопасности ΠΈ нСзависимости ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ (ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²Π½Π΅ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠ΅ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ опСрационная систСма ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ).

Java Π±Ρ‹Π»Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° Π² 1995 Π³ΠΎΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Sun Microsystems ΠΈ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ создавалась для ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ тСлСвидСния ΠΈ программирования Π±Ρ‹Ρ‚ΠΎΠ²Ρ‹Ρ… элСктронных устройств. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ· Java 1.0 выявил смСну фокуса Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-использованиС, ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΠ² Π΅Π³ΠΎ Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ· самых популярных языков программирования.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, со Π²Ρ€Π΅ΠΌΠ΅Π½ 1.0 ΠΌΠ½ΠΎΠ³ΠΎΠ΅ измСнилось ΠΈ Π²ΠΎΡ‚ Π½Π°ΠΊΠΎΠ½Π΅Ρ† послС мноТСства пСрСносов 21 сСнтября 2017 Π³ΠΎΠ΄Π° состоялся Ρ€Π΅Π»ΠΈΠ· Java 9.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ (8-ΠΉ) вСрсии благодаря своСй ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ прСдоставили Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для самых Ρ€Π°Π·Π½Ρ‹Ρ… сСкторов бизнСса, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ„ΠΈΠ½Ρ‚Π΅Ρ…, Π·Π΄Ρ€Π°Π²ΠΎΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ индустрии. Π‘Ρ€Π΅Π΄ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΠΉ Java 8 слСдуСт ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ лямбда-выраТСния, стримы ΠΈ измСнСния Π² API.

Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Java 9 Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ·ΠΎΠ±ΠΈΠ»ΡƒΠ΅Ρ‚ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ β€œΠΏΠΎΠ΄ капотом” ΠΈ Π² API. ΠšΡ€ΠΎΠΌΠ΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Jigsaw, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π»ΠΎΠΆΠ΅Π½Π° ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΡŽ модулярности Π² основныС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Java, новая вСрсия ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ…Π²Π°ΡΡ‚Π°Ρ‚ΡŒΡΡ Π΅Ρ‰Ρ‘ трСмя Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ Ρ„ΠΈΡ‡Π°ΠΌΠΈ:

  1. Полная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° HTTP 2.0: Вопрос Π² скорости, ΠΈ HTTP 2.0 прСдоставляСт Π±ΠΎΠ»Π΅Π΅ высокиС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, ΠΊΠΎΠ»Π΅Π±Π»ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΎΡ‚ 11.81% Π΄ΠΎ 47.7% ΠΏΠΎ сравнСнии с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ HTTP 1.1.
  2. Jshell: Новый инструмСнт ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Если Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Ρ…ΠΎΡ‡Π΅Ρ‚ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ нСсколько строк Java, Ρ‚ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π±Π΅Π· нСобходимости Π·Π°Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ всС Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.
  3. Microbenchmark: Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… частСй ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ стандартизированным ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ. Анализ JMH Π·Π° наносСкунды ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ для Java 9.

Π‘ ΠΏΠΎΠ»Π½Ρ‹ΠΌ списком совСтуСм ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ Π½Π° ΠΏΠΎΡ€Ρ‚Π°Π»Π΅ сообщСства Java, Π° Ρ‚Π°ΠΊΠΆΠ΅ свободно ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ дистрибутив для ознакомлСния.

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ Π±Π»ΠΈΠΆΠ΅ рассмотрим нСсколько Ρ„ΠΈΡ‡, ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Π²ΡˆΠΈΡ… Π² Java 8.

HTTP/2 ΠΊΠ»ΠΈΠ΅Π½Ρ‚

Π­Ρ‚ΠΎ, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, самоС ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ β€” HTTP ΠΊΠ»ΠΈΠ΅Π½Ρ‚ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΊΠ°ΠΊ HTTP/2 ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°, Ρ‚Π°ΠΊ ΠΈ WebSocket. Π’Π΅Π΄ΡŒ SPDY ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΎΡ‚ Google, Π½Π° Π±Π°Π·Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ основан HTTP/2 ΡƒΠΆΠ΅ дСмонстрируСт ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π°Ρ€Π°Π²Π½Π΅ с Netty ΠΈΠ»ΠΈ Jetty, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° (ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π° запрос/ΠΎΡ‚Π²Π΅Ρ‚), Π° Ρ‚Π°ΠΊΠΆΠ΅ Push-ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ сСрвСра, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ рСсурсы ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Π±Π΅Π· явного запроса.

Новый API прСдставлСн ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ½ΠΊΡƒΠ±Π°Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для Java β€” ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ Ρ„ΠΈΡ‡Π°, которая ΠΏΡ€ΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎΠΌ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠΈ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ появится Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ вСрсии (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Java 10), Π»ΠΈΠ±ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½Π°. НСобычный ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ для Java, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ поощряСт экспСримСнты, Π½ΠΎ ΠΏΡ€ΠΈ этом Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости.

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Jigsaw

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Jigsaw (Π² ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ β€œΠ³ΠΎΠ»ΠΎΠ²ΠΎΠ»ΠΎΠΌΠΊΠ°β€) Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΡΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ Java. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ разбиваСтся Π½Π° части ΠΈ организуСтся ΠΏΠΎ модулям Π² зависимости ΠΎΡ‚ Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ эти ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚. Π­Ρ‚ΠΎ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΈΡ… ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ. Π§Ρ‚ΠΎ Π²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈ ΠΎΡ‚Π»Π°ΠΆΠ΅Π½Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ПО. Π­Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Java 9 ΠΎΡ‚ Java 8.

Π’Ρ‚ΠΎΡ€ΠΎΠ΅ большоС прСимущСство β€” Java Platform становится Π»Π΅Π³Ρ‡Π΅ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ. Π­Ρ‚ΠΎ позволяСт Java-прилоТСниям Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ Π½Π° устройствах с Π½ΠΈΠ·ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ трСбуСтся мСньшС рСсурсов). Π­Ρ‚ΠΎ большоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ особСнно Π² контСкстС ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π° Π²Π΅Ρ‰Π΅ΠΉ (IoT). Π¨Π°Π³ Π²ΠΏΠ΅Ρ€Π΅Π΄ для Java, ΠΈ шанс ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ большС IoT-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, написанных Π½Π° этом языкС.

Jshell

Jshell Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΈ популяризируСт ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Java ΠΊ REPL (Read-Eval-Print-Loop). Π­Ρ‚ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ инструмСнт, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСбольшиС части ΠΊΠΎΠ΄Π° Π±Π΅Π· нСобходимости ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ классы. Он оснащСн функциями истории ΠΈ автозаполнСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ рядом Π΄Ρ€ΡƒΠ³ΠΈΡ… особСнностСй, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ сохранСниС ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ написанных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, Ссли захочСтся Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ нСсколько строк Java ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ придСтся Π·Π°Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄. Π§Ρ‚ΠΎ касаСтся Ρ‚ΠΎΡ‡Π΅ΠΊ с запятой β€” ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎ Π½ΠΈΡ…: Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² REPL для популярных IDE ΠΈΠ»ΠΈ Π²Π΅Π±-консоли Java REPL, Π½ΠΎ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ… Π½Π΅ являСтся ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ.

Π£Π½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ JVM

Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Сдиная систСма протоколирования всСх JVM-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ссли ΠΌΡ‹ посмотрим Π½Π° ΠΏΠ»ΡŽΡΡ‹ ΠΈ минусы Java 9, Π²ΠΎΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ…. Π’Ρ‹Π·ΠΎΠ²Ρ‹ протоколирования ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² JVM ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚, Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Java-ΠΊΠΎΠ΄Π° Π² Java Development Kit

G1 β€” Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΉ сборщик мусора

ΠžΡ‡Π΅Π½ΡŒ часто сталкиваСмся с Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² Java Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ сборщик мусора, хотя ΠΏΠΎ Ρ„Π°ΠΊΡ‚Ρƒ ΠΈΡ… 4. Parallel / Throughput Collector считался Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΌ Π² ΠΏΡ€ΠΎΡˆΠ»Ρ‹Ρ… вСрсиях, Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΅Π³ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΠ» G1, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» прСдставлСн Π² Java 7 ΠΈ Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ для Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΊΡƒΡ‡ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π±ΠΎΠ»Π΅Π΅ 4GB. Он Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ мСньшС GC ΠΏΠ°ΡƒΠ·, Π½ΠΎ Ссли ΠΎΠ½ΠΈ всС ΠΆΠ΅ происходят, Ρ‚ΠΎ длятся дольшС.

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ с ΠΌΡƒΠ»ΡŒΡ‚ΠΈ-Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ

Π­Ρ‚ΠΎΡ‚ API позволяСт ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ Π² Π΅Π΄ΠΈΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΠ»ΠΈ всС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ обновлСния API: Concurrency ΠΈ Stack Walking

Java 9 ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ CompletableFuture ΠΈ java.util.concurrent.Flow. Flow β€” это Java-рСализация Reactive Streams API. Reactive Streams ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ back-pressure β€” накоплСния большого количСства Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ происходит, ΠΊΠΎΠ³Π΄Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ получСния входящих событий Π²Ρ‹ΡˆΠ΅, Ρ‡Π΅ΠΌ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ появлСнию Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ concurrency, CompletableFuture ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ€Π΅ΡˆΠΈΠ»ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, выявлСнныС послС Π΅Π³ΠΎ внСдрСния Π² Java 8. Оно Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ ΠΈ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ΠΎΠ², ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ подклассов ΠΈ нСсколько ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

Π’Π°ΠΊΠΆΠ΅ хочСтся ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΎ Stack Walking API. ВсС Π²Π΅Ρ€Π½ΠΎ, Java 9 мСняСт ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ со стСк-трСйсами, прСдоставляя ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ способ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ стСк-трСйсов, вмСсто приравнивания ΠΈΡ… ΠΊ простому тСксту.

Immutable List, Set, Map, ΠΈ Map.Entry API

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ мноТСств ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… элСмСнтов Π² Java 8 Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк ΠΊΠΎΠ΄Π°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· самых врСмязатратных нСдостатков Java 8 Π±Ρ‹Π» устранСн. Π­Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с массивами ΠΈ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° Java 9

Π”Π΅Ρ‚Π°Π»ΠΈ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΉ Java 9 ΠΎΡ‚ Java 8 ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ большой интСрСс для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈ для бизнСса, находящСгося Π² поискС Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ. НововвСдСния дСвятой вСрсии ΡƒΠ»ΡƒΡ‡ΡˆΠ°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ аспСкты Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ:

  • Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π²Ρ‹ΡˆΠ΅ благодаря ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° HTTP/2.
  • ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ становятся рСсурсоэффСктивнСй, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Π° Π½Π΅ всю JRE.
  • Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ускоряСтся благодаря систСмС ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ ΠΈΡ… ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС, ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΡƒΡŽ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅.
  • ΠŸΠΎΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… частСй ΠΊΠΎΠ΄Π° благодаря Microbenchmarks.
  • ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π° ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠΉ строчкой ΠΊΠΎΠ΄Π°.

THE END

Π’ΠΎΡ‚ такая Π²Ρ‹ΠΆΠΈΠΌΠΊΠ° всСх интСрСсных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ послС Π²Ρ‹Ρ…ΠΎΠ΄Π° Π½ΠΎΠ²ΠΎΠΉ вСрсии. ΠŸΡ€Π°Π²Π΄Π°, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π³Π»Π°Π²Π½Ρ‹ΠΉ вопрос Π² Ρ‚ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π½Π°Ρ‡Π½ΡƒΡ‚ Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ Π΅Ρ‘, учитывая, Ρ‡Ρ‚ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΡ‚ΠΎ Π΅Ρ‰Ρ‘ ΠΈ Π²ΠΎΡΡŒΠΌΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚. Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΠΎΠΊΠ° Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π½Π΅ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ курса (Π½Π΅ считая ΠΌΠ΅Π»ΠΊΠΎΠΉ космСтики) ΠΈ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ всё ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ, Π° ΡƒΠΆΠ΅ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π³ΠΎΠ΄Ρƒ Π·Π°Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ насчёт этого.

ΠœΠΎΠ΄ΡƒΠ»ΠΈ Java 9 — JournalDev

ΠœΠΎΠ΄ΡƒΠ»ΠΈ Java 9 — ΠΎΠ΄Π½ΠΎ ΠΈΠ· самых Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² структурС java. Π—Π΄Π΅ΡΡŒ я ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ Π΄Π°Ρ‚ΡŒ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π° высоком ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎ Β«ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмС Java 9Β».

ΠœΠΎΠ΄ΡƒΠ»ΠΈ Java 9

ΠœΡ‹ рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π΅ΠΌΡ‹ ΠΎ систСмС ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Java 9.

  1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅
  2. Java SE 9: Jigsaw Project
  3. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ систСмы Java?
  4. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы Java SE 9
  5. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ JDK 8 ΠΈ JDK 9
  6. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Java 9?
  7. ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ½ΡΠΊΠ°Ρ систСма ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Java 9
  8. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ прилоТСния Java 8 ΠΈ Java 9

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠšΠΎΡ€ΠΏΠΎΡ€Π°Ρ†ΠΈΡ Oracle пСрСнСсла выпуск Java 9 с ΠΌΠ°Ρ€Ρ‚Π° 2017 Π³ΠΎΠ΄Π° Π½Π° сСнтября 2017 Π³ΠΎΠ΄Π° .

Как ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Java SE 8 поставляСтся с трСмя большими Π½ΠΎΠ²Ρ‹ΠΌΠΈ функциями (плюс Π΅Ρ‰Π΅ нСсколько ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ ΠΈ Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ).

  1. Лямбда-выраТСния
  2. Stream API
  3. Date API

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ Java SE 9 поставляСтся с трСмя большими функциями (плюс Π΅Ρ‰Π΅ нСсколько ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ ΠΈ Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ):

  1. БистСма ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Java (ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Jigsaw)
  2. Java REPL
  3. Milling Project Coin

Π’ этом постС ΠΌΡ‹ обсудим основы ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Oracle Jigsaw.

Java SE 9: Jigsaw Project

Jigsaw Project прСдставляСт ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ Java SE 9: ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½Π°Ρ систСма Java .

Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ большой ΠΈ прСстиТный ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΡ‚ Oracle Corp Π² вСрсии Java SE 9. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΎΠ½ΠΈ Π½Π°Ρ‡Π°Π»ΠΈ этот ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ Java SE 7 Release. Однако с ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌΠΈ измСнСниями ΠΎΠ½ Π±Ρ‹Π» пСрСнСсСн Π½Π° Java SE 8, Π° Π·Π°Ρ‚Π΅ΠΌ снова ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½. БСйчас ΠΎΠ½ собираСтся Π²Ρ‹ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ с Java SE 9 Π² сСнтябрС 2017 Π³ΠΎΠ΄Π°.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ†Π΅Π»ΠΈ Jigsaw Project:

  • ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ JDK
  • Как ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, тСкущая систСма JDK слишком Π²Π΅Π»ΠΈΠΊΠ°.ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½ΠΈ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ сам JDK Π½Π° нСбольшиС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ряд прСимущСств (ΠΌΡ‹ скоро обсудим ΠΈΡ… Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ…).

  • ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ исходный ΠΊΠΎΠ΄
  • Π’Π΅ΠΊΡƒΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ jar исходного ΠΊΠΎΠ΄Π° слишком Π²Π΅Π»ΠΈΠΊΠΈ, особСнно rt.jar слишком Π²Π΅Π»ΠΈΠΊ, Π²Π΅Ρ€Π½ΠΎ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½ΠΈ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ исходный ΠΊΠΎΠ΄ Java Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ.

  • ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π·Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния
  • Основная Ρ†Π΅Π»ΡŒ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ — «РСструктуризация ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния JDK ΠΈ JRE для размСщСния ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉΒ».

  • Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… API
  • Основная Ρ†Π΅Π»ΡŒ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ — Β«Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… API JDK нСдоступными ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ доступными нСсколько Π²Π°ΠΆΠ½Ρ‹Ρ…, ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… APIΒ».

  • ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½Π°Ρ систСма ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Java
  • Основная Ρ†Π΅Π»ΡŒ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ — Β«ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ свои ΠΌΠΎΠ΄ΡƒΠ»ΠΈ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ своих ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ».

  • jlink: Java Linker
  • Основная Ρ†Π΅Π»ΡŒ этого инструмСнта jlink — Β«ΠŸΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ для своих ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ».

Если Π²Ρ‹ Π½Π΅ совсСм ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅ эти Π²Π΅Ρ‰ΠΈ, НЕ Π²ΠΎΠ»Π½ΡƒΠΉΡ‚Π΅ΡΡŒ. ΠœΡ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ обсудим эти ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ…, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² ΠΌΠΎΠΈΡ… ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… публикациях.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ систСмы Java?

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ обсудим Β«Π—Π°Ρ‡Π΅ΠΌ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Π°Ρ систСма Java SE 9Β», Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ систСмы Java.

БистСмы Java SE 8 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½Π΅ΠΉ вСрсии ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈΠ»ΠΈ доставкС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° основС Java.

  • ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ JDK слишком Π²Π΅Π»ΠΈΠΊ, Π΅Π³ΠΎ слоТно ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… устройств. Java SE 8 прСдставила 3 ​​типа ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹: compact1, compact2 ΠΈ compact3. Но это Π½Π΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.
  • Π€Π°ΠΉΠ»Ρ‹ JAR, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ rt.jar ΠΈ Ρ‚. Π”., Блишком Π²Π΅Π»ΠΈΠΊΠΈ для использования Π² Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… устройствах ΠΈ прилоТСниях.
  • ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ JDK слишком Π²Π΅Π»ΠΈΠΊ, наши прилоТСния ΠΈΠ»ΠΈ устройства Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.
  • Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ систСмС Java Π½Π΅Ρ‚ строгой инкапсуляции, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Β«ΠΎΠ±Ρ‰Π΅Π³ΠΎΒ» доступа слишком ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ доступ.
  • ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ JDK, JRE слишком Π²Π΅Π»ΠΈΠΊ, Π΅Π³ΠΎ слоТно Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ прилоТСния.
  • ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡƒΠ±Π»ΠΈΠΊΠ° слишком ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Π°, ΠΎΠ½ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ доступа ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ нСкритичСским API, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ sun.*, * .internal. * ΠΈ Ρ‚. Π΄.
  • ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ API, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ являСтся большой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ.
  • ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ слишком Π²Π΅Π»ΠΈΠΊΠΎ.
  • НСмного слоТно ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ связь ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ.

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ всС эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Oracle Corp собираСтся Π²Ρ‹ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ систСму Java Module Π² Java SE 9 Release.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы Java SE 9

ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½Π°Ρ систСма Java SE 9 обСспСчит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ прСимущСства

  • ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Java SE 9 Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ JDK, JRE, JAR ΠΈ Ρ‚. Π”. На Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ.Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Java-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎ ΠΌΠ°Π»Ρ‹Ρ… устройств ΠΎΡ‡Π΅Π½ΡŒ просто.
  • ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π° тСстирования ΠΈ Ρ€Π΅ΠΌΠΎΠ½Ρ‚ΠΎΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΡΡ‚ΡŒ.
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.
  • ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ общСдоступный — Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ общСдоступный, ΠΎΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΡΠΈΠ»ΡŒΠ½ΡƒΡŽ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽ. (НС Π²ΠΎΠ»Π½ΡƒΠΉΡ‚Π΅ΡΡŒ, это большая концСпция. Π‘ΠΊΠΎΡ€ΠΎ ΠΌΡ‹ рассмотрим Π΅Π΅ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…).
  • ΠœΡ‹ большС Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ нСкритичСским API.
  • ΠœΠΎΠ΄ΡƒΠ»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‡Π΅Π½ΡŒ бСзопасно ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Π΄Π΅Ρ‚Π°Π»ΠΈ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ.
  • ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ слишком ΠΌΠ°Π»ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹.
  • Π›Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ МСньшС связи ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ.
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Π΄ΠΈΠ½ΠΎΠΉ отвСтствСнности (SRP) Π»Π΅Π³ΠΊΠΎ.

Π‘ΠΊΠΎΡ€ΠΎ ΠΌΡ‹ рассмотрим всС эти ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΎΠ΄Π½Ρƒ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ JDK 8 ΠΈ JDK 9

ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ содСрТит ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС JDK. ПослС установки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния JDK 8 ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ нСсколько ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ bin, jre, lib ΠΈ Ρ‚. Π”. Π’ домашнСй ΠΏΠ°ΠΏΠΊΠ΅ Java.

Однако Oracle Corp Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π° структуру ΠΏΠ°ΠΏΠΎΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΠ°ΠΏΠΊΠΈ JDK 8:

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΠ°ΠΏΠΊΠΈ JDK 9:

Π—Π΄Π΅ΡΡŒ JDK 9 НЕ содСрТит JRE. Π’ JDK 9 JRE Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ распространСния. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС JDK 9 содСрТит Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ Β«jmodsΒ». Он содСрТит Π½Π°Π±ΠΎΡ€ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Java 9, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

Π’ JDK 9 Π±Π΅Π· rt.jar ΠΈ Π±Π΅Π· tools.jar

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•: —
На сСгодняшний дСнь Β«jmodsΒ» содСрТит 95 ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.Π’ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌ выпускС ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒΡΡ.
ΠΏΠ°ΠΏΠΊΠ° Β«jmodsΒ» доступна ΠΏΠΎ адрСсу $ {JAVA_HOME} / jmods. Они извСстны ΠΊΠ°ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ JDK.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Java 9?

ΠœΠΎΠ΄ΡƒΠ»ΡŒ — это ΡΠ°ΠΌΠΎΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π°Ρ коллСкция ΠΊΠΎΠ΄Π°, Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… рСсурсов. Π­Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ связанных ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², Ρ‚ΠΈΠΏΠΎΠ² (классов, абстрактных классов, интСрфСйсов ΠΈ Ρ‚. Π”.) Π‘ ΠΊΠΎΠ΄ΠΎΠΌ, Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ рСсурсами.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Π±ΠΎΡ€ связанного ΠΊΠΎΠ΄Π° ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Π΅Π΄ΠΈΠ½ΠΎΠΉ отвСтствСнности (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ) (SRP).

Основной Ρ†Π΅Π»ΡŒΡŽ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы Java 9 являСтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ³ΠΎ программирования Π½Π° Java.

ΠœΡ‹ обсудим Β«Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ дСскриптор модуля» ΠΈ «Как Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ JavaΒ» Π² ΠΌΠΎΠΈΡ… ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… публикациях.

ΠœΠ°Ρ‚ΡŒ систСмы ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Java 9

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Π°Ρ систСма Java 9 ΠΈΠΌΠ΅Π΅Ρ‚ 95 ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² Ρ€Π°Π½Π½Π΅ΠΌ доступС JDK. ΠšΠΎΡ€ΠΏΠΎΡ€Π°Ρ†ΠΈΡ Oracle Ρ€Π°Π·Π΄Π΅Π»ΠΈΠ»Π° jar-Ρ„Π°ΠΉΠ»Ρ‹ JDK ΠΈ спСцификации Java SE Π½Π° Π΄Π²Π° Π½Π°Π±ΠΎΡ€Π° ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.

  • ВсС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ JDK Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с Β«jdk.* Β»
  • ВсС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ спСцификаций Java SE Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с« java Β». *

ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½Π°Ρ систСма Java 9 ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Β« java.base Β». Он извСстСн ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. Π­Ρ‚ΠΎ нСзависимый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΈ НЕ зависит ΠΎΡ‚ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ зависят ΠΎΡ‚ этого модуля.

Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Β«java.baseΒ» Ρ‚Π°ΠΊΠΆΠ΅ извСстСн ΠΊΠ°ΠΊ Β«ΠœΠ°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Java 9Β».

Π­Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для всСх ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ JDK ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, опрСдСляСмых ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ прилоТСния Java 8 ΠΈ Java 9

ΠœΡ‹ ΡƒΠΆΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ мноТСство ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Java с использованиСм Java 5, 6,7 ΠΈΠ»ΠΈ 8.ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ выглядят прилоТСния Java 8 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½Π΅ΠΉ вСрсии ΠΈ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ содСрТат.

Π’ΠΊΡ€Π°Ρ‚Ρ†Π΅, я ΠΈΠ·ΠΎΠ±Ρ€Π°Π·ΠΈΠ» прилоТСния Java 8 Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

Π’ прилоТСниях Java 8 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня — это ΠΏΠ°ΠΊΠ΅Ρ‚. Он Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π°Π±ΠΎΡ€, относящийся ΠΊ Ρ‚ΠΈΠΏΠ°ΠΌ, Π² Π³Ρ€ΡƒΠΏΠΏΡƒ. Он Ρ‚Π°ΠΊΠΆΠ΅ содСрТит Π½Π°Π±ΠΎΡ€ рСсурсов.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Java 9 Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ большой Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ с этим. Он Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ прСдставил Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Β«ΠœΠΎΠ΄ΡƒΠ»ΡŒΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для группирования Π½Π°Π±ΠΎΡ€Π° связанных ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² Π³Ρ€ΡƒΠΏΠΏΡƒ.И Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ — Module Descriptor (Β«module-info.javaΒ»). Π­Ρ‚ΠΎ ΠΎΠ½ΠΎ.

ΠžΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ прилоТСния такая ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

Подобно Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ прилоТСния Java 8 ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня, прилоТСния Java 9 ΠΈΠΌΠ΅ΡŽΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•: —
ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Java 9 ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΈ ΠΎΠ΄ΠΈΠ½ дСскриптор модуля. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Java 8, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ нСсколько ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.

Π’ΠΊΡ€Π°Ρ‚Ρ†Π΅ я ΠΌΠΎΠ³Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Java 9 содСрТит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ основныС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹:

  • Один ΠΌΠΎΠ΄ΡƒΠ»ΡŒ
  • Имя модуля
  • ДСскриптор модуля
  • Набор ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²
  • Набор Ρ‚ΠΈΠΏΠΎΠ² ΠΈ рСсурсов

Π—Π΄Π΅ΡΡŒ рСсурсы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ -info.java (ДСскриптор модуля) ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ свойства ΠΈΠ»ΠΈ XML.

Π’ этом постС ΠΌΡ‹ обсудили слишком ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ. Π”ΡƒΠΌΠ°ΡŽ, этого достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ основы ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы Java 9. Π’ ΠΌΠΎΠ΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ постС ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ Π±Π°Π·ΠΎΠ²ΡƒΡŽ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ модуля.Π― Π±ΡƒΠ΄Ρƒ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ тСорСтичСскиС ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΡŽ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы Java 9 ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости.

Π­Ρ‚ΠΎ всС, Ρ‡Ρ‚ΠΎ касаСтся Ρ‚Π΅ΠΌΡ‹ Β«Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΡƒΡŽ систСму Java 9Β». ΠœΡ‹ обсудим Π΅Ρ‰Π΅ нСсколько ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ систСмы Java SE 9 Π² ΠΌΠΎΠΈΡ… ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… публикациях.

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΌΠ½Π΅, Ссли Π²Π°ΠΌ понравился ΠΌΠΎΠΉ пост ΠΈΠ»ΠΈ Ρƒ вас Π΅ΡΡ‚ΡŒ вопросы / прСдлоТСния / ошибки Ρ‚ΠΈΠΏΠ°.

Бпасибо Π·Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΈΡ… руководств.

Бчастливого обучСния Java SE 9!

Бсылка: Project Jigsaw

.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² Java 9 ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка

  1. Около
  2. ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹

  3. Для ΠΊΠΎΠΌΠ°Π½Π΄
  1. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка
    ΠžΠ±Ρ‰Π΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹

  2. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка для ΠΊΠΎΠΌΠ°Π½Π΄
    Π“Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈ дСлятся частными знаниями с ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ

  3. Вакансии
    ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ связанныС с Π½ΠΈΠΌ тСхничСскиС возмоТности ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Π½ΠΎΠ³ΠΎ роста

  4. Π’Π°Π»Π°Π½Ρ‚
    НанимайтС тСхничСских спСциалистов ΠΈ создавайтС свой Π±Ρ€Π΅Π½Π΄ работодатСля

  5. Π Π΅ΠΊΠ»Π°ΠΌΠ°
    ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³Π°ΠΌ со всСго ΠΌΠΈΡ€Π°

  6. О компании

.

Как ΠΌΠ½Π΅ Π½Π°Π·Π²Π°Ρ‚ΡŒ ΠΌΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Java 9?

ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка

  1. Около
  2. ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹

  3. Для ΠΊΠΎΠΌΠ°Π½Π΄
  1. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка
    ΠžΠ±Ρ‰Π΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹

  2. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка для ΠΊΠΎΠΌΠ°Π½Π΄
    Π“Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈ дСлятся частными знаниями с ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ

  3. Вакансии
    ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ связанныС с Π½ΠΈΠΌ тСхничСскиС возмоТности ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Π½ΠΎΠ³ΠΎ роста

  4. Π’Π°Π»Π°Π½Ρ‚
    НанимайтС тСхничСских спСциалистов ΠΈ создавайтС свой Π±Ρ€Π΅Π½Π΄ работодатСля

  5. Π Π΅ΠΊΠ»Π°ΠΌΠ°
    ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³Π°ΠΌ со всСго ΠΌΠΈΡ€Π°

  6. О компании

.

Бколько бСзымянных ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ создано Π² Java 9?

ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка

  1. Около
  2. ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹

  3. Для ΠΊΠΎΠΌΠ°Π½Π΄
  1. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка
    ΠžΠ±Ρ‰Π΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹

  2. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка для ΠΊΠΎΠΌΠ°Π½Π΄
    Π“Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈ дСлятся частными знаниями с ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ

  3. Вакансии
    ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ связанныС с Π½ΠΈΠΌ тСхничСскиС возмоТности ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Π½ΠΎΠ³ΠΎ роста

  4. Π’Π°Π»Π°Π½Ρ‚
    НанимайтС тСхничСских спСциалистов ΠΈ создавайтС свой Π±Ρ€Π΅Π½Π΄ работодатСля

  5. Π Π΅ΠΊΠ»Π°ΠΌΠ°
    ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³Π°ΠΌ со всСго ΠΌΠΈΡ€Π°

  6. О компании

.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *