Статьи

NetBeans 9 Ранний доступ

Java 9 не за горами, как и NetBeans 9. В этой статье мы увидим поддержку, которую ранний доступ NetBeans 9 предоставляет разработчикам для создания приложений, совместимых с Java 9.

Java 9 предоставляет множество (около 90) новых функций, включая модули и JShell, Read-Eval-Print-Loop (REPL) и многие другие. Дополнительную информацию вы можете найти в ссылках в конце этой статьи и особенно в этой ссылке о поддержке NetBeans 9 для JDK 9.

В этой статье мы научимся:

  1. скачать и собрать Java 9 EA из исходников
  2. скачать и собрать советник NetBeans 9 из исходников
  3. использовать JShell REPL от советника NetBeans 9
  4. создавать и создавать модули и зависимости между ними с помощью советника NetBeans 9, чтобы сделать нашу жизнь проще

1. Сборка OpenJDK 9 EA

OpenJDK является эталонной реализацией любых предложений по расширению JDK (JEP) или даже запросов спецификации Java (JSR). У вас может быть много причин, по которым вы хотите собрать его из исходников и не загружать один из готовых двоичных файлов , например:

  • политика компании, которая заставляет вас создавать проекты с открытым исходным кодом из источника
  • Вы хотите получить доступ к последнему раннему доступу OpenJDK
  • Вы хотите сборку для своей специальной платформы

Конечно, вы можете продолжить эту статью, загрузив предварительно собранный бинарный файл. Но если вы хотите узнать, как собрать JDK 9, продолжайте чтение. Создание своего собственного образа JDK дает ряд преимуществ, например, вам не нужно ничего устанавливать или изменять, например, реестр Windows или панель настроек Java в MacOS, уничтожая ваш текущий JDK по умолчанию (см., Например, эту статью ). Исполняемые файлы всегда будут создаваться в одном и том же месте, и, обновляя свой репозиторий и восстанавливая исходные коды, вы всегда сможете получить последнюю версию.

Вы можете скачать последние версии OpenJDK 9 с этой страницы. Источники можно найти в репозиториях Mercurial . Например, OpenJDK 9 репозиториев здесь ; Проект Jigsaw Repo содержит передний край модульной реализации, если вы хотите быть передовым. Ниже вы получите несколько советов о том, как собрать OpenJDK 9.

  1. Клонируйте ртутный репозиторий JDK 9 Master .
  2. Прочитайте файл README или README-builds.html для получения дополнительных инструкций.
  3. Следующий шаг перед началом сборки — выполнить: bash get_source.sh или ./get_source.sh если ваша оболочка уже является bash. Очень важно после каждого обновления вызывать эту команду. Причина в том, что hg update только главный репозиторий. OpenJDK состоит из нескольких ртутных репозиториев, которые также необходимо обновить. Это можно сделать с помощью команды get_source.sh .
  4. ./configure --disable-warnings-as-errors
  5. sudo make all

Приведенные выше команды создают последнюю версию OpenJDK. Если вы хотите собрать более раннюю версию OpenJDK, вам нужно следовать этим советам:

  1. hg up [tag] например jdk-9+147
  2. cd corba
  3. hg up [tag] например jdk-9+147
  4. Повторите шаги 2 и 3 для каталогов: hotspot, jaxp, jaxws, jdk, langtools, nashorn
  5. ./configure --disable-warnings-as-errors
  6. sudo make clean
  7. sudo make all

build/<platform_dir>/jdk файлы создаются в build/<platform_dir>/jdk , например, если вы используете Mac в build/macosx-x86_64-normal-server-release/jdk .

2. Соберите и настройте советник NetBeans 9

Вы можете загрузить последнюю версию NetBeans с поддержкой JDK 9 с http://wiki.netbeans.org/ JDK9Support или собрать ее из источников:

  1. hg clone http://hg.netbeans.org/main
  2. cd main
  3. hg clone http://hg.netbeans.org/main/contrib
  4. cd ..
  5. ant

