Java: невирішена проблема компіляції


78

Які можливі причини "java.lang.Error: невирішена проблема компіляції"?

Додаткова інформація:

Я переконався в цьому після копіювання набору оновлених файлів JAR із збірки поверх існуючих JAR та перезапуску програми. JAR створюються за допомогою процесу збірки Maven.

Я очікував би побачити помилки LinkageErrors або ClassNotFound, якщо інтерфейси змінилися. Вищенаведена помилка натякає на проблему нижчого рівня.

Чиста перебудова та передислокація вирішили проблему. Чи може ця помилка вказувати на пошкоджений JAR?

java 

Що ви зробили, щоб спричинити цю помилку?
Greg Hewgill

Я спричинив цю помилку, перейменувавши вхідний параметр і не перейменувавши всі випадки цього параметра в методі. Цікаво mvn compile, що помилок не викликає, але запуск програми робить. mvn clean compileпоказує помилку під час компіляції (як очікувалося).
peschü

Відповіді:


68

(переписано 28.07.2015)

Поводження Eclipse за замовчуванням під час компіляції коду з помилками в ньому полягає у формуванні байтового коду, що видає виняток, який ви бачите, дозволяючи запускати програму. Це можливо, оскільки Eclipse використовує власний вбудований компілятор замість javacJDK, який використовує Apache Maven, і який повністю не вдається виконати компіляцію через помилки. Якщо ви використовуєте Eclipse у проекті Maven, з яким ви також працюєте, використовуючи команду командного рядка mvn, це може статися.

Ліки полягає у виправленні помилок і перекомпіляції, перш ніж запускати знову.

Налаштування позначено червоним квадратиком на цьому екрані:

Налаштування Eclipse під OS X


Це не моя справа. Я переконався в цьому після розгортання файлів JAR (збірка за допомогою Maven) на сервері.

1
Можливо, є проблема з конфігурацією збірки Maven, і вона використовує файли .class із вихідного каталогу eclipse. У будь-якому випадку, єдиний раз, коли я бачив цю помилку, - це коли я запускаю код із помилками компіляції в eclipse.
Майкл Борґвардт

У такому випадку ваша побудова maven, швидше за все, зламана. Спробуйте очистити та перекомпілювати з командного рядка, коли Eclipse вимкнено.
Thorbjørn Ravn Andersen

Не бачив, як ви редагували запитання. Я б дослідив процес збірки Maven, оскільки він, здається, не повністю чистий. Він не повинен мати можливості створювати розбиті банки! У вас є сервер збірки?
Thorbjørn Ravn Andersen

У мене просто була та сама проблема. Схоже, як сказав Майкл, це був Мейвен, який збирав файли класів, створені Eclipse.
Wouter Coekaerts


9

ви просто намагаєтесь очистити maven за командою

mvn clean

і після цього наступна команда

mvn eclipse:clean eclipse:eclipse

і перебудуйте свій проект ....


Враховуючи поточну якість (2015) плагіна m2e Eclipse, я б запропонував використовувати Eclipse з цим замість різних цілей eclipse maven.
Thorbjørn Ravn Andersen

8

Можливо, вам доведеться перекомпілювати ваші скомпільовані класи з джерела разом із новими баночками.

Спробуйте запустити "mvn clean", а потім відновити


2

На більшу частину правильно відповів Торбьорн Равн Андерсен.

Ця відповідь намагається пролити світло на питання, що залишилося: як файл класу з помилками може опинитися в банку?

Кожна збірка (mvn & javac або eclipse) сигналізує по-своєму, коли виявляє помилку компіляції, і відмовляється створювати з неї файл Jar (або принаймні помітно попереджає вас). Найімовірнішою причиною мовчазного отримання файлів класів з помилками в банку є одночасна робота Maven та Eclipse.

Якщо під час запуску збірки mvn у вас відкрито Eclipse, вимкніть Project > Build Automatically, поки mvn не завершиться.

EDIT : Спробуємо розділити загадку на три частини:

(1) Що означає "java.lang.Error: невирішена проблема компіляції"

Це пояснив Торбьорн Равн Андерсен. Немає сумнівів, що Eclipse виявив помилку під час компіляції .

(2) Як може скомпільований eclipse файл класу потрапити у файл jar, створений maven (припускаючи, що maven не налаштований на використання ecj для компіляції)?

Це може статися або за допомогою виклику maven без чищення або неповного очищення. Або автоматична збірка Eclipse може реагувати на зміни у файловій системі (зроблено maven) і повторно скомпілювати клас, перш ніж maven продовжить збирати файли класів у банку ( це те, що я мав на увазі під "паралельною операцією" у своїй оригінальній відповіді ).

(3) Як так, помилка компіляції є, але mvn cleanвдається?

Знову ж таки декілька можливостей: (а) компілятори не погоджуються, чи є вихідний код законним, або (б) Eclipse компілюється з непрацюючими налаштуваннями, такими як неповний шлях до класу, неправильна відповідність Java тощо. У будь-якому випадку послідовність оновлення та чистої збірки в Eclipse повинні вивести проблему на поверхню.


Я не думаю, що це суперечливе питання, оскільки воно є дуже систематичним і завжди трапляється. Я думаю, що якось код компілюється на вимогу під час завантаження, коли він дійсно використовується JVM. Не уявляю, чому це можливо. Я думав, що перевірка часу компіляції - це те, що робить Java перевагою над Python ...
peschü

1

У мене сталася ця помилка, коли я використовував конфігурацію запуску, яка мала недійсний шлях до класу. У моєму випадку у мене був проект, який спочатку використовував Maven, і, отже, конфігурація запуску мала в ньому елемент класу шляху Maven. Пізніше я змінив проект на Gradle і видалив шлях до класу Maven із шляху до класу проекту, але конфігурація запуску все ще використовувала його. У мене виникла ця помилка при спробі її запустити. Очищення та відновлення проекту не усунули цю помилку. Натомість відредагуйте конфігурацію запуску, видаліть елемент classpath проекту, а потім додайте проект назад до записів користувача в classpath.


0

Я отримував цю помилку кілька разів і намагався вирішити проблему. Нарешті, я видалив конфігурацію запуску та знову додав записи за замовчуванням. Це працювало красиво.


Ну так ... але робити те, що говорить прийнята відповідь, могло б працювати швидше. Це лише один прапор у уподобаннях.
Stephen C

-2

Переконайтеся, що ви видалили недоступні бібліотеки (файли jar) із шляху збирання


Було б простіше сказати "виправити помилки компіляції незалежно від їх причини". Існує багато можливих причин помилок компіляції / збірки. Нам не потрібно їх перераховувати.
Стівен С
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.