Сбой компиляции из-за ненужной зависимости зависимости

#java #eclipse

#java #eclipse

Вопрос:

Я пытаюсь скомпилировать свой проект maven, и я завишу от другого проекта (который является файлом jar). По какой-то причине, когда я пытаюсь скомпилировать, я получаю следующую ошибку, которая, по-видимому, заключается в том, что мой проект не может получить доступ к требуемым зависимостям проекта, от которого я зависю, хотя я не использую ни одну из этих зависимостей.

Вот ошибка http://hastebin.com/pebolozuxi.sql

 [INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /C:/Users/cneth/Desktop/Developing/PrimeMC/PrimeMobWhacker/src/main/java/org/primemc/MobWhackerManager.java:[315,34] cannot access tech.rayline.core.plugin.RedemptivePlugin
  class file for tech.rayline.core.plugin.RedemptivePlugin not found
[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.892 s
[INFO] Finished at: 2016-10-07T14:56:20 03:00
[INFO] Final Memory: 25M/298M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.5.1:compile (default-compile) on project MobWhacker: Compilation failure
[ERROR] /C:/Users/cneth/Desktop/Developing/PrimeMC/PrimeMobWhacker/src/main/java/org/primemc/MobWhackerManager.java:[315,34] cannot access tech.rayline.core.plugin.RedemptivePlugin
[ERROR] class file for tech.rayline.core.plugin.RedemptivePlugin not found
  

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

Спасибо!

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

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

2. У вас есть доступ к исходному коду? Найдите этот класс tech.rayline.core.plugin. RedemptivePlugin, набрав ctrl shift t и введя RedemptivePlugin в breadcrump eclipse, отобразит связанные jar и версию

3. @Thomas Хорошо, извините. Я сделаю это в следующий раз. Обычно я это делаю, но эта ошибка выглядела немного раздражающей для чтения, когда я попытался опубликовать ее здесь.

4. Итак, что происходит в строке 315 MobWhackerManager.java ?

5. @Thomas Я вызываю метод из одной из моих зависимостей, которая зависит от содержащегося проекта RedemptivePlugin.java . (Публикация исходного кода больше не поможет, это буквально просто метод с нерелевантным именем). Мой проект явно не использует RedemptivePlugin.java , однако проект, из которого я вызываю метод, использует. Означает ли это, что моему проекту нужен доступ к RedemptivePlugin.java проекту?

Ответ №1:

Это не имеет ничего общего с Maven. Компилятор java хочет этот класс. MobWhackerManager.java:[315,34] , на самом деле, хочет этот класс. Номер строки прямо там. Ваш код в строке 315 каким-то образом ссылается на этот класс.

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

1. Итак, ссылка на класс, на который ссылается RedemptivePlugin.java , требует RedemptivePlugin.java , чтобы проект был зависимостью от моего проекта?

2. Не видя кода на уровне 315 этого класса, я не могу разобраться с вами дальше. Но, в общем, если вы объявляете поле, вызываете метод, что угодно, да, компилятору нужно увидеть файл .class, чтобы сообщить, как его скомпилировать. возможно, вы вызываете что-то, что возвращает объект этого типа.

3. PrimeSpawnerTiers.getInstance().getSpawnerTracker().getSpawnerMobs().dropLoot(event.getKilledEntity(), (stacked - newStacked) * getLootMultiplier(data));

4. Это строка, однако она довольно неуместна. Важно то, что сама зависимость PrimeSpawnerTiers зависит от RedemptivePlugin.java , но мой проект напрямую не использует RedemptivePlugin.java .

5. Я просто RedemptivePlugin.java добавил jar к своим зависимостям, и это решило проблему. Я просто задал исходный вопрос в надежде, что есть лучший способ, но я не понимал, что мне нужны все ссылочные зависимости, доступные java. Спасибо за помощь, хотя 🙂

Ответ №2:

Попробуйте исключить ненужную транзитивную зависимость https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html

Ответ №3:

Ваша ошибка говорит о том, что компилятор пропускает класс tech.rayline.core.plugin.RedemptivePlugin .

Поэтому вам, вероятно, нужно добавить jar с этим классом в ваши зависимости Maven.

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

1. Я понимаю это, но мой исходный код ничего не импортирует из этого проекта. Я просто вызываю метод из одной из моих зависимостей, которая зависит от проекта, содержащего этот класс. Я собираюсь в конечном итоге добавить эту зависимость как одну из своих собственных, чтобы решить эту ошибку, но я надеялся, что есть лучший способ решить эту проблему.

2. В этом и есть суть: вам нужно иметь все классы, которые транзитивно используются вашим проектом, т. Е. Также Классы, которые используются классом, который используется классом, который используется вами. В противном случае вы не сможете скомпилировать. Но это именно то, для чего предназначены Maven или Gradle: автоматический сбор всех переходных зависимостей.

Ответ №4:

Из вашего последнего комментария я понимаю, что вам нужен jar, содержащий RedemptivePlugin, поэтому вы должны его сохранить. В худшем случае загрузите его вручную с правильной версией и поместите в свой .m2 с правильным путем

предыдущий ответ
Просто чтобы иметь возможность помочь:
вы проверили наличие нужного jar в вашем .m2?
Вы проверили все зависимости вашего проекта, чтобы точно указать, что вам не нужен jar, содержащий класс tech.rayline.core.plugin.RedemptivePlugin.

Если вы уверены в этом, попробуйте:

 <dependencies>
    <dependency>
      <groupId>The Project Jar That Links You To RedemptivePlugin Jar</groupId>
      <artifactId>Project</artifactId>
      <version>TheVersion</version>
      <exclusions>
        <exclusion>
          <groupId>The Jar containing RedemptivePlugin</groupId>
          <artifactId>theJar</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
  

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

1. Из вашего последнего комментария я понимаю, что вам нужен jar, содержащий RedemptivePlugin, поэтому вы должны его сохранить. В худшем случае загрузите его вручную с правильной версией и поместите в свой .m2 с правильным путем

2. Jar, от которого я зависю, на самом деле зависит от другого jar, который затемняется в jar RedemptivePlugin (немного длинная цепочка зависимостей, но должно быть понятно). Я просто надеялся, что у меня есть способ напрямую не зависеть от jar RedemptivePlugin, поскольку я напрямую не использую его в своем проекте. Однако я предполагаю, что это требуется для моего пути сборки, даже если я не использую его напрямую.