Двоичный nbbuild/netbeans создается в nbbuild/netbeans . Сконфигурируйте его для работы с советником JDK 8 или JDK 9 ( etc/netbeans.conf ). jshell для включения jshell необходимо настроить NetBeans 9 с помощью советника JDK 9. Поэтому отредактируйте etc/netbeans.conf чтобы он указывал на советник JDK 9, созданный на шаге 1:

netbeans_jdkhome="<path to OpenJDK 9 EA>/build/<platform_dir>/jdk"

Сделайте резервную копию этого файла, потому что в следующий раз, когда вы создадите NetBeans, он будет переопределен, и вам придется повторить эту модификацию снова.

Запустите netbeans, введя команду: bin/netbeans или bin\netbeans.exe зависимости от вашей платформы. Зарегистрируйте последнюю сборку JDK 9 EA в качестве платформы Java в NetBeans с помощью Tools | Платформы Java | Добавьте платформу (см. Рис. 1) и выберите советник OpenJDK 9, созданный на шаге 1.

Рис. 1. Добавление платформы JDK 9 EA в советник NetBeans 9

3. Поддержка JShell в советнике NetBeans 9

Если вы запустили NetBeans 9 с реализацией JDK 9, вы можете получить доступ к JShell из меню Сервис | Откройте оболочку платформы Java . JShell работает так же, как из командной строки, и дополнительно с ним работают сочетания клавиш NetBeans (например, sout --> (tab) ). Вы можете прочитать больше о JShell в ресурсах.

Рис. 2 - JShell в советнике NetBeans 9

Рис. 2 — JShell в советнике NetBeans 9

4. Поддержка модулей в советнике NetBeans 9

Советник NetBeans 9 предоставляет ряд полезных вещей, которые помогут вам в ваших модульных проектах. Прежде чем продолжить, вы должны настроить JDK 9 EA Platform в разделе Инструменты | Платформы Java | Добавьте платформу и выберите путь к бинарным файлам OpenJDK 9 EA, которые вы создали в шаге 1.

Чтобы преобразовать существующий проект в модуль, вам необходимо выполнить две задачи:

  1. Настройте проект для совместимости с JDK 9 в Свойствах проекта:
    1. В разделе «Библиотеки» установите Java Platform для своей платформы Java JDK 9 EA (рис. 3).
    2. В разделе «Источники» установите « Исходный / двоичный формат» на JDK 9 (рис. 4).
  2. Добавьте информацию о модуле Java (т.е. дескриптор модуля module-info.java ) в ваш проект (см. Рис. 5):
    1. Файл | Новый файл… | Ява (категория) | Информация о модуле Java (тип файла)
Рис. 3 - Установите Java Platform в JDK 9 EA

Рис. 3 — Установите Java Platform в JDK 9 EA

Рис. 4 - Исходники Java

Рис. 4 — Установить исходные коды Java на JDK 9

Рис. 5 - Добавление информации о модуле Java

Рис. 5 — Добавление информации о модуле Java

module-info.java всегда должен находиться в корне Java-проекта в NetBeans 9. Это ограничение в NetBeans 9, а не в JDK 9. Единственное исключение, когда мы можем иметь более одного файла module-info.java в Единственный проект Java — это когда у нас есть модульные тесты Вы можете добавить файлы module-info.java внутри Test Packages .

Но давайте узнаем о поддержке модулей советника NetBeans 9, реализовав краткое руководство по запуску проекта Jigsaw в советнике NetBeans 9.

4.1. Мое первое модульное приложение с NetBeans 9

Этот первый пример представляет собой модуль с именем com.greetings который просто печатает «Greetings!». Модуль состоит из двух исходных файлов: объявления модуля ( module-info.java ) и основного класса.

По соглашению (имя модуля может быть Java-квалифицированным идентификатором), исходный код модуля находится в каталоге, который является именем модуля (в нашем случае com.greetings ) — даже если это не является необходимым.

