maven "не вдається знайти символ" повідомлення без користі


82

Це справді просте запитання, і це, мабуть, установка десь, про яку я не знаю, але Google особливо не допомагає цьому питанню, даючи результати про помилки компіляції, а не про те, як змінити повідомлення про помилки компіляції.

Коли я будую свій проект за допомогою maven, він видасть мені повідомлення про помилки, відформатовані приблизно так:

[ПОМИЛКА] /path/to/source/Main.java:[13,8] помилка: не вдається знайти символ

Коли я будую за допомогою ant або javac, він насправді повідомляє мені символ, який він не може знайти в повідомленні про помилку. maven дає мені номер рядка та позицію символу, але відображення власне символу було б більш корисним. Рядок вище - це єдиний рядок, наведений для кожної з помилок "не можу знайти символ". Немає рядка зверху або знизу, який би давав символ. Я гадаю, повинен бути якийсь спосіб, щоб змусити Maven передати мені цю інформацію, але я не знаю, що це таке. Я спробував параметр -e, оскільки mvn сказав мені спробувати використовувати його, але це дало maven traceback для помилки, а не власне символ.

Будь-яка допомога?

Ось результат mvn --version

Apache Maven 3.0.4 (rNON-CANONICAL_2012-10-24_11-25_mockbuild; 2012-10-24 07:25:04-0400)
Maven home: /usr/share/maven
Java version: 1.7.0_09-icedtea, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.9.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.6.6-1.fc17.x86_64", arch: "amd64", family: "unix"

І ось приклад (непомітного) повідомлення про помилку, саме так, як виводиться maven (лише із скороченими каталогами):

