powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Что можно писать внутри module-info.java ?
25 сообщений из 26, страница 1 из 2
Что можно писать внутри module-info.java ?
    #39538277
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Речь, как многие догадались, про java 9:
я нашёл примерно такой список - не уверен, что он полный.
requires модулю чтобы скомпилиться и запуститься нужен какой-то другой модуль
transitive - ?
exports - высовываем наружу какие-то пакеты нашего модуля
opens
to - нашёл только пример с exports to. Высовываем наружу но только для кого-то
uses - ?
provides - ?
and - ?
with - ?

Просьба знаки вопросы позаменять на описание, а также дополнения и исправления привествуются
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39538298
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так это. В JLS же всё написано.
opens, это как exports, только без доступа в compile time. Только в runtime.
uses и provides with относятся к SPI

transitive значит что зависимость транзитивная, то есть, если какой-то модуль requires другой модуль, то он так же неявно requires указанные в нём transitive зависимости. Не получается доходчиво сформулировать. Но вроде из термина должно быть очевидно.

Есть ещё static - модуль нужен при компиляции, но опционален в рантайме.
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39538300
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
ModuleDirective:
     requires  {RequiresModifier} ModuleName ;
     exports  PackageName [ to  ModuleName {, ModuleName}] ;
     opens  PackageName [ to  ModuleName {, ModuleName}] ;
     uses  TypeName ;
     provides  TypeName  with  TypeName {, TypeName} ;
RequiresModifier:
    (one of)
     transitive static 
and не вижу.
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39538318
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Да, я видел JLS но он не человека читаемый

Blazkowiczopens, это как exports, только без доступа в compile time. Только в runtime.
А зачем такое может быть надо? пример?
BlazkowiczЕсть ещё static - модуль нужен при компиляции, но опционален в рантайме.

А зачем такое может быть надо? пример?

Blazkowiczuses и provides with относятся к SPI

Подобные отрывки я читал. Но что это значит?
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39538332
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerно он не человека читаемый
Да, ладно. Только JMM за гранью. А остальное всё просто.

questionerBlazkowiczopens, это как exports, только без доступа в compile time. Только в runtime.
А зачем такое может быть надо? пример?

Ну, это же просто. Есть публичный API, а есть реализация. Публичный API ты используешь в своём коде. А его реализацию, ты не должен трогать. При этом в рантайме без реализации работать же не будет.

questionerBlazkowiczЕсть ещё static - модуль нужен при компиляции, но опционален в рантайме.

А зачем такое может быть надо? пример?

Чтобы не тянуть лишние зависимости в рантайм. Например библиотека какая-нибудь. Для её сборки нужна куча других либ. Но если ты будешь использовать только какую-то ограниченную функциональность тебе не надо все эти либы тянуть. Возможно для позднего связывания что Jigsaw не валидировало наличие в рантайме.
Вот с мавеном, например, часто бывает. Подключил зависимость, и оно ещё кучу всякого барахла притащило. А оно тебе и не надо было в проекте совсеи.

questionerПодобные отрывки я читал. Но что это значит?
Что значит SPI или что? Вы снова опять не можете себя пересилить и задать полноценный вопрос?
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39538378
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Надо наверное прочитать про SPI сначала
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39538400
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerНадо наверное прочитать про SPI сначала
Или хотя бы спросить про SPI, а не писать херню типа "все так говорят". Если читал уже про SPI, то почему бы про него и не спросить?
Это ж банальная фигня типа JDBC драйвера. Есть интерфейс. Есть подключаемые реализации. В jar-нике объявление какие сервервисы он реализует. SPI сканирует и находит динамически подключеные реализации в classpath.
То есть если раньше объявляения реализаций были а META-INF, то теперь они ещё и на уровне модуля.
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39539706
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

В соседней теме обсудили SPI
Blazkowiczuses и provides with относятся к SPI

BlazkowiczТо есть если раньше объявляния реализаций были а META-INF, то теперь они ещё и на уровне модуля.


джарник теперь не нужен?

вот допустим написано у модуля

авторprovides TypeName with TypeName {, TypeName} ;

Модуль предоставляет класс TypeName наружу

авторwith TypeName {, TypeName} что этот кусок значит?

я так понимаю писать
Код: java
1.
 provides SomeParent with SomeChild



почему через запятую можно писать после with?

в другом модуле я пишу

Код: java
1.
uses SomeParent 



