1 Обзор
Apache Maven, представляет собой программное обеспечение (особенно программное обеспечение Java) для управления проектами и инструмент автоматической сборки. В древности без Maven внедрение jar-пакетов в проект нужно было загружать один за другим вручную, но с увеличением количества кодов количество вводимых jar-пакетов, естественно, увеличивалось, а затем и проблема jar-пакетов. конфликты пакетов.
2. Причины конфликтов пакетов jar
Как мы все знаем, в проекте не может существовать двух классов с одним и тем же полным именем класса, а сущностью jar-пакета является упакованный файл класса, например:
будетjunit-jupiter-api-5.6.2.jar
После распаковки файла
Можно получить несколько файлов классов, поэтому в проекте не может быть двух пакетов jar с двумя именами.
В то же время между пакетами 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, как показано на следующем рисунке: Конечно, мы можем просмотреть полное дерево зависимостей через инструменты IDEAL и maven:
Или экспортируйте информацию дерева зависимостей в локальный:
mvn dependency:tree > a.txt
Как показано ниже:
Поэтому по мере того, как наш проект становится больше, количество вводимых файлов пакетов 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>
разница?
Для теста это означает, что зависимость работает только в тестовом классе, то есть по пути 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. Хороший обмен книгами
- 1. "Maven Combat" --- адрес загрузки:GitHub.com/Лю Синьву420302/Нет…