Создайте новый проект Java в NetBeans, выполнив следующие действия:

  1. Файл | Новый проект…
  2. Выберите Java (Категория) и Java Application (Проект) и нажмите Далее.
  3. На следующей странице выберите местоположение проекта и введите «com.greetings» в качестве имени проекта из-за соглашения, за которым следует учебное пособие, но также можно использовать обычное имя проекта Java, такое как «Greetings». Переименуйте основной класс в com.greetings.Main . Нажмите Готово .

Вы должны увидеть Java-проект с именем com.greetings и внутри него класс com.greetings.Main который содержит метод main() . Измените это так:

com.greetings.Main

1
2
3
4
5
6
7
8
9
package com.greetings;
 
/** @author javacodegeeks */
public class Main {
  /** @param args the command line arguments */
  public static void main(String[] args) {
    System.out.println("Greetings!");
  }
}

Чтобы преобразовать Java-проект в модуль, добавьте module-info.java как описано ранее, т. module-info.java правой кнопкой мыши имя проекта и выбрав File | Новый файл… | Ява (категория) | Информация о модуле Java (тип файла) .

Пустой module-info.java создается в корневом пакете проекта. Переименуйте его следующим образом в соответствии с руководством Jigsaw:

com.greetings.module-info.java

1
2
module com.greetings {
}

Вы должны очистить и собрать проект, чтобы переименование модуля вступило в силу и успешно запустило его. Вы должны увидеть сообщение «Привет!» в окне вывода.
С NetBeans вам не нужно заботиться о синтаксисе командной строки и аргументах команд javac и java . Об этом заботится IDE NetBeans.

4.2. Добавление зависимостей

Второй пример обновляет объявление модуля для объявления зависимости от модуля org.astro . Модуль org.astro экспортирует пакет API org.astro .

Создайте новый Java-проект с именем org.astro , следуя org.astro предыдущего подраздела. Не создавайте Main Class на этот раз. Как только проект создан, щелкните правой кнопкой мыши на нем и выберите New | Класс Java … Введите World качестве имени класса и org.astro качестве имени пакета и нажмите Finish . Обновите созданный класс следующим образом:

org.astro.World.java

1
2
3
4
5
6
7
8
package org.astro;
 
/** @author javacodegeeks */
public class World {
    public static String name() {
        return "world";
    }
}

Добавьте module-info.java как мы делали раньше, для com.greetings .

org.astro.module-info.java

1
2
module org.astro {
}

Не забудьте очистить и собрать, чтобы переименование модуля вступило в силу.

Теперь нам нужно добавить зависимость от модуля com.greetings модуль org.astro , чтобы использовать его метод World.name() . Но перед этим org.astro должен экспортировать пакет, содержащий этот метод. Оба действия необходимо выполнить в файлах module-info.java двух модулей. NetBeans 9 предоставляет полезные советы о том, как это сделать.

  1. Откройте org.astro module-info.java и внутри скобок введите Ctrl-Space . Появится всплывающее меню, в котором отображаются доступные команды, как показано на рис. 6. Выберите org.astro и продолжайте, набрав org.astro который является именем пакета для экспорта. NetBeans предоставляет вам подсказки при вводе. После сохранения module-info.java вы заметите, что значок блокировки пакета на вкладке « Проекты » меняется на открытый замок.
  2. Откройте com.greetings module-info.java и внутри скобок, следуйте шагам, описанным выше, для ввода команды requires org.astro , на этот раз ссылаясь на имя модуля, а не на имя пакета (еще одна причина, по которой соглашение выбрано краткое руководство по проекту Jigsaw не столь успешно, так как сложно различить имена пакетов и модулей). Однако NetBeans жалуется, что module not found сообщения об ошибке module not found . Чтобы NetBeans мог найти модуль, требуется еще один шаг.
  3. Щелкните правой кнопкой мыши папку « com.greetings Java-проекта com.greetings и выберите « Добавить проект» во всплывающем меню. Выберите org.astro Java org.astro и нажмите « Добавить файлы JAR проекта» . Ошибка ушла. Другой способ сделать то же самое — щелкнуть правой кнопкой мыши на проекте com.greetings и выбрать Properties из всплывающего меню. В диалоговом окне «Свойства проекта» щелкните категорию « Библиотеки» и нажмите значок «+» рядом с модульным путем . Выберите Добавить проект, затем Java-проект org.astro и нажмите Добавить файлы JAR проекта . Помните, что если вы попытаетесь добавить циклические зависимости (например, из `org.astro` в com.greetings ), NetBeans отобразит диалоговое окно с сообщением: Невозможно добавить циклические ссылки (см. Рис. 7).
  4. Модифицируйте Main.main() так же, очистите и Main.main() оба модуля.
Рис. 6 - Команды модуля Информация

Рис. 6 — Команды модуля Информация

Рис. 8 - Ошибка циклических зависимостей

Рис. 7 — Ошибка циклических зависимостей

com.greetings.Main.java

1
2
3
4
5
6
7
8
9
package com.greetings;
import org.astro.World;
/** @author javacodegeeks */
public class Main {
  /** @param args the command line arguments */
  public static void main(String[] args) {
    System.out.format("Greetings %s!%n", World.name());
  }
}

При вставке нового оператора System.out.format(...) NetBeans распознает класс World и предлагает добавить оператор import . Это возможно только потому, что вы уже обновили файлы module-info.java двух модулей, как показано ниже:

com.greetings.module-info.java

1
2
3
module org.astro {
    exports org.astro;
}

org.astro.module-info.java

1
2
3
module com.greetings {
    requires org.astro;
}

Советник NetBeans 9 предоставляет вам визуальное представление зависимостей (график модуля). Просто нажмите кнопку « График» в редакторе org.greetings module-info.java чтобы увидеть симпатичный график зависимостей модулей, как показано на следующем рисунке.

Рис. 8 - График модуля

Рис. 8 — График модуля

Запустите модуль com.greetings чтобы увидеть вывод: Greetings world! как и ожидалось.

Сравните с оригинальным руководством по быстрому запуску проекта Jigsaw, чтобы узнать, сколько набранных вами текстов вы сохранили самостоятельно благодаря среде IDE NetBeans.

4,3. Упаковочные модули

Упаковывать модули очень просто с NetBeans. Щелкните правой кнопкой мыши проект com.greetings и выберите « Свойства» во всплывающем меню. В диалоговом окне «Свойства проекта» (рис. 9) щелкните категорию « Упаковка» в разделе « Сборка», выберите « Создать дистрибутив JLink» и « Создать панель запуска» и нажмите « ОК» . В следующий раз, когда вы очистите и com.greetings NetBeans, вы сгенерируете образ времени выполнения Java в папке com.greetings проекта Java com.greetings который содержит только модули JDK, необходимые для com.greetings (т.е. только модуль java.base ). Не нужно помнить синтаксис команды jlink .

Рис. 9 - Упаковочные модули

Рис. 9 — Упаковочные модули

4.4. Java модульный проект

Как мы упоминали в начале, NetBeans 9 допускает только один модуль для каждого проекта Java. Однако, используя модульный проект Java, можно определить много модулей внутри этого специального проекта Java. Мы повторно реализуем предыдущие модули, используя модульный проект Java. Это основанный на муравьях проект, содержащий несколько модулей и компилирующих их одновременно.

  1. Файл | Новый проект…
  2. Выберите Java (Категория) и Java Modular Project (Проект) (Рис. 10) и нажмите Далее.
  3. Введите ModularGreetings качестве имени проекта и нажмите Finish.
  4. Щелкните правой кнопкой мыши по вновь созданному проекту и выберите « Новый модуль» во всплывающем меню.
  5. Введите com.greetings качестве имени модуля и нажмите Finish . NetBeans открывает файл module-info.java для этого модуля.
  6. Повторите предыдущий шаг, чтобы создать модуль org.astro .
  7. Создайте зависимости между двумя модулями, как описано в 4.2.
  8. Создайте (или скопируйте из предыдущих модулей, созданных в 4.2) пакеты внутри classes каждого модуля.
  9. Очистить и построить. Нет необходимости добавлять org.astro в путь модуля com.greetings ; это делается автоматически.
  10. Запустите проект, чтобы увидеть правильный вывод: Greetings world!
