Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
questioner
Member

Откуда:
Сообщений: 1626
В jigsaw есть requires static

Как я понял это значит что во время компиляции зависимый модуль должен присутствовать, но в райнтайме он может и не присуствовать.

1. Как такое может быть?
2. Зачем такое надо?
15 май 19, 12:30    [21885162]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
questioner
Member

Откуда:
Сообщений: 1626
Изначально подумал, что это что-то типа мавеновского provided, который говорит, что какую-то зависимость надо брать с application сервера. Но тут же пишут, что в рантайме классы будут не доступны. Видимо это неверное предположение
15 май 19, 13:12    [21885193]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
vsl
Member

Откуда:
Сообщений: 43
questioner
Изначально подумал, что это что-то типа мавеновского provided, который говорит, что какую-то зависимость надо брать с application сервера. Но тут же пишут, что в рантайме классы будут не доступны. Видимо это неверное предположение

Пример: lombok
15 май 19, 14:51    [21885366]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
alex55555
Member

Откуда:
Сообщений: 2099
questioner
Как я понял это значит что во время компиляции зависимый модуль должен присутствовать, но в райнтайме он может и не присуствовать.

1. Как такое может быть?
2. Зачем такое надо?

Покажи место в доке, из которой ты "так понял".
15 май 19, 17:27    [21885612]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
questioner
Member

Откуда:
Сообщений: 1626
alex55555
questioner
Как я понял это значит что во время компиляции зависимый модуль должен присутствовать, но в райнтайме он может и не присуствовать.

1. Как такое может быть?
2. Зачем такое надо?

Покажи место в доке, из которой ты "так понял".


В доке не покажу, но покажу вот что:

https://blog.codefx.org/java/module-system-optional-dependencies/
When a module needs to be compiled against types from another module but does not want to depend on it at run time, it can use a requires static clause.
16 май 19, 14:08    [21886249]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
questioner
Member

Откуда:
Сообщений: 1626
vsl
questioner
Изначально подумал, что это что-то типа мавеновского provided, который говорит, что какую-то зависимость надо брать с application сервера. Но тут же пишут, что в рантайме классы будут не доступны. Видимо это неверное предположение

Пример: lombok


А это хорошо.

Только я понимаю, что например в 8-ке такого нет ибо всё в classpath или я ошибаюсь?
16 май 19, 14:10    [21886252]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
questioner
Member

Откуда:
Сообщений: 1626
https://www.baeldung.com/java-9-modularity
Sometimes we write code that references another module, but that users of our library will never want to use.

For instance, we might write a utility function that pretty-prints our internal state when another logging module is present. But, not every consumer of our library will want this functionality, and they don’t want to include an extra logging library.

In these cases, we want to use an optional dependency. By using the requires static directive, we create a compile-time-only dependency:

module my.module {
    requires static module.name;
}


Как-то вообще не понятно нахрена вообще добавлять зависимость тогда.
16 май 19, 19:32    [21886603]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
забыл ник
Member

Откуда:
Сообщений: 2687
Разжевано же отлично, что опять непонятно?
16 май 19, 21:22    [21886645]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
questioner
Member

Откуда:
Сообщений: 1626
забыл ник
Разжевано же отлично, что опять непонятно?


А что понятно то ? давайте перфразирую то, как я понял прочитанное:

Мы пишем модуль my.lib, который
requires foo.module
, но пользователи не хотят использовать, видимо foo.module

Мне это уже кажется странным ибо модули это про инкапсуляцию и пользователей модуляmy.lib не должны волновать его зависимости.

For instance, we might write a utility function that pretty-prints our internal state when another logging module is present. But, not every consumer of our library will want this functionality, and they don’t want to include an extra logging library.

In these cases, we want to use an optional dependency. By using the requires static directive, we create a compile-time-only dependency:


Вот это я вообще не понял. У нашего модуля есть какой-то функционал, но пользователи нашего модуля не хотят его использовать. Ну значит не вызывайте функцию. Ну либо вообще не подключайте наш модуль.
17 май 19, 11:43    [21887073]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
забыл ник
Member

Откуда:
Сообщений: 2687
questioner

Мне это уже кажется странным ибо модули это про инкапсуляцию и пользователей модуляmy.lib не должны волновать его зависимости.

