Pull to refresh

Comments 8

Я правильно понимаю что модуляризованные JDK позволит в одном проекте (но разных модулях) использовать разные версии одной и той же библиотеке, то есть модуляризованные JDK это некий аналог OSGI и ей подобных технологий?
Class.forName(String className) will throw ClassNotFoundException if the Class object for the given string name cannot be found, which may be because the class, that is visible in classpath mode, is no longer visible in module mode. For example, if module B depends on (requires) module A then only the classes that module A exports are visible to classes in module B.

openjdk.java.net/projects/jigsaw/doc/jdk-modularization-tips

Как я понял, нужны разные имена для модулей. Если модуль один и тот же, но разные версии, то не выйдет ничего. Придется писать модуль-обертку.
Кажется, об этом автор собирается написать во второй части
То, чего давно не хватает.
Щас разберемся. Вопросы следующие:

1. Рантайм грузит каждый модуль собственным classloader-ом, как OSGI? Или как раньше все в общем супе?
2. Как обстоят дела с версионированием модулей и сожительством одинаковых классов разных версий?
3. Что насчет экспорта/импорта ресурсов? ClassLoader.getResources() ищет только экспортнутые ресурсы по всем загруженным модулям, или только в текущем и импортнутых?
4. Экспортирование транзитивно?
5. Я хочу «наследовать» чей-то модуль, т.е. сделать свой модуль, добавив в него пару классов (или перекрыв старые). При этом, ессно, его приватная часть должна быть доступна. Можно ли это?
5. И, наконец, как я понял, импортируемый модуль должен иметь доступ ко всем классам импортирующего. Иначе это нарушит работу кучи библиотек и API. Пример:
JAXBContext jc = JAXBContext.newInstance( «com.acme.foo» );
JAXBContext лежит модуле в java.xml.bind, но доменные классы в com.acme.foo. То есть классы из com.acme.foo должны быть доступны модулю java.xml.bind, даже если он не импортирует модуль com.acme.foo.

6. И наконец, где и как вообще рантайм проверяет private/export class checking? Это фича исключительно classloader-а при резольвинге класса, или вообще JVM следит за тем, чтобы везде и всегда visibility не нарушалась?

Например, я вызываю из своего модуля метод объекта из другого модуля:

servicemodule.AnyService.anyMethod(params) throws AnyException

Все хорошо, все export-нуто. Но внезапно AnyException.getCause() содержит внутренний эксепшн из другого модуля, который не импортирован. Если рантайм на это не выругается, то есть возможность получить ссылку на ClassLoader импортируемого модуля и загрузить любой внутренний класс: AnyException.getCause().getClass().getClassLoader().loadClass()
Коварные вопросы задаете :) Особенно про Exception.

Я, ковыряя OSGI, пытался его сломать (была надобность сделать нечто, что там запрещено), мне не удалось это. Не возьму в толк, почему OSGI нельзя было взять за основу — он же отлажен отлично… Сложный, что ли?
4. Экспортирование транзитивно?

Судя по разделу «Подразумеваемая считываемость», по умолчанию нет. Транзитивность включается использованием
requires public <module>

Отличная вещь, но такое уже есть. Называется OSGI Bundles. Загружается с помощью библиотеки Equinox, содержащей в себе специальный ClassLoader.

Технологии сто лет в обед, на ней построен Eclipse.

Хотя нативная поддержка модульности в компиляторе — правильный путь развития…
Sign up to leave a comment.