Maven „nie można znaleźć symbolu” nie jest pomocna

82

To jest naprawdę proste pytanie i prawdopodobnie jest to ustawienie gdzieś, o czym nie wiem, ale Google jest szczególnie pomocne w przypadku tego pytania, podając wyniki dotyczące błędów kompilacji, a nie jak zmienić komunikaty o błędach kompilacji.

Kiedy buduję projekt za pomocą maven, otrzymuję komunikaty o błędach w przybliżeniu w następujący sposób:

[ERROR] /path/to/source/Main.java:[13,8] błąd: nie można znaleźć symbolu

Kiedy buduję za pomocą programu Ant lub javac, w rzeczywistości wyświetli się symbol, którego nie może znaleźć w komunikacie o błędzie. maven podaje numer wiersza i pozycję znaku, ale wyświetlenie rzeczywistego symbolu byłoby bardziej pomocne. Powyższa linia jest jedyną linią podaną dla każdego błędu „nie można znaleźć symbolu”. Nie ma linii powyżej lub poniżej, która daje symbol. Wyobrażam sobie, że musi być jakiś sposób, aby skłonić maven do przekazania mi tych informacji, ale nie wiem, co to jest. Wypróbowałem opcję -e, jak mvn powiedział mi, żebym spróbował jej użyć, ale dała ona mavena śledzenie błędu, a nie faktyczny symbol.

Jakaś pomoc?

Oto wynik działania 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"

A oto przykładowy (nieprzydatny) komunikat o błędzie, dokładnie taki, jaki wyświetla maven (tylko ze skróconymi katalogami):

[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] -------------------------------------------------------------

Symbole, których nie może znaleźć, to „fakeThing” i „fakeThing2”, a nie SoundEngineFilePanel.

mattg
źródło
Czy możesz podać informacje o wersji (w szczególności Maven) itp.? To się nie dzieje ze mną.
Dave Newton,
Prawdą jest, że komunikat maven „nie można znaleźć symbolu” nie jest zbyt pomocny. Mogę wam opowiedzieć o moim przypadku, w którym mój kod przez długi czas korzystał z określonej metody biblioteki innej firmy, ale w jakiś sposób metoda została usunięta z biblioteki innej firmy. Kiedy maven kompilował kod, nie udało się. Gdyby komunikat brzmiał „Nie znaleziono metody” zamiast „nie można znaleźć symbolu”, byłoby to bardzo efektywne i mniej czasochłonne.
Atul S.
Do osób, które mają ochotę dodać jeszcze jedną odpowiedź na to pytanie. Przeczytaj uważnie pytanie. NIE jest o tym, jak naprawić błędy kompilacji „nie można znaleźć symbolu” (w Mavenie). Chodzi o to, jak sprawić, by Maven podawał więcej informacji o błędach kompilacji ; czyli wiadomości, które zawierają kontekst kodu źródłowego ... jak javaci Antzrób.
Stephen C

Odpowiedzi:

41

To jest błąd we wtyczce kompilatora Maven, związany z JDK7. Działa dobrze z JDK6.

Peter Svensson
źródło
5
Wydaje się, że zostało to naprawione w maven-compiler-plugin 3.1. Zobacz odpowiedź george-papatheodorou .
Jared Beck
30
To nie jest rozwiązanie ... błąd kompilacji nadal występuje w Javie 8.
Eta
Zaczęło się dziać po awarii systemu Windows 10. Czy to może mieć znaczenie?
TheRealChx101
1
@Eta (i około 27 innych, którzy dali +1 powyższemu komentarzowi) - myślę, że nie rozumiesz. To pytanie dotyczy nieprzydatnych wiadomości od Mavena. W tej odpowiedzi omówiono, jak zwiększyć przydatność komunikatów o błędach kompilacji. Nie rozwiązuje problemu, który spowodował błąd kompilacji w pierwszej kolejności. Ten problem występuje (zazwyczaj) w kodzie źródłowym! Zobacz Co oznacza błąd „Nie można znaleźć symbolu” lub „Nie można rozpoznać symbolu”? .
Stephen C
35

aktualizacja do wersji 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>
George Papatheodorou
źródło
Jaki jest najlepszy sposób określenia najnowszej wersji tej wtyczki? Jedyne, co udało mi się znaleźć, to ta strona: maven.apache.org/plugins/maven-compiler-plugin/ ... Dzięki.
Jared Beck
@JaredBeck wydaje się, że możesz to znaleźć tutaj: mvnrepository.com/artifact/org.apache.maven.plugins/…
DSimon,
6

W moim przypadku problem dotyczył słoika podrzędnego, który nie został odbudowany, ponieważ dodałem nową klasę, pom.xml tego słoika podrzędnego nie był powiązany z moim nieudanym plikiem pom.xml jako relacja dziecko-rodzic (przy użyciu <parent>tagu). Więc odbudowałem słoik dziecka, po którym błąd zniknął.

a.parfenov
źródło
To też był mój problem. Chociaż z pewnością istnieją błędy w Maven, spodziewam się, że w większości przypadków błędy Mavena lub problemy z kompilacją są wyjaśniane w scenariuszach takich jak ten.
Michael M
4