Что странного? Условный хибернейт зависит от коммонс-логгинг, коммонс-лэнг, коммонс-коллекшнс и кучи другого шлака, не пистаь же им все самим. Но чтобы скомпилировать проект они нужны. Это называется транзитивные депенденси. У пользователя модуля mylib есть три возможности - 1) полагаться на авторов хибернейта и тянуть все транзитивные зависимости 2) предоставить свои версии библиотек или интерфейсов(Да, как provided в мавене) 3) Либо предоставить только часть либ, если есть уверенность, что они не буду использовать функционал, который зависит от опциональных депенденсей.

For instance, we might write a utility function that pretty-prints our internal state when another logging module is present. But, not every consumer of our library will want this functionality, and they don’t want to include an extra logging library.

In these cases, we want to use an optional dependency. By using the requires static directive, we create a compile-time-only dependency:

questioner
Вот это я вообще не понял. У нашего модуля есть какой-то функционал, но пользователи нашего модуля не хотят его использовать. Ну значит не вызывайте функцию. Ну либо вообще не подключайте наш модуль.

А как ты узнаешь какую функцию вызывать а какую нет? Optional - просто способ декларативно разделить тразитивные депенденси которые жизнеенно необходимы модулю, и второстепенные, которые необходимы в редких случаях, и которое нужно подключать самостоятельно
17 май 19, 11:56    [21887089]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
questioner
Member

Откуда:
Сообщений: 1626
забыл ник
questioner
Мне это уже кажется странным ибо модули это про инкапсуляцию и пользователей модуляmy.lib не должны волновать его зависимости.

Что странного? Условный хибернейт зависит от коммонс-логгинг, коммонс-лэнг, коммонс-коллекшнс и кучи другого шлака, не пистаь же им все самим. Но чтобы скомпилировать проект они нужны. Это называется транзитивные депенденси. У пользователя модуля mylib есть три возможности - 1) полагаться на авторов хибернейта и тянуть все транзитивные зависимости 2) предоставить свои версии библиотек или интерфейсов(Да, как provided в мавене) 3) Либо предоставить только часть либ, если есть уверенность, что они не буду использовать функционал, который зависит от опциональных депенденсей.

For instance, we might write a utility function that pretty-prints our internal state when another logging module is present. But, not every consumer of our library will want this functionality, and they don’t want to include an extra logging library.

In these cases, we want to use an optional dependency. By using the requires static directive, we create a compile-time-only dependency:

questioner
Вот это я вообще не понял. У нашего модуля есть какой-то функционал, но пользователи нашего модуля не хотят его использовать. Ну значит не вызывайте функцию. Ну либо вообще не подключайте наш модуль.

А как ты узнаешь какую функцию вызывать а какую нет? Optional - просто способ декларативно разделить тразитивные депенденси которые жизнеенно необходимы модулю, и второстепенные, которые необходимы в редких случаях, и которое нужно подключать самостоятельно


Какая-то путаница пошла. Есть 3 requires(отсортированы по усилению)
1. requires static(зависимость обязательна только на стадии компиляции)
2. requires(зависимость обязательна как на стадии компиляции так и в райнтайме)
3. requires transitive(Если A reqires B, B transitive requres C, то A может свободно пользоваться С как в райнтайме, так и при компиляции)
17 май 19, 13:02    [21887169]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
alex55555
Member

Откуда:
Сообщений: 2099
questioner
В доке не покажу, но покажу вот что:

https://blog.codefx.org/java/module-system-optional-dependencies/
When a module needs to be compiled against types from another module but does not want to depend on it at run time, it can use a requires static clause.

Ну как бы тогда всё очевидно - непонятно зачем выбран инструмент и его изучение основано на непонятном же блоге некоего перца, который по каждой второй ссылке впаривает свою книжку по данному инструменту. То есть выход там простой - отдать денег пейсателю блога. И выход предлагается по каждой второй ссылке. Так почему ты не отдал денег и не прочитал книжку? И не прочитав, надеешься что-то понять здесь.

