View on GitHub

blog

Руководство по загрузке классов Maven

Это описание иерархии загрузчиков классов в Maven. Обзор

  1. Системный загрузчик классов
  2. Основной загрузчик классов
  3. Плагин Classloaders
  4. Пользовательские загрузчики классов

Системный загрузчик классов

Maven использует платформу загрузки классов Plexus Classworlds, с помощью которой мы создаем наш граф загрузчика классов. Если вы заглянете в свой каталог ${maven.home}/boot, вы увидите единственный JAR, который является JAR Classworlds, который мы используем для загрузки графа загрузчика классов. JAR Classworlds является единственным элементом Java CLASSPATH, и Classworlds затем создает другие загрузчики классов или области в терминологии Classworlds.

Сценарий Ant, подобный этому, покажет содержимое системного загрузчика классов:

<target name="info">
    <echo>java.class.path=${java.class.path}</echo>
</target>

Основной загрузчик классов

Второй загрузчик классов на графике содержит основные требования Maven. Точнее, у основного загрузчика классов есть библиотеки в ${maven.home}/lib. В общем, это просто библиотеки Maven, например. экземпляры MavenProject принадлежат этому загрузчику классов. Мы надеемся разделить их в будущем, чтобы они были просто API Maven и чтобы реализации выбирались во время выполнения в соответствии с требованиями системы.

Вы можете добавлять элементы в этот загрузчик классов с помощью расширений. Они загружаются в то же место, что и ${maven.home}/lib, и, следовательно, доступны для ядра Maven и всех плагинов для текущего и последующих проектов (в будущем мы планируем удалить его из последующих проектов).

Плагин Classloaders

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

Пользователи могут добавлять зависимости к этому загрузчику классов, добавляя зависимости к плагину в разделе plugins/plugin своего проекта pom.xml. Вот пример добавления ant-nodeps в загрузчик классов подключаемого модуля Antrun Plugin и, таким образом, позволяющий использовать дополнительные / необязательные задачи Ant:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.3</version>
    <dependencies>
    <dependency>
        <groupId>org.apache.ant</groupId>
        <artifactId>ant-nodeps</artifactId>
        <version>1.7.1</version>
    </dependency>
    </dependencies>
    ...
</plugin>

Плагины могут проверять свой эффективный путь к классу среды выполнения с помощью выражений ${plugin.artifact} или ${plugin.artifactMap}, чтобы получить список или карту разрешенных артефактов, вводимых из PluginDescriptor, соответственно.

Обратите внимание, что загрузчик классов плагина не содержит ни зависимостей текущего проекта, ни результатов его сборки. Вместо этого плагины могут запрашивать путь компиляции, времени выполнения и тестового класса проекта из MavenProject в сочетании с аннотацией mojo requiresDependencyResolution из Спецификации API Mojo. Например, пометка mojo с помощью среды выполнения @requiresDependencyResolution позволяет ей запрашивать путь к классу среды выполнения текущего проекта, из которого он может создавать дополнительные загрузчики классов.

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

Пользовательские загрузчики классов

Плагины могут создавать дополнительные загрузчики классов по своему усмотрению. Например, подключаемый модуль может захотеть создать загрузчик классов, который объединяет путь к классу подключаемого модуля и путь к классу проекта.

Важно понимать, что загрузчик классов плагина не может загружать классы из любого из этих пользовательских загрузчиков классов. Некоторые заводские выкройки требуют этого. Здесь вы должны добавить классы в загрузчик классов плагина, как показано ранее.