Miałem ten sam problem. Powodem było to, że miałem dwa pliki JAR, które nie zostały dodane przez zależność Maven, więc kiedy uruchomiłem mvn compile, konsola wyświetla błąd błędu:

Nie można znaleźć symbolu, klasa ... ”.

Naprawić to:

  1. Usuń pliki JAR ze ścieżki budowania
  2. Dodaj do ścieżki budowania
  3. Biegać mvn compile
Ajax
źródło
2
Czy mógłbyś wymienić kroki użyte do usunięcia plików JAR ze ścieżki kompilacji? Ponieważ otrzymuję ten sam błąd, gdy próbuję usunąć folder docelowy i ponownie skompilować za pomocą maven? Dzięki
rzepa424
3

Dzieje się tak z powodu tego problemu również tj. Przepakowywania, które zdefiniowałeś w pliku POM.

Usuń to z pliku pom pod wtyczką maven. To będzie działać

<executions>
    <execution>
        <goals>
             <goal>repackage</goal>
        </goals>
    </execution>
</executions>
Anto Livish A.
źródło
3

W moim przypadku korzystałem z zależności o zakresie jako <scope>test</scope>. To sprawiło, że klasa była dostępna w czasie programowania, ale w czasie kompilacji otrzymałem tę wiadomość.

Włącz zakres klas, aby <scope>provided</scope>rozwiązać problem.

Joabe Lucena
źródło
2

Nawet ja używam Java 7, maven 2.2.1 i otrzymywałem ten sam błąd, usunąłem <scope>tests</scope>z pom i użyłem

mvn clean -DskipTests=true install aby pomyślnie budować moje projekty bez uaktualniania mojej wersji Mavena.

AabinGunz
źródło
"mvn clean -DskipTests = true" instalacja to magiczne polecenie! Dzięki za udostępnienie. (BTW nie dotknąłem moich <scope> testów </scope>)
Eta
1

Jeśli jesteś zależny od innego projektu w przestrzeni roboczej i te projekty nie są poprawnie skompilowane, taki błąd może wystąpić. spróbuj najpierw zbudować takie zależne projekty, może to pomóc

Piyush Gharote
źródło
0

To nie jest funkcja Mavena; jest to funkcja kompilatora. Przypatrz się; informacje, których szukasz, najprawdopodobniej znajdują się w następnym wierszu.

Izaak
źródło
Otrzymałem ten sam błąd. Kolejny błąd podał nazwę zależności, której brakowało w projekcie (w tym przypadku klasa biblioteki org.apache.poi.xssf).
Jan
0

ROZWIĄZANIE: @Przed zbudowaniem komponentu (za pomocą mvn clean install). Zbuduj cały projekt raz i ponownie utwórz komponent

DLACZEGO:
wielokrotnie otrzymuję ten błąd. W większości przypadków będę próbował zbudować swój komponent samodzielnie (ponieważ nie wprowadzałem zmian w innym miejscu).

Racja, ale ten dodatkowy plik jar, który został niedawno pobrany, mógł mieć wpływ na zmiany dokonane przez osobę trzecią (w ich komponencie). Wykonanie pełnej czystej instalacji mvn na całym projekcie wiele razy mnie uratowało

Ganesh Srini
źródło
-1

Domyślam się, że kompilator skarży się na nieprawidłową adnotację. Zauważyłem, że Eclipse nie pokazuje wszystkich błędów, takich jak przecinek na końcu tablicy w adnotacji. Ale standard javactak.

asgoth
źródło
Linia, na którą narzeka, to fakeThing = new JPanel(). To po prostu standardowy błąd „nie można znaleźć symbolu”, dla którego javac wyświetlałby „fakeThing”. maven po prostu tego nie pokazuje.
mattg
-1

Otrzymałem podobny problem w Eclipse STS podczas próby uruchomienia instalacji Mavena w projekcie. Zmieniłem kilka wersji w zależnościach mojego pliku pom.xml dla tego projektu i projektów, na które wskazywały te zależności. Rozwiązałem to, uruchamiając instalację Mavena na wszystkich projektach, które zmieniłem, a następnie ponownie uruchamiając instalację na oryginalnym.

Stoic_Observer
źródło
-1

Miałem ten sam problem z mavenem. Zdarza się, że mój problem polegał na tym, że maven generował foldery z różnymi nazwami przypadków. Spodziewałem się .service.MyFile, ale w folderze docelowym był to Service / MyFile, a java rozróżnia wielkość liter. Zajęło mi to kilka godzin, zanim się dowiedziałem, polecam to sprawdzić.

Aléxia Dorneles
źródło
-1

Zwykle ten błąd pojawia się, gdy wersja kodu kompilacji różni się od wersji kodu napisanego. Na przykład napisz kod, który opiera się na xxx-1.0.0.jar, że jedna klasa ma metodę A, ale metoda została zmieniona na B w xxx-1.1.0.jar. Jeśli kompilujesz kod za pomocą xxx-1.1.0.jar, zobaczysz błąd.

ulysses
źródło