В общем обычно вменяемые люди находят вменяемые источники информации. Твой блоггер - невменяемый источник. Он тупо хочет денег. Я такие блоги после первых же пары предложений забываю навсегда. Но раз тебе понравилось, ну выход же очевиден - купи книжку, отдай денег, поиграй в игру с этим блоггером по его же правилам и за твои, естественно, деньги.
17 май 19, 13:11    [21887182]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
questioner
Member

Откуда:
Сообщений: 1626
забыл ник
Условный хибернейт зависит от коммонс-логгинг, коммонс-лэнг, коммонс-коллекшнс и кучи другого шлака, не пистаь же им все самим. Но чтобы скомпилировать проект они нужны. Это называется транзитивные депенденси. У пользователя модуля mylib есть три возможности -
1) полагаться на авторов хибернейта и тянуть все транзитивные зависимости
2) предоставить свои версии библиотек или интерфейсов(Да, как provided в мавене)
3) Либо предоставить только часть либ, если есть уверенность, что они не буду использовать функционал, который зависит от опциональных депенденсей.

по 1-ому пункту: В джаве до 9-ки ведь нет возможности не тянуть транзитивные зависимости? ну кроме как exclude?

по 2-ому пункту: Не понятно только как хибернейт поймёт брать коммонс логгинг(который его прямая зависимость) или SLF4J, который я подключил?

по 3-ему пункту: НЕ понял
17 май 19, 13:16    [21887188]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
questioner
Member

Откуда:
Сообщений: 1626
Ну вот я могу представить, что в модуле А написан код формата:
1. Пытаемся загрузить класс через класслоадер
2. Если загрузился, то через рефлекшн грузим всё что нам надо и используем классы, но это какая-то дикость по-моему
3. Если не загрузился, то скипаем часть логики.


Выглядит неправдоподобно
17 май 19, 16:11    [21887458]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
забыл ник
Member

Откуда:
Сообщений: 2687
1) в либе есть метод toJson(Object:obj)
2) В клиенте просто вызываем toJson и получаем обхект Json. все довольны
3) Приходит баг что в toJson чтото работает не так
4) Разработчики либы хотят продебажить, но логика настолько сложна, что они решили каждый шаг запротоколировать , для этого в toJson добавили код if(config.enabledDebug) someMonitoringLib(toJson) else toJson
5) Им для монитроинга нужна стороння лиюа в редких случаях, а обычному пользователю нет
17 май 19, 16:17    [21887468]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
questioner
Member

Откуда:
Сообщений: 1626
забыл ник
1) в либе есть метод toJson(Object:obj)
2) В клиенте просто вызываем toJson и получаем обхект Json. все довольны
3) Приходит баг что в toJson чтото работает не так
4) Разработчики либы хотят продебажить, но логика настолько сложна, что они решили каждый шаг запротоколировать , для этого в toJson добавили код if(config.enabledDebug) someMonitoringLib(toJson) else toJson
5) Им для монитроинга нужна стороння лиюа в редких случаях, а обычному пользователю нет


Хорошо, обычному пользователю по сути не нужна зависимость на someMonitoringLib, если enabledDebug выставлен в false и в рантайме проблем не будет. Если вдруг мы тоже хотим оддебажить эту либу, то нам надо будет добавить зависимость явно(requires).Выглядит разумно.

То есть мы по сути экономим на размере зависимостей модуля? jar потоньше будет?
17 май 19, 16:33    [21887478]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 326
[quot забыл ник]
questioner
Условный хибернейт зависит от коммонс-логгинг, коммонс-лэнг, коммонс-коллекшнс и кучи другого шлака, не пистаь же им все самим. Но чтобы скомпилировать проект они нужны. Это называется транзитивные депенденси.

зачем? вы разве собираетесь сами еще и хибернейт компилировать?
17 май 19, 17:35    [21887521]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
Можно собирать две сборки. По аналогии с драйверами jdbc. Релизная (.jar). И отладочная (_g.jar). Отладочная соотв
флудит с уровнем TRACE детально всё что есть. Релизная вообще не содержит обращений к логгированию. И релизная
потоньше будет.
17 май 19, 17:57    [21887531]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38540
mayton,
Это если он драйвер пишет))
17 май 19, 19:01    [21887566]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужны optional зависимости?(которые есть в компайл тайме, но их нет в рантайме)  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
А что он пишет в самом деле?
17 май 19, 19:12    [21887580]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить