Java 9 не за горами, как и NetBeans 9. В этой статье мы увидим поддержку, которую ранний доступ NetBeans 9 предоставляет разработчикам для создания приложений, совместимых с Java 9.
Java 9 предоставляет множество (около 90) новых функций, включая модули и JShell, Read-Eval-Print-Loop (REPL) и многие другие. Дополнительную информацию вы можете найти в ссылках в конце этой статьи и особенно в этой ссылке о поддержке NetBeans 9 для JDK 9.
В этой статье мы научимся:
- скачать и собрать Java 9 EA из исходников
- скачать и собрать советник NetBeans 9 из исходников
- использовать JShell REPL от советника NetBeans 9
- создавать и создавать модули и зависимости между ними с помощью советника 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.
- Клонируйте ртутный репозиторий JDK 9 Master .
- Прочитайте файл
README
илиREADME-builds.html
для получения дополнительных инструкций. - Следующий шаг перед началом сборки — выполнить:
bash get_source.sh
или./get_source.sh
если ваша оболочка уже является bash. Очень важно после каждого обновления вызывать эту команду. Причина в том, чтоhg update
только главный репозиторий. OpenJDK состоит из нескольких ртутных репозиториев, которые также необходимо обновить. Это можно сделать с помощью командыget_source.sh
. -
./configure --disable-warnings-as-errors
-
sudo make all
Приведенные выше команды создают последнюю версию OpenJDK. Если вы хотите собрать более раннюю версию OpenJDK, вам нужно следовать этим советам:
-
hg up [tag]
напримерjdk-9+147
-
cd corba
-
hg up [tag]
напримерjdk-9+147
- Повторите шаги 2 и 3 для каталогов:
hotspot, jaxp, jaxws, jdk, langtools, nashorn
-
./configure --disable-warnings-as-errors
-
sudo make clean
-
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 или собрать ее из источников:
-
hg clone http://hg.netbeans.org/main
-
cd main
-
hg clone http://hg.netbeans.org/main/contrib
-
cd ..
-
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.
3. Поддержка JShell в советнике NetBeans 9
Если вы запустили NetBeans 9 с реализацией JDK 9, вы можете получить доступ к JShell из меню Сервис | Откройте оболочку платформы Java . JShell работает так же, как из командной строки, и дополнительно с ним работают сочетания клавиш NetBeans (например, sout --> (tab)
). Вы можете прочитать больше о JShell в ресурсах.
4. Поддержка модулей в советнике NetBeans 9
Советник NetBeans 9 предоставляет ряд полезных вещей, которые помогут вам в ваших модульных проектах. Прежде чем продолжить, вы должны настроить JDK 9 EA Platform в разделе Инструменты | Платформы Java | Добавьте платформу и выберите путь к бинарным файлам OpenJDK 9 EA, которые вы создали в шаге 1.
Чтобы преобразовать существующий проект в модуль, вам необходимо выполнить две задачи:
- Настройте проект для совместимости с JDK 9 в Свойствах проекта:
- В разделе «Библиотеки» установите Java Platform для своей платформы Java JDK 9 EA (рис. 3).
- В разделе «Источники» установите « Исходный / двоичный формат» на JDK 9 (рис. 4).
- Добавьте информацию о модуле Java (т.е. дескриптор модуля
module-info.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, выполнив следующие действия:
- Файл | Новый проект…
- Выберите Java (Категория) и Java Application (Проект) и нажмите Далее.
- На следующей странице выберите местоположение проекта и введите «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 предоставляет полезные советы о том, как это сделать.
- Откройте
org.astro
module-info.java
и внутри скобок введитеCtrl-Space
. Появится всплывающее меню, в котором отображаются доступные команды, как показано на рис. 6. Выберитеorg.astro
и продолжайте, набравorg.astro
который является именем пакета для экспорта. NetBeans предоставляет вам подсказки при вводе. После сохраненияmodule-info.java
вы заметите, что значок блокировки пакета на вкладке « Проекты » меняется на открытый замок. - Откройте
com.greetings
module-info.java
и внутри скобок, следуйте шагам, описанным выше, для ввода командыrequires org.astro
, на этот раз ссылаясь на имя модуля, а не на имя пакета (еще одна причина, по которой соглашение выбрано краткое руководство по проекту Jigsaw не столь успешно, так как сложно различить имена пакетов и модулей). Однако NetBeans жалуется, чтоmodule not found
сообщения об ошибкеmodule not found
. Чтобы NetBeans мог найти модуль, требуется еще один шаг. - Щелкните правой кнопкой мыши папку «
com.greetings
Java-проектаcom.greetings
и выберите « Добавить проект» во всплывающем меню. Выберитеorg.astro
Javaorg.astro
и нажмите « Добавить файлы JAR проекта» . Ошибка ушла. Другой способ сделать то же самое — щелкнуть правой кнопкой мыши на проектеcom.greetings
и выбрать Properties из всплывающего меню. В диалоговом окне «Свойства проекта» щелкните категорию « Библиотеки» и нажмите значок «+» рядом с модульным путем . Выберите Добавить проект, затем Java-проектorg.astro
и нажмите Добавить файлы JAR проекта . Помните, что если вы попытаетесь добавить циклические зависимости (например, из `org.astro` вcom.greetings
), NetBeans отобразит диалоговое окно с сообщением: Невозможно добавить циклические ссылки (см. Рис. 7). - Модифицируйте
Main.main()
так же, очистите иMain.main()
оба модуля.
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
чтобы увидеть симпатичный график зависимостей модулей, как показано на следующем рисунке.
Запустите модуль 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
.
4.4. Java модульный проект
Как мы упоминали в начале, NetBeans 9 допускает только один модуль для каждого проекта Java. Однако, используя модульный проект Java, можно определить много модулей внутри этого специального проекта Java. Мы повторно реализуем предыдущие модули, используя модульный проект Java. Это основанный на муравьях проект, содержащий несколько модулей и компилирующих их одновременно.
- Файл | Новый проект…
- Выберите Java (Категория) и Java Modular Project (Проект) (Рис. 10) и нажмите Далее.
- Введите
ModularGreetings
качестве имени проекта и нажмите Finish. - Щелкните правой кнопкой мыши по вновь созданному проекту и выберите « Новый модуль» во всплывающем меню.
- Введите
com.greetings
качестве имени модуля и нажмите Finish . NetBeans открывает файлmodule-info.java
для этого модуля. - Повторите предыдущий шаг, чтобы создать модуль
org.astro
. - Создайте зависимости между двумя модулями, как описано в 4.2.
- Создайте (или скопируйте из предыдущих модулей, созданных в 4.2) пакеты внутри
classes
каждого модуля. - Очистить и построить. Нет необходимости добавлять
org.astro
в путь модуляcom.greetings
; это делается автоматически. - Запустите проект, чтобы увидеть правильный вывод:
Greetings world!
Вы видите, что у модульного проекта 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
, но не от модулей реализации службы.
Посмотрим, как нам этого добиться. В советнике 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.FastNetworkSocketProvider
(и com.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
.
Эта функциональность уже существует в API модулей RCP NetBeans, который входит в состав клиентской платформы NetBeans Rich.
В проекте, который состоит из множества модулей, часто трудно найти внутри какого модуля существуют наши зависимости. Хорошим дополнением будет возможность поиска класса, который мы ищем в наших модулях (и / или модулях библиотек). Аналогичная функциональность уже существует в API модулей RCP NetBeans, API , который входит в состав клиентской платформы NetBeans Rich.
Если щелкнуть по блоку подсказок, если возникнет ошибка, поскольку 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. Ссылки
- Советник NetBeans 9
- Поддержка NetBeans 9 EA JDK 9
- Окончательное руководство по Java 9 , Sitepoint
- Функция JDK 9 завершена , JavaCodeGeeks
- Журнал Java , июль-август 2017
- Java 9 серии: JShell , Voxxed
- Java 9 серии : HTTP / 2 клиент , Voxxed
- Серия Java 9: JVM , Voxxed
- Java 9 серии: HTML5 и Javadoc , Voxxed
- Java 9 серия : обновления параллелизма , Voxxed
- Серия Java 9: переменные ручки , Voxxed
- Серия Java 9: инкапсулируйте большинство внутренних API , Voxxed
- Серия Java 9: многоцелевые файлы JAR , Voxxed
- Серия Java 9 : кеш сегментированного кода , Voxxed
- Серия Java 9: методы фабрики удобства для коллекций , Voxxed
- Критические недостатки в Jigsaw
- Бейтман А. (2016), «Подготовка к JDK 9», JavaOne .
- Бейтман А. (2016), «Введение в модульную разработку», JavaOne .
- Бейтман А. и Бакли А. (2016), «Усовершенствованная модульная разработка», JavaOne .
- Бакли А. (2016), «Модули и сервисы », JavaOne .
- Бакли А. (2016), «Головоломка проекта: под капотом», JavaOne .
- Бейтман А., Чунг М., Рейнхольд М. (2016), «Проект Jigsaw Hack Session», JavaOne .
- Deitel P. & Deitel H. (2017), Java 9 для программистов, 4-е изд., Deitel.
- Эванс, Б. (2016), «Ранний взгляд на модули Java 9» , журнал Java , выпуск 26, январь-февраль, с.59-64.
- Гупта А. (2015), JDK 9 REPL: Начало работы , JavaCodeGeeks
- Jog TM. (2016), Изучение модульного Java-программирования , Packt.
- Мак С. и Баккер П. (2016), Java 9 Modularity, O’Reilly (Ранний выпуск)
- Рейнхольд М. (2016), Проблемные модули рефлексивного доступа , Voxxed
- Sharan K. (2017), Java 9, раскрытая для раннего усыновления и миграции , Apress.
- Verhas P. (2017), Java 9 Programming By Example , Packt.
- Житницкий А. (2015), Java 9 Ранний доступ: практическая сессия с JShell — Java REPL , JavaCodeGeeks.