Не удается скомпилировать приложение с использованием Eclipse, Maven и плагина Android для Maven

#java #android #eclipse #compiler-construction #maven

#java #Android #eclipse #построение компилятора #maven

Вопрос:

Я пытаюсь создать приложение для Android в Eclipse, также используя плагин Maven и m2eclipse-android-plugin. До недавнего времени все шло «нормально». Я использую Helios в Ubuntu и использую последнюю версию JDK (удален установленный Ubuntu по умолчанию).

Проект ссылается на две библиотеки, которые я также создал. Один из них является проектом утилиты для Android и генерирует .apklib (успешно). Другая библиотека представляет собой набор утилит более общего назначения, не специфичных для Android, который создает файл JAR. Оба этих проекта также созданы с использованием плагина Maven для Eclipse. Кроме того, я проверил, что оба файла .apklib и .jar находятся в локальном репозитории и оба содержат все сгенерированные файлы классов, как и следовало ожидать.

Когда он переходит к сборке файла .apk, я получаю сообщение «не удается найти символ» для класса в моем Android-проекте, где символом является класс из файла JAR утилиты, отличной от Android. По какой-то совершенно странной причине файл класса не может быть найден внутри файла JAR. Я проверил, что на самом деле файл JAR находится в моем локальном репозитории maven и что файл класса находится в файле JAR. Я также запустил команду maven install с включенной отладкой, скопировал командную строку, которая загружается в компилятор Java. Когда я выполняю эту команду в консоли, я получаю ту ЖЕ ошибку (указывающую на то, что это ошибка компилятора Java, а не ошибка Maven).

Кто-нибудь еще сталкивался с подобной ситуацией раньше? Это необычайно странно, и я полностью проверил командную строку на предмет потенциальных проблем, и, насколько я могу судить, все кажется правильным.

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

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

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

3. Круто, может быть, вы могли бы отредактировать заголовок этого вопроса, чтобы было понятнее?

Ответ №1:

Что ж, методом проб и ошибок я, кажется, устранил проблему. У меня был файл, который выглядел «похожим» на этот:

 import Test.TestObserver;
import com.myself.ImportedClassThatCouldntBeFound;

class Test extends ImportedClassThatCouldntBeFound {
  public interface TestObserver {
    public void event ();
  }

  public void addObserver (TestObserver observer) {
    ...
  }
} 

public class AnotherTest {
  private Test test = new Test ();

  public void blah () {
    this.test.addObserver (new TestObserver () {
      public void event () {
        ...
      } 
    });
  }
}
  

Проблема возникла в ВЕРХНЕЙ части файла. По какой-то причине Eclipse импортировала внутренний интерфейс!

Когда я «удалил» этот импорт, а затем изменил AnotherTest на:

 public class AnotherTest {
  private Test test = new Test ();

  public void blah () {
    this.test.addObserver (new Test.TestObserver () {
      public void event () {
        ...
      } 
    });
  }
}
  

оно скомпилировано правильно! Я даже проверил это, поместив импорт ОБРАТНО в файл и удалив полностью объявленное имя интерфейса, и это снова привело к сбою! Это определенно одна из самых безумных проблем компилятора, с которыми я когда-либо сталкивался, и как только я верну ЧЕТЫРЕ ЧАСА своей жизни, которые я потерял на изучение этого, я проведу дополнительное расследование причин, по которым это происходит.

Это будет первый раз, когда я делаю это в StackOverflow, но я собираюсь отметить это как решение, потому что это определенно было проблемой. Однако определенно требуется больше исследований (по крайней мере, с моей стороны), чтобы попытаться понять, что привело компилятор в такое замешательство.

отредактировал это, чтобы было очевидно, что класс, у которого был внутренний интерфейс, расширял класс, который не удалось найти при компиляции

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

1. Так была ли проблема не связана с maven?

Ответ №2:

Для меня это выглядит как проблема, вызванная (в конечном счете) помещением двух классов верхнего уровня в один файл исходного кода. Обычно считается, что это плохая практика.

Неясно, вызвана ли ошибка компиляции JLS, является ли это ошибкой в компиляторе Java. Но в любом случае, лучшее решение — не помещать несколько классов в один исходный файл.

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

1. Как правило, я обычно использую это, пока не буду удовлетворен реализацией (если я «кодирую с нуля»). Как только я буду удовлетворен реализацией, я бы решил, следует ли извлекать классы в общедоступные классы в новых файлах или создавать внутренние классы, если это действительно не связано ни с чем, кроме бизнес-логики основного класса.