Код: java
1.
ServiceLoader.load(SomeParent .class)



и эта запись выдаст мне все доступные имплементации объявленные через provides ?
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39539734
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerджарник теперь не нужен?

Чой-то?

questionerавторprovides TypeName with TypeName {, TypeName} ;
Модуль предоставляет класс TypeName наружу

там везде typename :) который из трех?
В общем ты не правильно понял. Это значит ровно то что написано.
Модуль предоставляет реализацию сервиса таким-то классом. Точно так же как META-INF/services/com.pck.Service/com.pck.ServiceImpl

questionerавторwith TypeName {, TypeName} что этот кусок значит?

Почему ты JLS не смотришь, мне не понятно. Там же даже примеры есть.

questioner почему через запятую можно писать после with?

Несколько реализаций?
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39540051
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczquestionerджарник теперь не нужен?

Чой-то?

questionerпропущено...

Модуль предоставляет класс TypeName наружу

там везде typename :) который из трех?
В общем ты не правильно понял. Это значит ровно то что написано.
Модуль предоставляет реализацию сервиса таким-то классом. Точно так же как META-INF/services/com.pck.Service/com.pck.ServiceImpl

questionerпропущено...
что этот кусок значит?

Почему ты JLS не смотришь, мне не понятно. Там же даже примеры есть.

questioner почему через запятую можно писать после with?

Несколько реализаций?

===

BlazkowiczЧой-то?

А без джарника это не будет работать?только чисто на модулях.
Blazkowiczтам везде typename :) который из трех?

Логичным кажется, что наружу показывается интерфейс(родительский класс) который

автор provides TypeName with TypeName {, TypeName} ; первый в списке


авторНесколько реализаций?


Мы ж делаем

Код: java
1.
ServiceLoader.load(Parent.class)



Если реализаций много, то кто загрузится?

BlazkowiczПочему ты JLS не смотришь, мне не понятно. Там же даже примеры есть.
Вот откуда до куда там читать?
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39540159
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

http://openjdk.java.net/projects/jigsaw/quick-start For transportation and deployment purposes then it is usually more convenient to package a module as a modular JAR. A modular JAR is a regular JAR file that has a module-info.class in its top-level directory.

https://docs.oracle.com/javase/specs/jls/se9/html/jls-7.html#jls-7.7.4 The provides directive specifies a service for which the with clause specifies one or more service providers to java.util.ServiceLoader.
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39540164
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczquestioner,

http://openjdk.java.net/projects/jigsaw/quick-start For transportation and deployment purposes then it is usually more convenient to package a module as a modular JAR. A modular JAR is a regular JAR file that has a module-info.class in its top-level directory.

Удобно но всё же не обязательно ?

https://docs.oracle.com/javase/specs/jls/se9/html/jls-7.html#jls-7.7.4 The provides directive specifies a service for which the with clause specifies one or more service providers to java.util.ServiceLoader.

ну я получу эти имплементации через итератор в этом случае?
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39540166
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
questioner,

замена:
авторMETA-INF/services/com.pck.Service/com.pck.ServiceImpl

это provide в том модуле где этот сервис есть
+
uses в том, котором пользуем?

в том котором пользуем также пишем

ServiceLoader.load(Parent.class)?
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39540679
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz ,

Blazkowicz Ну, это же просто. Есть публичный API, а есть реализация. Публичный API ты используешь в своём коде. А его реализацию, ты не должен трогать. При этом в рантайме без реализации работать же не будет.

а можете накидать двустрочный пример где скомпилируется без реализации, но в рантайме Blazkowicz работать не будет
не уверен, что правильно Понимаю Вашу мысль
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39540698
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerBlazkowicz Ну, это же просто. Есть публичный API, а есть реализация. Публичный API ты используешь в своём коде. А его реализацию, ты не должен трогать. При этом в рантайме без реализации работать же не будет.

а можете накидать двустрочный пример где скомпилируется без реализации, но в рантайме Blazkowicz работать не будет
не уверен, что правильно Понимаю Вашу мысль

Одной строчки достаточно.
Код: java
1.
DriverManager.getConnection("jdbc:mysql://localhost:3306/");


Нужен ли MySQL JDBC Connector чтобы этот код скомпилировать?
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39540724
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

авторОдной строчки достаточно.
Код: java
1.
DriverManager.getConnection("jdbc:mysql://localhost:3306/");



Нужен ли MySQL JDBC Connector чтобы этот код скомпилировать?