Рис. 10 - Новый Java модульный проект

Рис. 10 — Новый Java модульный проект

Рис. 11 - Модульный проект Java

Рис. 11 — Модульный проект Java

Вы видите, что у модульного проекта Java есть ряд преимуществ, например, вам не нужно явно добавлять другие проекты в путь к модулю; это делается автоматически при обновлении module-info.java .

4,5. Сервисы

Слабое связывание относится к системам, в которых каждый компонент имеет или практически не использует определения других отдельных компонентов. Это позволяет различным компонентам изменяться независимо, не затрагивая другие компоненты.

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

Предположим, у вас есть провайдер, который предоставляет услугу. Например, это может быть AlertService (который предоставляет различные системные или прикладные оповещения), CoordinatesProvider (который обеспечивает различные системы координат, например, Lat / Lon, GEOREF, UTM и т. Д.), AlgorithmProvider (который предоставляет различные алгоритмические решения проблемы) и т. Д. Чтобы добиться слабой связи, вы предоставляете интерфейс для ваших классов вызывающих, скрывая фактическую реализацию (и) за ним. Классы вызывающего (или потребителя службы) не должны знать ничего о реальных реализациях; им нужно только знать, как получить доступ к соответствующим методам. Затем реализации как-то предоставляются классам вызывающих во время выполнения. Таким образом, фактические реализации могут быть изменены в любое время, когда классы вызывающих абонентов не знают об этом, пока интерфейс Provider не изменится.

Есть несколько способов добиться слабой связи. Обычно это делается поставщиком услуг. Шаблон проектирования Service Locator обеспечивает глобальную точку доступа к сервису без привязки вызывающих абонентов (потребителей услуг) к конкретному классу (классам), которые его реализуют. Например, Spring использует Dependency Injection (одна из форм инверсии управления ), модульный API RCP NetBeans использует Lookups и ServiceProviders и т. Д. Jigsaw использует ServiceLoader из Java 6. Классы потребителей и поставщиков услуг могут находиться в разных модулях.

Из Jigsaw Quick Start Guide модуль com.socket предоставляет сервис NetworkSocketProvider для NetworkSocket s. Две реализации этого сервиса предоставляются в двух разных модулях: org.fastsocket и org.smartsocket . Наш модуль потребителя службы com.greetings нуждается в зависимости только от com.socket поставщика услуг com.socket , но не от модулей реализации службы.

Рис. 12 - Поставщики услуг

Рис. 12 — Поставщики услуг

Посмотрим, как нам этого добиться. В советнике NetBeans 9 создайте новый com.socket Java Project, как мы видели ранее, без предоставления класса Main .

Создайте два класса com.socket.NetworkSocket и com.socket.spi.NetworkSocketProvider как описано в руководстве по быстрому запуску , добавьте новый module-info.java для преобразования проекта в модуль Java 9 и экспортируйте эти два пакета для потребителя. классы:

com.socket.module-info.java

1
2
3
4
5
module com.socket {
    exports com.socket;
    exports com.socket.spi;
    uses com.socket.spi.NetworkSocketProvider;
}

Последний оператор объявляет, что этот модуль предоставляет com.socket.spi.NetworkSocketProvider сервис com.socket.spi.NetworkSocketProvider . Не забудьте очистить и собрать этот модуль, чтобы изменения вступили в силу.

Далее, давайте создадим модуль org.fastsocket . Как и прежде, создайте два класса org.fastsocket.FastNetworkSocket и org.fastsocket.FastNetworkSocketProvider как описано в Руководстве по быстрому запуску , добавьте новый module-info.java для преобразования проекта в модуль Java 9 и добавьте зависимость к com.socket модуль com.socket :

org.fastsocket.module-info.java

1
2
3
4
5
module org.fastsocket {
   requires com.socket;
   provides com.socket.spi.NetworkSocketProvider
        with org.fastsocket.FastNetworkSocketProvider;
}

Последний оператор обеспечивает реализацию поставщика услуг com.socket.spi.NetworkSocketProvider . Обратите внимание, что этот модуль не экспортирует никаких пакетов!

