Выберите, какую зависимость использовать в классе

#java #maven

#java #maven

Вопрос:

Я хочу использовать класс, и в моем pom есть две зависимости, которые его поддерживают: dependency1 и dependency2. Использование класса с dependency1 привело к сбою моей программы, поэтому я полностью удалил его из pom и оставил dependency2 таким, каким он был, и код работал. Как мне сказать maven создать мой класс с dependency2, а не с dependency1, не удаляя dependency1 (в случае, если dependency1 содержит что-то, что я хочу использовать в своем коде позже)?

Комментарии:

1. Вызывая clean build ? Я не уверен, что понимаю, чего вы хотите. Артефакт для зависимости останется в локальном кэше maven (например, в каталоге .m2) на вашем компьютере, если вы захотите использовать его позже (т. Е. Вы Снова добавите его в свой pom или используете в другом проекте), вам не нужно загружать его из удаленного репозиторияснова. Также убедитесь, что ваш импорт ссылается на зависимость, которую вы хотите использовать.

Ответ №1:

Вы не можете разумно использовать две библиотеки, которые содержат классы с одинаковыми именами классов.

Итак

  • либо ограничьтесь одним из них.
  • или используйте плагин Maven shade для перемещения пакетов одной из зависимостей.

Ответ №2:

когда вы импортируете зависимость в свой соответствующий класс, просто проверьте весь адрес зависимости (всю структуру пакета) и убедитесь, что вы используете зависимость от зависимости2.

Кроме того, если вы удалили dependency1 из pom.xml , maven не поместит dependency1 в целевую папку, которая будет сгенерирована при создании проекта.

Ответ №3:

Маловероятно, что один и тот же класс с одинаковым именем пакета будет использоваться в двух разных зависимостях.Поскольку идентификаторы артефактов уникальны для каждой зависимости, даже если она принадлежит одному и тому же groupdId. Итак, если вы решили свою проблему, используя класс dependency2, то это тот класс, который вам нужен. И, как вы спросили, нужна ли вам dependency1 для любой другой задачи, сохраняя dependency1 на вашем pom.xml Это не будет проблемой. Единственное, о чем вам нужно позаботиться, — это импортировать нужный вам класс именно из dependency2.Поэтому, пожалуйста, проверьте свои операторы импорта в классе и посмотрите, импортирует ли он класс из dependency2.

Комментарии:

1. Я собираюсь прокомментировать здесь с дальнейшим объяснением. Я запускаю проект aws-flink, и я ранее импортировал некоторую библиотеку flink (dependency1). Я хотел подключиться к aws и поэтому импортировал основную библиотеку aws-java-sdk (dependency2). Оказывается, библиотека flink содержит тот же класс, что и библиотека aws. Итак, в основном я указал в pom две одинаковые библиотеки, которые могут запускать мой класс. Maven каким-то образом выбирает flink. Мой вопрос заключался в том, как я мог бы сделать так, чтобы maven отдавал предпочтение библиотеке aws, а не какой-либо другой (что, если бы у меня была другая зависимость, предлагающая ту же библиотеку, которая мне нужна?).

2. @PedroGonzalez, эти решения принимает не Maven, а загрузчики классов. Maven просто упаковывает вещи, делая их пригодными для загрузки классов. Смотрите Ответ J Fabian Meier. В идеале вы должны убедиться, что каждый класс находится в пути к классу ровно один раз.