Ant строит иначе, чем Eclipse - PullRequest
       3

Ant строит иначе, чем Eclipse

1 голос
/ 14 октября 2010

Почему Eclipse компилирует мой проект (автоматически) без ошибок, но когда я запускаю Ant build.xml -> target compile, сборка завершается с ошибкой компиляции:

<MyClass> is not abstract and does not override abstract method <someMethod>

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

Так как же эта проблема возможна?

Ответы [ 4 ]

2 голосов
/ 14 октября 2010

Используете ли вы какие-то специальные расширения для Eclipse, такие как Lombok (может ли это расширение что-то сгенерировать для вас)? Вы используете какой-то специальный фреймворк (может быть фреймворк сгенерирует какой-то класс для вас)?

Что вам также нужно понять, так это Eclipse и Ant, использующие разные компиляторы. Eclipse имеет свой собственный компилятор, который ведет себя по-разному с Sun JDK или с определенной версией Sun JDK. Один из примеров такого поведения можно прочитать здесь . Но прежде чем я сделаю такой вывод, я проверю все имеющиеся у меня конфигурации на моем Eclipse.

1 голос
/ 14 октября 2010

Также возможно, что ваша сборка Ant не настроена так же, как ваша сборка Eclipse.Различные исходные папки, разные JAR-файлы и т. Д. Например, возможно, ваша сборка Eclipse ссылается на старую версию стороннего JAR-файла, а ваша сборка Ant ссылается на новую версию, в которой новый абстрактный метод был добавлен в класс, от которого вы наследуете..

0 голосов
/ 15 октября 2010

Спасибо всем за ваши быстрые ответы. Было очень полезно понять, что Eclipse использует другой компилятор, который многое объяснил.

Что касается моей проблемы - я предположил, что компилятор Java верен и что сборка действительно имела ошибки. При ближайшем рассмотрении выяснилось, что это несовместимость более старой версии Apache Commons DBCP с Java 1.6. Я был уверен, что использовал последнюю версию и обратился к неверной версии документации, в которой говорилось, что необходимые методы были реализованы.

Теперь что касается Eclipse. Ошибка на самом деле сложно. Мне удалось написать тестовый пример, показывающий эту ошибку. Я использую Java 1.6 и Eclipse Helios для Java EE. Я создал проект Java в Eclipse и добавил

com.springsource.org.apache.commons.pool-1.5.3.jar com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar

в classpath (загрузил эти JAR-файлы из репозитория SpringSource). Как видите, Apache Commons DBCP - старый. Java 1.6 требует версии 1.4 +.

В моем тестовом проекте я расширяю org.apache.commons.dbcp.BasicDataSource и дополнительно заявляю, что он должен реализовывать javax.sql.DataSource. Как это:

import org.apache.commons.dbcp.BasicDataSource;
import javax.sql.DataSource;

public class MyDataSource extends BasicDataSource implements DataSource {

}

Сложность в том, что BasicDataSource реализует интерфейс DataSource. Но в версии 1.6 этот интерфейс получил расширение, поэтому новые методы не реализованы. Добавление «реализует DataSource» снова явно должно вызвать и ошибку, о которой Java-компилятор успешно сообщает. Но Eclipse компилирует этот код без предупреждения, и он даже запускается.

Так вот в чем проблема. Для меня это похоже на ошибку в Eclipse.

0 голосов
/ 14 октября 2010

Потому что в компиляторе Eclipse есть небольшие различия. Однажды я тоже нашел ошибку, когда Javac выдавал (IMHO глупо) ошибку, в то время как компилятор Eclipse смог скомпилировать ее, как и ожидалось.

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

Создайте контрольный пример, который показывает, что различия реальны, и отправьте его команде eclipse. Они будут корректировать поведение своего компилятора. Однако я не могу поверить, что такая серьезная ошибка, как нереализованный метод, действительно есть в компиляторе Eclipse. Поэтому я предполагаю, что вы нашли ошибку в вашей настройке при создании тестового примера для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...