Ключевое новшество технологии JPMS заключается в том, что она
вводит новый элемент в Java. В предыдущих версиях Java были только
семь элементов – классы, интерфейсы, перечисления, аннотации, ошибки,
исключения и пакеты, а начиная с Java SE 9, появляется новый
структурный элемент – модуль. В то время, как пакет является
контейнером классов, интерфейсов, перечислений, аннотаций, исключений
и ошибок, модуль является контейнером пакетов.
В силу того, что модуль стал новым элементом виртуальной машины
Java, среда выполнения обрела возможность строгого контроля доступа. В
Java 8 разработчик может указать, что методы класса не могут быть видны
другими классами, объявив их приватными. В Java 9 разработчик может
указать, что пакет не может быть виден другим модулями, например, пакет
может быть скрыт внутри модуля.
Возможность скрывать пакеты приносит разработчикам широкие
преимущества для проектирования приложения. Например, исчезает
необходимость называть пакеты специальными именами, типа "impl" или
"internal" и в документации к коду указывать, что использование
определенных пакетов запрещено.
В тоже время, создание модуля является относительно простой
задачей. Модуль это обычный .jar файл, который содержит в корне файл
module-info.class. Файл module-info.class создается из файла module-
info.java во время компиляции.
Как указывалось выше, Java 9 для совместимости поддерживает
работу как модульного, так и немодульного кода. В силу этого, в Java 9
для использования модулей был добавлен специальный атрибут – путь
модулей (англ. modulepath), чтобы указывать путь к модулям, в то время,
как для работы с немодульным кодом используется атрибут – путь
классов (англ. classpath). Если модульный .jar файл находится на пути