Тем не менее, проект содержит ошибки компиляции. Можешь сказать почему?

Нам нужно добавить com.socket в com.socket к модулю (обратитесь к предыдущей части этой статьи, если вы не помните, как это сделать). Очистите и соберите, чтобы убедиться в отсутствии ошибок.

Вы можете повторить описанные выше шаги, чтобы создать org.smartsocket аналогичным образом, однако, краткое руководство не делает этого, поэтому вы можете создать свои собственные реализации, если хотите, в качестве упражнения.

Наконец, создайте потребительский Java-проект com.greetings (используйте другой каталог, чтобы не связываться с модулем com.greetings мы создали в главах 4.1 и 4.2) с классом com.greetings.Main , скопируйте содержимое из Руководства по быстрому запуску , добавьте новый module-info.java для преобразования проекта в модуль Java 9 и добавьте зависимость в com.socket :

com.greetings.module-info.java

1
2
3
module com.greetings {
    requires com.socket;
}

Убедитесь, что вы добавили в свой modulepath com.socket и все готово. Очистите и com.greetings , затем запустите com.greetings и вы увидите ошибку:

Исключение во время выполнения

1
2
3
Exception in thread "main" java.lang.RuntimeException: No service providers found!
 at com.socket/com.socket.NetworkSocket.open(NetworkSocket.java:19)
 at com.greetings/com.greetings.Main.main(Main.java:8)

Почему? Мы сделали именно то, что упоминает Краткое руководство . Java-проекты NetBeans требуют, чтобы вы добавили org.fastsocket в путь к модулю (который затем автоматически добавляется в module-info.java ), а затем исключение исчезает:

org.fastsocket.FastNetworkSocket

1
class org.fastsocket.FastNetworkSocket

В качестве упражнения вы можете повторить вышеизложенное, используя модульный проект Java. И здесь вам не нужно добавлять модули реализации поставщика услуг (например, org.fastsocket ) к пути модуля com.greetings .

Но как это работает? Jigsaw использует ServiceLoader для поиска различных реализаций поставщика услуг:

ServiceLoader

1
2
3
ServiceLoader<NetworkSocketProvider> sl
           = ServiceLoader.load(NetworkSocketProvider.class);
Iterator<NetworkSocketProvider> iter = sl.iterator();

sl.iterator() будет перебирать org.fastsocket.FastNetworkSocketProvider и com.smartsocket.SmartNetworkSocketProvider (если вы это реализовали).

Под капотом ServiceLoader создает файл конфигурации провайдера, который хранится в каталоге META-INF/services файла JAR провайдера услуг. Имя файла конфигурации — это полное имя класса поставщика услуг, в котором каждый компонент имени разделяется точкой ( . ), А вложенные классы — знаком доллара ( $ ). Другими словами, ServiceLoader создает текстовый файл package.Provider папке build/classes/META-INF/services/ (или dist/provider.jar ) модуля, которая содержит полностью определенные имена классов реализации, например package.ProviderImpl ,

В нашем примере com.socket/build/classes/META-INF/services/ содержит текстовый файл com.socket.spi.NetworkSocketProvider который содержит полностью определенные имена классов реализации org.fastsocket.FastNetworkSocketProvidercom.smartsocket.SmartNetworkSocketProvider если вы это реализовали).

Или, по крайней мере, это должна была быть реализация «под капотом», если бы использовался Java 6 ServiceLoader ! К сожалению, Java 9 изменила реализацию ServiceLoader .

Java 6 ServiceLoader имеет ряд ограничений:

  • он не динамический (вы не можете установить / удалить плагин / сервис во время выполнения)
  • он загружает все службы при запуске (в результате требуется больше времени запуска и больше памяти)
  • это не может быть настроено; есть стандартный конструктор, и он не поддерживает фабричные методы
  • он не позволяет ранжировать / упорядочивать, то есть мы не можем выбирать, какую службу загружать первой (упорядочение служб выполняется по мере их обнаружения)

