2014-02-10 5 views
2

У меня есть проект с различными классами и пакетами в качестве зависимостей. Обратите внимание, что все записи ниже встречаются в одном проекте.Java 6 runtime не переопределяет класс, вызванный из-за зависимости .jar

У меня есть класс, который в какой-то момент запускает код getDiagramPanel().setRelationsPaintOrder(new Comparator() {.

getDiagramPanel() вызывает метод от DjtSheet.class, который находится в файле .jar зависимости. Этот метод возвращает объект DjtDiagramPanel. У меня также есть файл DjtDiagramPanel.java, который должен переопределить один из пакета и содержит метод setRelationsPaintOrder().

В Java 7 это работает нормально. Он корректно вызывает метод из зависимости, который возвращает объект в формате класса, который переопределяет класс панели из пакета зависимостей.

В Java 6, однако, класс панели из пакета зависимостей возвращается вместо одного из моего проекта.

java.lang.NoSuchMethodError: com.dlsc.djt.gantt.DjtDiagramPanel.setRelationsPaintOrder(Ljava/util/Comparator;)V

Обратите внимание, что это сообщение встречается во время выполнения! Компиляция проекта не дает ошибок.

Как я могу это решить?

+1

У вас есть другая версия фляги во время выполнения и в compiletime. Проверьте путь пути выполнения. – Kayaman

+0

Как вы запускаете приложение? Используете ли вы скрипт или какую-то рабочую структуру? – AlexR

+0

@ Kayaman Eclipse показывает мне, что для параметра 'Java Compiler' установлено значение' JavaSE-1.6'. Я убедился, что это происходит путем stting 'maven-compiler-plugin' в моем pom.xml до' 1.6'. В конфигурациях Debug JRE также используется для 'JavaSE-1.6' (jre6) (я должен признать, что я еще не делал последнего, хотя я думал, что сделал, но, к сожалению, ошибка сохраняется). – Joetjah

ответ

0

Эта проблема определенно означает, что у вас есть проблема в пути к классу. Я предполагаю, что проблема в том, что класс DjtDiagramPanel дублируется, и у вас есть 2 разных вериона: тот, у которого есть метод setRelationsPaintOrder, и второй, который не имеет. Очевидно, вы компилируете код против «хорошей» версии и бегаете против «плохого».

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

Сначала найдите эти 2 версии того же класса. Затем найдите, как плохая версия прибыла в ваш путь к классам. Обычно это происходит из-за зависимостей третьей стороны. Если вы используете maven, вы можете использовать плагин зависимостей, чтобы найти основную причину и отключить его с помощью тега «исключение».

+0

Благодарим вас за ввод. Правильно, у меня две разные версии. Один из них находится в зависимости, которую я использую от 3-го партийного издателя, а другой - в моем проекте. Мне нужен один из моего проекта, чтобы переопределить его из зависимости. Это, похоже, работает на Java 7, но не при работе на Java 6. Что вы подразумеваете в точности с «поиском первопричины»? Я не верю, что могу исключить конкретный класс в зависимости, не так ли? – Joetjah