Ловко. А если без SPI?
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39540734
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerЛовко. А если без SPI?
Да, ну ты прикалываешься? Любая зависимость второго уровня. Они не нужны тебя для компиляции, потому что твой код использует только зависимости первого уровня. А они уже скомпилированы. Но при этом зависимости любого уровня тебе нужны в рантайме, иначе зависимости первого уровня упадут с NoClassDefFoundError.

Тут, кстати, любопытное отличие в том что NoClassDefFoundError это Error. А SPI и прочие ленивые зависимости тебе дадут Exception.
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39546302
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczquestionerЛовко. А если без SPI?
Да, ну ты прикалываешься? Любая зависимость второго уровня. Они не нужны тебя для компиляции, потому что твой код использует только зависимости первого уровня. А они уже скомпилированы. Но при этом зависимости любого уровня тебе нужны в рантайме, иначе зависимости первого уровня упадут с NoClassDefFoundError.

Тут, кстати, любопытное отличие в том что NoClassDefFoundError это Error. А SPI и прочие ленивые зависимости тебе дадут Exception.

Да нет, не прикалываюсь.

А какие зависимости второго уровня бывают ещё?

SPI.
reflection судя по всему


что ещё?
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39546316
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerДа нет, не прикалываюсь.

OMFG. Вот есть проект. Он использует Apache Commons HTTP Client.
Для того чтобы скомпилировать этот проект, нужен только commons-httpclient. Больше ничего. Это зависимость первого уровня.
Для того чтобы проект запустить, нужны ещё commons-logging и commons-codec. Это зависимости второго уровня. Они не нужны для компиляции проекта. Но нужны для его работы.
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39546321
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczquestionerДа нет, не прикалываюсь.

OMFG. Вот есть проект. Он использует Apache Commons HTTP Client.
Для того чтобы скомпилировать этот проект, нужен только commons-httpclient. Больше ничего. Это зависимость первого уровня.
Для того чтобы проект запустить, нужны ещё commons-logging и commons-codec. Это зависимости второго уровня. Они не нужны для компиляции проекта. Но нужны для его работы.

а какие там внутри механизмы делают эти 2 зависимости зависимостями второго уровня?

что такое зависимость второго уровня мне понятно -BlazkowiczОни не нужны для компиляции проекта. Но нужны для его работы.
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39546501
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerа какие там внутри механизмы делают эти 2 зависимости зависимостями второго уровня?Вы используете (чей-то) интерфейс и, соответственно, классы используемого - требуется для компиляции.
У используемого есть реализация, которая, в свою очередь имеет право на внешние зависимости. Детали реализации важны для исполнения, но "невидимы" при компиляции.

P.S. Историю средних веков прогуливали? "Вассал моего вассала - не мой вассал".
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39546674
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

Это ж общие слова.

Можете пример показать отличный от SPI и reflection?
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39546690
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любая библиотека с *-api.jar и *-impl.jar. Это если лень простенький пример с тремя классами набросать и откомпилировать/запустить.
Технически, с помощью javap и какой-то матери можно создать классы-заглушки (с пустыми телами методов) и успешно использовать эти пустышки для компиляции проекта.

P.S. Могу и обратный пример: для компиляции, например, log4j или tomcat требуется больше, чем для работы в типичной/умалчиваемой конфигурации.
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39549405
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovЛюбая библиотека с *-api.jar и *-impl.jar. Это если лень простенький пример с тремя классами набросать и откомпилировать/запустить.
Технически, с помощью javap и какой-то матери можно создать классы-заглушки (с пустыми телами методов) и успешно использовать эти пустышки для компиляции проекта.

P.S. Могу и обратный пример: для компиляции, например, log4j или tomcat требуется больше, чем для работы в типичной/умалчиваемой конфигурации.

Вот именно, что хочется пример с тремя классами сделать, только не знаю как.
Но только не SPI и не рефлексия
...
Рейтинг: 0 / 0
Что можно писать внутри module-info.java ?
    #39549406
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerВот именно, что хочется пример с тремя классами сделать, только не знаю как.

Пишешь класс A. Компилируешь.
Пишешь класс B, который использует A. Компилируешь.
Удаляешь класс А.
Пишешь класс С, который использует только B. Компилируешь. Ошибки компиляции нет.
Запускаешь класс С - получаешь NoClassDefFoundError.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Что можно писать внутри module-info.java ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]