Кроме того, Java 9 изменил Java 6 ServiceLoader следующим образом:

  • Нет относительных услуг; новый локатор службы на основе модулей не имеет относительного поведения
  • Заказ услуг (как они были обнаружены) потерян
  • Все сервисные интерфейсы и реализации на пути к модулю сведены в единое глобальное пространство имен.
  • Нет расширяемости / настраиваемости загрузки сервиса; провайдер сервисного уровня должен заранее предоставить фиксированное отображение доступных сервисов
  • объявления на нескольких сайтах; каждый модуль, который использует сервис, должен также объявить, что сервис используется в дескрипторе модуля; нет глобального реестра служб уровня

Другими словами, если вы com.socket/build/classes/META-INF/services/ или com.socket/dist/com.socket.jar/META-INF/services/ вы ничего не найдете.

Вместо этого NetBeans RCP предоставляет ServiceProvider , который не имеет недостатков ServiceLoader упомянутых выше. Он динамический, поэтому вы можете подключать / отключать модули во время работы приложения, он не загружает все службы при запуске и позволяет устанавливать приоритеты (с помощью атрибута @ServiceProvider аннотации @ServiceProvider ). К сожалению, это не работает с Jigsaw.

5. NetBeans дальнейшие улучшения

Чтобы сделать пакет доступным для других модулей, необходимо отредактировать module-info.java и добавить оператор exports передавая имя пакета в качестве аргумента. В результате значок пакета изменится на значок с открытым замком вместо заблокированного.

Хорошим сочетанием клавиш будет возможность щелкнуть правой кнопкой мыши пакет и выбрать действие « Экспорт пакета», как показано на следующем рисунке, которое автоматически module-info.java соответствующим образом без необходимости вводить команду export .

Рис. 13 - улучшение NetBeans; добавить пункт меню «Экспорт пакета»

Рис. 13 — улучшение NetBeans; добавить пункт меню «Экспорт пакета»

Эта функциональность уже существует в API модулей RCP NetBeans, который входит в состав клиентской платформы NetBeans Rich.

В проекте, который состоит из множества модулей, часто трудно найти внутри какого модуля существуют наши зависимости. Хорошим дополнением будет возможность поиска класса, который мы ищем в наших модулях (и / или модулях библиотек). Аналогичная функциональность уже существует в API модулей RCP NetBeans, API , который входит в состав клиентской платформы NetBeans Rich.

Если щелкнуть по блоку подсказок, если возникнет ошибка, поскольку NetBeans не может найти зависимость, откроется диалоговое окно, в котором разработчик может ввести нужный класс, как показано на следующем рисунке, и затем выбрать соответствующий модуль. Это же диалоговое окно может быть доступно, когда разработчик просит добавить зависимость модуля в путь к модулю (например, щелкнув правой кнопкой мыши на « Библиотеки» ).

Рис. 14 - улучшение NetBeans; поиск зависимостей модулей

Рис. 14 — улучшение NetBeans; поиск зависимостей модулей

Наконец, можно добавить новый модуль в модульный проект Java, но удалить модуль невозможно, хотя эти строки написаны по крайней мере. Это ошибка советника, которая будет исправлена.

Советник NetBeans 9 все еще находится в тяжелой разработке и еще не прошел официальное тестирование (он же NetCat), поэтому вполне нормально, что на этом этапе встречаются некоторые ошибки или странное поведение.

6. Заключение

В этой статье мы увидели, как советник NetBeans 9 поддерживает советник JDK 9 и облегчает жизнь разработчику. Как разработчику, вам не нужно помнить детали того, как создавать и выполнять java-модули, используя путь к модулю, или как составлять команду jlink ; NetBeans 9 скрывает детали. JShell также хорошо интегрирован. Некоторые улучшения могут, конечно, сделать жизнь разработчиков еще проще, но они появятся в будущих выпусках NetBeans или в виде плагинов.

Мы видели два вида проектов, которые можно использовать для создания модульных приложений Java. Мы видели использование четырех из пяти доступных команд, которые можно использовать внутри module-info.java : exports, requires, uses и provides . opens позволяет другим модулям использовать отражение для доступа к типам в пакете, который вы открываете.

