Принцип и решение конфликта пакетов Maven

maven

1 Обзор

\quad Apache Maven, представляет собой программное обеспечение (особенно программное обеспечение Java) для управления проектами и инструмент автоматической сборки. В древности без Maven внедрение jar-пакетов в проект нужно было загружать один за другим вручную, но с увеличением количества кодов количество вводимых jar-пакетов, естественно, увеличивалось, а затем и проблема jar-пакетов. конфликты пакетов.

2. Причины конфликтов пакетов jar

\quadКак мы все знаем, в проекте не может существовать двух классов с одним и тем же полным именем класса, а сущностью jar-пакета является упакованный файл класса, например: будетjunit-jupiter-api-5.6.2.jarПосле распаковки файла

Можно получить несколько файлов классов, поэтому в проекте не может быть двух пакетов jar с двумя именами.

\quadВ то же время между пакетами jar будет взаимозависимость, просто возьмите этоjunit-jupiter-api-5.6.2.jarПример: Координаты помпа:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.6.2</version>
    <scope>test</scope>
</dependency>

Затем вы можете найти подробную информацию о пакете jar в центральном репозитории maven по адресу:https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.6.2/

Откройте файл .pom, чтобы увидеть, на какие другие пакеты jar ссылается пакет jar, как показано на следующем рисунке: \quadКонечно, мы можем просмотреть полное дерево зависимостей через инструменты IDEAL и maven:

Или экспортируйте информацию дерева зависимостей в локальный:

 mvn dependency:tree > a.txt

Как показано ниже:

\quadПоэтому по мере того, как наш проект становится больше, количество вводимых файлов пакетов jar постепенно увеличивается, а также будет увеличиваться вероятность конфликтов пакетов.Мы не можем невооруженным глазом найти конфликты пакетов в проекте. Конечно, мы можем использовать некоторые подключаемые модули инструментов, которые помогут нам найти конфликты jar-пакетов в проекте, такие какMaven Helper.

3. Внедрите плагины для разрешения конфликтов

Возьмите этот проект в качестве примера:

График зависимости выглядит следующим образом:

Мы знаем, что когда два jar-пакета конфликтуют, принцип выбора заключается в том, кто ближе всего к проекту, поэтому spring-web в итоге выберет версию 5.1.8. Это также можно увидеть из CLASSPATH в команде запуска:

"D:\software\IDEA IU\IntelliJ IDEA 2019.3\jbr\bin\java.exe" "-javaagent:D:\software\IDEA IU\IntelliJ IDEA 2019.3\lib\idea_rt.jar=50098:D:\software\IDEA IU\IntelliJ IDEA 2019.3\bin" -Dfile.encoding=UTF-8 -classpath D:\GitHub_Item\resolve-package-conflict\target\classes;
C:\Users\DELL\.m2\repository\org\springframework\spring-web\5.1.8.RELEASE\spring-web-5.1.8.RELEASE.jar;
C:\Users\DELL\.m2\repository\org\springframework\spring-beans\5.1.8.RELEASE\spring-beans-5.1.8.RELEASE.jar;
C:\Users\DELL\.m2\repository\org\springframework\spring-core\5.1.8.RELEASE\spring-core-5.1.8.RELEASE.jar;
C:\Users\DELL\.m2\repository\org\springframework\spring-jcl\5.1.8.RELEASE\spring-jcl-5.1.8.RELEASE.jar;
C:\Users\DELL\.m2\repository\com\github\hcsp\test-library-a\0.4\test-library-a-0.4.jar Main

Зависимости, добавленные в ps:pom.xml, будут кэшированы Maven в локальном репозитории .m2 и добавлены в CLASSPATH.
Анализ с использованием плагина Maven Helper:В зависимости от ваших потребностей выберите версию, которую вы хотите исключить:

Плагин поможет нам устранить конфликтующие импорты в файле pom.xml:

нажмитеReimportкнопку, вы можете видеть, что конфликт был разрешен.

4. Внедрите глубокое обучение

4.1 <scope>test</scope>а также<scope>compile</scope>разница?

\quadДля теста это означает, что зависимость работает только в тестовом классе, то есть по пути src/main/test, в других путях компилятор не будет вводить зависимость. Нет ограничений на компиляцию, доступную как в src/main/java, так и в src/mian/test.

4.2 <scope>provided</scope>Что это значит?

Например:

    public static void main(String[] args) throws IOException {
        Workbook workbook = new HSSFWorkbook(new FileInputStream("C:\\Users\\DELL\\Desktop\\new.xlsx"));
    }

Внесите необходимые зависимости в pom.xml:

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
            <scope>provided</scope>
        </dependency>

Но когда я нажимаю запустить, он сообщит:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/hssf/usermodel/HSSFWorkbook
	at Main.main(Main.java:10)
Caused by: java.lang.ClassNotFoundException: org.apache.poi.hssf.usermodel.HSSFWorkbook
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	... 1 more

Класс не найден проблема из-за настройки<scope>provided</scope>Это означает, что зависимость находится только в CLASSPATH во время компиляции и не добавляется в CLASSPATH во время выполнения. Обычно он используется, когда CLASSPATH уже установлен в работающей среде и его не нужно добавлять, например, Tomcat.

5. Хороший обмен книгами