[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /path/to/source/SoundEngineFilePanel.java:[33,8] error: cannot find symbol
[ERROR]  class SoundEngineFilePanel
/path/to/source/SoundEngineFilePanel.java:[36,8] error: cannot find symbol
[INFO] 2 errors 
[INFO] -------------------------------------------------------------

Символами, які він не може знайти, є "fakeThing" і "fakeThing2", а не SoundEngineFilePanel.


Чи можете ви надати деяку інформацію про версію (зокрема Maven) тощо? Це трапляється не в мене.
Dave Newton

Це правда, що повідомлення maven “не можу знайти символ” не дуже корисне. Я можу сказати вам мій випадок, коли мій код використовував певний метод сторонньої бібліотеки протягом тривалого часу, але якимось чином метод був видалений із сторонньої бібліотеки. Коли maven складав код, він зазнав помилки. Якби повідомлення було "методом не знайдено" замість "не можу знайти символ", то воно було б дуже ефективним і менш трудомістким.
Атул С.

Людям, які відчувають схильність додати ще одну відповідь на це питання. Уважно прочитайте питання. Йдеться НЕ про те, як виправити помилки компіляції "не можу знайти символ" (у Maven). Йдеться про те, як змусити Maven давати більш інформативні повідомлення про помилки компіляції ; тобто повідомлення, що містять контекст вихідного коду ... подобається javacі Antроблю.
Stephen C

Відповіді:


41

Це помилка в плагіні компілятора Maven, я думаю, пов'язана з JDK7. Чудово працює з JDK6.


5
Здається, це виправлено у maven-compiler-plugin 3.1. Дивіться відповідь Джорджа-Папатеодору .
Джаред Бек,

30
Це не рішення .. Помилка компіляції все ще трапляється в Java 8.
Eta

Почалося, коли Windows 10 аварійно завершив роботу. Це може бути фактором?
TheRealChx101

1
Для @Eta (і близько 27 осіб, які поставили +1 вищезазначеному коментарю) - я думаю, ви втрачаєте суть. Це питання стосується непомітних повідомлень від Maven. Ця відповідь говорить про те, як зробити повідомлення про помилки компіляції більш корисними. Це не усуває проблему, яка спричинила помилку компіляції. Ця проблема (як правило) у вашому вихідному коді! Див. Що означає помилка „Не вдається знайти символ” або „Не вдається вирішити символ”? .
Stephen C

35

оновлення до 3.1:

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

Який найкращий спосіб визначити останню версію цього плагіна? Все, що я зміг знайти, це ця сторінка: maven.apache.org/plugins/maven-compiler-plugin/… Дякую.
Джаред Бек,

@JaredBeck, здається, ви можете це знайти тут: mvnrepository.com/artifact/org.apache.maven.plugins/…
DSimon

6

У моєму випадку проблема полягала в дочірньому jar, який не був відновлений, оскільки я додав новий клас, pom.xml цього дочірнього jar не був пов’язаний з моїм невдалим pom.xml як відношення дитини до батьків (за допомогою <parent>тегу). Тож я відновив дочірню банку, після чого помилка пішла.


Це була і моя проблема. Хоча в Maven, безумовно, існують помилки, я б очікував, що в більшості випадків помилки Maven або проблеми з побудовою пояснюються такими сценаріями.
Майкл М

4

У мене була та сама проблема. Причиною було те, що у мене два файли JAR не були додані через залежність Maven, тому при запуску mvn compileконсоль відображає помилку помилки:

Не вдається знайти символ, клас ... ".

Щоб це виправити:

  1. Видаліть файли JAR із шляху збирання
  2. Додати для побудови шляху
  3. Біжи mvn compile

2
Не могли б ви перерахувати кроки, які ви використовували для видалення файлів JAR із шляху збирання? Оскільки я отримую ту саму помилку, коли намагаюся видалити цільову папку та перекомпілювати за допомогою maven? Дякую
turnip424

3

Це відбувається через цю проблему, тобто перепакування, яке ви визначили у файлі POM.

Видаліть це з файлу pom під плагіном maven. Це спрацює

<executions>
    <execution>
        <goals>
             <goal>repackage</goal>
        </goals>
    </execution>
</executions>

3

У моєму випадку я використовував залежність з масштабом як <scope>test</scope>. Це зробило клас доступним під час розробки, але, під час компіляції, я отримав це повідомлення.

Поверніть область застосування класу для <scope>provided</scope>вирішення проблеми.


2

Навіть я використовую Java 7, maven 2.2.1 і отримував ту саму помилку, я вилучив <scope>tests</scope>з мого pom і використовував

mvn clean -DskipTests=true install успішно будувати свої проекти, не оновлюючи версію maven.


"mvn clean -DskipTests = true" встановити - це чарівна команда! Thx для обміну. (До речі, я не торкався своїх <scope> тестів </scope>)
Ета,

1

якщо у вас є залежність від іншого проекту в робочому просторі, і ці проекти не будуються належним чином, така помилка може виникнути. спробуйте спочатку побудувати такі залежні проекти, це може допомогти


0

Це не функція Мейвена; це функція компілятора. Придивіться; інформація, яку ви шукаєте, є, швидше за все, у наступному рядку.


Я отримував ту ж помилку. Подальша помилка дала назву залежності, якої не було в проекті (у цьому випадку клас бібліотеки org.apache.poi.xssf).
Джон

0

РІШЕННЯ: @ Перш ніж створювати свій компонент (за допомогою mvn clean install) Створіть весь проект один раз і побудуйте компонент знову

ЧОМУ ТАК:
Я отримую цю помилку багато разів. Найчастіше я намагатимусь побудувати свій компонент окремо (оскільки я ніде не вносив змін).

Правильно, але на додаткову банку, яку нещодавно завантажили, могли вплинути зміни, внесені третьою стороною (всередині їх компонента). Здійснення повного чистого встановлення mvn для всього проекту мене врятувало багато разів


-1

Я думаю, компілятор скаржиться на недійсну анотацію. Я помітив, що Eclipse не відображає всіх помилок, як кома в кінці масиву в анотації. Але стандарт javacце робить.


Рядок, на який він скаржиться, є fakeThing = new JPanel(). Це просто стандартна помилка "не можу знайти символ", для якої javac відображав би "fakeThing". maven просто не показує цього.
mattg

-1

Я отримував подібну проблему в Eclipse STS при спробі запустити інсталяцію Maven на проекті. Я змінив деякі версії у залежностях мого файлу pom.xml для цього проекту та проектів, на які вказували ці залежності. Я вирішив це, запустивши інсталяцію Maven на всіх змінених проектах, а потім знову запустивши інсталяцію на оригінальному.


-1

У мене була та ж проблема з maven. Трапляється, що моєю проблемою було те, що Maven генерував папки з різними іменами регістрів. Я очікував .service.MyFile, але в цільовій папці це був Service / MyFile, а Java має регістр. На це мені зайняло кілька годин, рекомендую вам це перевірити.


-1

Як правило, ця помилка з'являється, коли версія вашого компіляційного коду відрізняється від вашої написаної кодової. Наприклад, напишіть код, який покладається на xxx-1.0.0.jar, що один клас має метод A, але метод змінено на B у xxx-1.1.0.jar. Якщо ви скомпілюєте код за допомогою xxx-1.1.0.jar, ви побачите помилку.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.