Определенные пакеты в обычных модулях могут быть «открыты», так что только этот пакет доступен для глубокого анализа во время выполнения:

com.greetings.module-info.java

1
2
3
module com.greetings {
    opens com.greetings;
}

Несколько сред и инструментов Java в значительной степени полагаются на рефлексию для доступа к коду вашего неэкспортированного модуля во время выполнения. Они предоставляют такие функции, как внедрение зависимостей, сериализация, реализация API персистентности Java, автоматизация кода, отладка и т. Д. Примерами являются Spring и Hibernate. Эти фреймворки и библиотеки не знают о ваших прикладных модулях, но им нужен доступ к типам и закрытым членам ваших модулей, что нарушает предпосылку сильной инкапсуляции в JDK 9. Можно также открыть весь модуль для отражения, например:

com.greetings.module-info.java

1
2
3
open module com.greetings {
    requires com.socket;
}

Сравнивая операции exports с opens , оператор exports позволяет получить доступ только к общедоступному API указанного пакета во время компиляции и во время выполнения, а оператор opens позволяет получить доступ к открытым и закрытым членам всех типов в указанном пакете, используя отражение во время выполнения.

Это не все розы при работе с Jigsaw. Сообщество экспертов не приняло Jigsaw и обеспокоено множеством критических недостатков, с которыми они столкнулись.

7. Ссылки

  1. Советник NetBeans 9
  2. Поддержка NetBeans 9 EA JDK 9
  3. Окончательное руководство по Java 9 , Sitepoint
  4. Функция JDK 9 завершена , JavaCodeGeeks
  5. Журнал Java , июль-август 2017
  6. Java 9 серии: JShell , Voxxed
  7. Java 9 серии : HTTP / 2 клиент , Voxxed
  8. Серия Java 9: JVM , Voxxed
  9. Java 9 серии: HTML5 и Javadoc , Voxxed
  10. Java 9 серия : обновления параллелизма , Voxxed
  11. Серия Java 9: переменные ручки , Voxxed
  12. Серия Java 9: ​​инкапсулируйте большинство внутренних API , Voxxed
  13. Серия Java 9: ​​многоцелевые файлы JAR , Voxxed
  14. Серия Java 9 : кеш сегментированного кода , Voxxed
  15. Серия Java 9: ​​методы фабрики удобства для коллекций , Voxxed
  16. Критические недостатки в Jigsaw
  17. Бейтман А. (2016), «Подготовка к JDK 9», JavaOne .
  18. Бейтман А. (2016), «Введение в модульную разработку», JavaOne .
  19. Бейтман А. и Бакли А. (2016), «Усовершенствованная модульная разработка», JavaOne .
  20. Бакли А. (2016), «Модули и сервисы », JavaOne .
  21. Бакли А. (2016), «Головоломка проекта: под капотом», JavaOne .
  22. Бейтман А., Чунг М., Рейнхольд М. (2016), «Проект Jigsaw Hack Session», JavaOne .
  23. Deitel P. & Deitel H. (2017), Java 9 для программистов, 4-е изд., Deitel.
  24. Эванс, Б. (2016), «Ранний взгляд на модули Java 9» , журнал Java , выпуск 26, январь-февраль, с.59-64.
  25. Гупта А. (2015), JDK 9 REPL: Начало работы , JavaCodeGeeks
  26. Jog TM. (2016), Изучение модульного Java-программирования , Packt.
  27. Мак С. и Баккер П. (2016), Java 9 Modularity, O’Reilly (Ранний выпуск)
  28. Рейнхольд М. (2016), Проблемные модули рефлексивного доступа , Voxxed
  29. Sharan K. (2017), Java 9, раскрытая для раннего усыновления и миграции , Apress.
  30. Verhas P. (2017), Java 9 Programming By Example , Packt.
  31. Житницкий А. (2015), Java 9 Ранний доступ: практическая сессия с JShell — Java REPL , JavaCodeGeeks.