Конструктор Eclipse несовместим с m2Eclipse и Maven

Я вижу проблему, когда данный исходный файл, созданный Maven, создает файл класса, отличный от файла, созданного Eclipse.

Конструктор Eclipse оптимизирует следующий метод:

public SomeClass clone() {
    SomeClass clone = (SomeClass) super.clone();
    return clone;
}

Этот метод явно не нужен, но у меня нет возможности изменить источник, потому что он генерируется.

Какой компоновщик использует Eclipse для компиляции этих классов? Я использую плагин m2Eclipse, который, как я думал, только что вызвал Maven для выполнения сборки. Почему тогда Eclipse думает, что ему нужно выполнить еще одну сборку с другим компоновщиком? Могу ли я отключить этот построитель Eclipse или настроить его для предотвращения оптимизации?

  • Версия затмения: 3.7
  • Версия m2Eclipse: 1.0.100.20110804-1717 (настроена на использование внешнего Maven)
  • Версия Мавена: 2.2.1

Обновить

Я нашел отчет об ошибке Eclipse, в котором описывается, что происходит. Чтобы уточнить, на самом деле это не компилятор Eclipse, который удаляет что-либо, он просто не вводит синтетический метод «моста», который вводит стандартный компилятор JDK. Отчет об ошибке помечен как «Решено — не будет исправлено».

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


person KevinS    schedule 22.09.2011    source источник


Ответы (2)


Вы можете попробовать отключить Java Builder, если он настроен для проекта. Вы можете проверить это, нажав на вкладку Builders в Project -> Properties.

Из справки Eclipse...

Компоновщик Java создает программы Java с помощью собственного компилятора (компилятор Eclipse для Java), который реализует спецификацию языка Java.

person Raghuram    schedule 23.09.2011
comment
Спасибо за предложение. К сожалению, отключение Java Builder вызвало другие проблемы с разрешением рабочей области из других проектов Java. - person KevinS; 23.09.2011

У меня нет Eclipse 3.7, но я ожидаю, что эти вещи не изменились с 3.6. Если вы откроете Properties -> Builder в своем проекте, вы увидите, что Maven Builder идет последним или, по крайней мере, после Java Builder. Это означает, что когда Maven Builder видит ваши исходные файлы Java, они уже скомпилированы. Кстати, настроенный вами внешний Maven используется только при выполнении команды «Запуск от имени ->», а не при сборке с помощью Maven.

Все это говорит о том, что то, что вы видите, скорее всего, связано с тем, что при компиляции из Eclipse используется внутренний компилятор Java, в то время как при запуске Maven из командной строки я ожидаю, что используется компилятор JDK, в зависимости от того, что вы установили. Я не думаю, что вы можете что-то сделать, чтобы изменить это положение вещей. Одна вещь, которую вы можете попробовать, - это убедиться, что их поведение максимально близко, указав в вашем POM, какая версия Java должна быть совместима, добавив что-то вроде

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>2.3.2</version>
  <configuration>
    <source>1.6</source>
    <target>1.6</target>
  </configuration>
</plugin>

В раздел сборки.

Должен сказать, что я ожидал, что компилятору Java не разрешается удалять общедоступные методы из классов, даже если они бесполезны.

person Nicola Musatti    schedule 23.09.2011
comment
Спасибо за отзыв @Nicola. У нас есть конфигурация плагина, которую вы упомянули. Я нашел дополнительную информацию в сообщении об ошибке Eclipse. Смотрите мое обновление к исходному вопросу. - person KevinS; 23.09.2011