Проверка IntelliJ выдает «Не удается разрешить символ», но все равно компилирует код - PullRequest
490 голосов
/ 06 мая 2011

Платформа: IntelliJ Community Edition 10.0.3
SDK: jdk1.6.0_21
ОС: Windows 7

Так что у меня странная ситуация с IntelliJ, которая поставила меня в тупик. Я настраиваю проект Maven и добавляю log4j в качестве зависимости в файл pom.xml. Инспекции IDEA проходят нормально, и все мои модульные тесты компилируются и запускаются.

Затем я добавил библиотеку hunnysoft jmime в мой локальный репозиторий maven с помощью mvn install: install-file следующим образом.

mvn install:install-file -Dfile=jmime.jar -DgroupId=jmime \
-DartifactId=jmime -Dversion=3.1.1e -Dpackaging=jar

Maven прекрасно установил файл jar в мой локальный репозиторий.

Затем я зашел в Настройки IntelliJ => Maven => Службы репозитория и обновил мой локальный репозиторий (чтобы IntelliJ переиндексировал содержимое репозитория).

Наконец, я добавил следующую зависимость в свой файл pom.xml (чуть выше зависимости log4j).

<dependency>
    <groupId>jmime</groupId>
    <artifactId>jmime</artifactId>
    <version>3.1.1e</version>
</dependency>

Теперь я создаю новый класс следующим образом:

package com.stackoverflow.question;

import org.apache.log4j.Logger;
import com.hunnysoft.jmime.ByteString;
import com.hunnysoft.jmime.Field;
import com.hunnysoft.jmime.FieldBody;

public class StackOverflowQuestion {
    public Field create(String name, String text) {
        Logger.getLogger(getClass()).debug("create entered");
        FieldBody body = new FieldBody();
        body.setText(new ByteString(text));
        Field field = new Field();
        field.setFieldName(name);
        field.setFieldBody(body);
        return field;
    }
}

Теперь о странностях. Механизм намерений IntelliJ подхватывает и распознает импорт Logger в файле maven pom. Однако для всех импортов hunnysoft он сообщает: «Не удается разрешить символ« ByteString / Field / FieldBody »», НО Build => Compile «StackOverflowQuestion.java» компилирует все правильно, и модульный тест, для которого я создал этот класс работает нормально (хотя намерения помечают вызов create () как проблемную область).

Так что где-то IntelliJ игнорирует файл jmime.jar для подсистемы намерений. Я запутался, потому что зависимость log4j работает нормально, и все компилируется и работает нормально. F12 («Перейти к декларации») работает с импортом Logger, но нарушает все операции импорта jmime.

О, еще одна вещь, если я перейду к представлению «Пакеты» в окне «Проекты», появится пакет «com.hunnysoft.jmime», и я вижу ВСЕ классы, которые я импортировал в фрагменте кода выше под «Библиотека». Удаление вышеуказанной зависимости из файла pom.xml приводит к исчезновению этого пакета и прерыванию компиляции.

Похоже, что путь к классу проверки нарушен, но, похоже, нигде в настройках этого параметра нет настроек => Намерения | Области компиляции (не то чтобы я ожидал таких настроек, я считаю, что IDEA уже должна знать правильный путь к классу на основе файла pom и JDK).

В качестве заключительного эксперимента я создал совершенно новый стандартный проект приложения J2SE (без использования maven) и добавил файл jmime.jar непосредственно в проект в качестве одной из его библиотек. Я столкнулся с точно такими же проблемами, как описано выше в этом новом проекте.

Вот файл MANIFEST.MF из файла jmime jar.

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.5.4
Created-By: 10.0-b23 (Sun Microsystems Inc.)

Name: com/hunnysoft/jmime/
Sealed: true
Specification-Title: Hunny JMIME
Specification-Version: 3.1.1
Specification-Vendor: Hunny Software, Inc.
Implementation-Title: com.hunnysoft.jmime
Implementation-Version: 3.1.1E
Implementation-Vendor: Hunny Software, Inc.

Я не вижу ничего необычного в этом файле jar.

Мое лучшее предположение состоит в том, что, возможно, проблема может быть в отсутствующей зависимости. Но AFAIK jmime должен быть автономным (JarAnalyzer ничего не предлагает, но я не уверен, что так будет, если отсутствует jar-файл зависимости).

Так, у кого-нибудь есть ИДЕИ?

Ответы [ 45 ]

1 голос
/ 04 июля 2016

В моем случае удаляется только buildDir.В этом случае File | Invalidate Caches не работает.

Когда я делаю Build | Make Project до File | Invalidate Caches, все работает нормально.

1 голос
/ 13 сентября 2016
  1. Открыть "Настройки"
  2. Поиск "Maven"
  3. Нажмите «Игнорируемые файлы» в разделе «Maven»
  4. Снимите отметку с файлов pom.xml, которые содержат отсутствующие зависимости
  5. Нажмите "ОК"
  6. Нажмите Файл -> Неправильные кэши / Перезапуск ...
  7. Нажмите «Отменить и перезапустить»
1 голос
/ 08 марта 2017

Предлагаемые решения не сработали. Мне пришлось отменить несколько проектов, щелкнув правой кнопкой мыши по проекту pom => maven => unignore.

Затем после

mvn clean install -T 6 -DskipTests

в консоли IntelliJ снова был счастлив. Понятия не имею, как проекты стали игнорироваться ...

1 голос
/ 26 марта 2019

Для проектов Gradle:

  1. Выход IntelliJ IDEA
  2. Удалить каталог <problematic-project-root>/.idea
  3. Удалить каталог <problematic-project-root>/.gradle
  4. Удалить все .iml файлы в <problematic-project-root>
    • windows Командная строка : DEL /S /Q *.iml
    • linux: find . | grep -e .iml$ | xargs rm
  5. Повторный импорт проекта в IntelliJ IDEA с Gradle
1 голос
/ 06 мая 2011

Да, звучит так, будто вам нужно создать библиотеки, содержащие нужные вам JAR-файлы, и добавить их в качестве зависимости в ваш модуль.

1 голос
/ 28 ноября 2017

Удалите файл: iml, найденный в java и тестовых папках внутри проекта, и сделайте недействительным и перезапустите.

Будет предложено удалить проекты.Поставь да.Ошибка исчезнет.

1 голос
/ 01 февраля 2018

иногда, когда вы создаете пакет типа com.mydomain.something, структура каталогов не создается , и у вас остается одна папка с именем "com.mydomain.something"в этом случае вы должны создать структуру каталогов, например

com
|_mydomain
  |_something 
0 голосов
/ 01 сентября 2016

если проект maven, то просто зайдите в настройки -> инструменты сборки -> maven -> импорт.установите флажок «Импортировать проект maven автоматически».решит проблему.

0 голосов
/ 13 августа 2018

Для MAVEN,

Я перепробовал все вышеперечисленные методы, но не смог найти решение,

Ниже приведены шаги, которые я попробовал (сочетание некоторых решений),

  1. mvn clean

  2. Идея mvn: чистая

  3. Недействительный кеш и перезапуск
  4. Удалите все лишние файлы .iml, которые вы видите в структуре проекта.
  5. В корневом каталоге вашего проекта запустите mvn idea: idea и mvn clean install, чтобы заново импортировать все зависимости вашего проекта maven.

(убедитесь, что у вас нет дополнительных файлов .iml, кроме файлов .iml проекта / подпроекта)

0 голосов
/ 09 июля 2018

Если все мои файлы pom.xml настроены правильно, и у меня все еще есть проблемы с Maven в IntelliJ, я делаю следующие шаги

  1. В последнее время читайте, как использовать maven в IntelliJ
  2. Убедитесь, что IntelliJ настроен на использование Bundled Maven 3
  3. Find и TERMINATE фактический Java-процесс, выполняющий индексирование репозиториев Maven 3 для IntelliJ (завершение может быть выполнено во время работы IntelliJ). В случае, если какие-либо проблемы с индексами или зависимостями отсутствуют (продуманные репозитории были настроены в pom.xml).
  4. Принудительно Обновление для всех репозиториев в "IntelliJ / Настройки / Инструменты сборки / Maven / Репозитории /". Занимает большую часть времени, места на диске и пропускной способности! Мне потребовалось 20+ минут, чтобы обновить индекс для центрального репозитория Maven.
  5. Hit Повторно импортировать все проекты Maven из IntelliJ
  6. Хорошей практикой является выполнение шагов 1-4, чтобы оставить IntelliJ и его демонические Java-процессы работающими в течение ночи, если у вас есть несколько репозиториев и сложный проект, поэтому у вас все синхронизировано на следующий день. Теоретически вы можете использовать все популярные индексированные репозитории и запускать обновление индексов одновременно для всех репозиториев (я полагаю, IntelliJ создает очередь и запускает обновления один за другим), а затем может потребоваться несколько часов ( для этого вам также потребуется увеличить пространство кучи).

P.S. Я потратил часы, чтобы понять (шаг 3), что процесс создания Java-кода в IntelliJ, который обрабатывает обновление индекса maven, что-то делал не так, и мне просто нужно заставить IntelliJ запустить его с нуля. Проблема была решена даже без перезапуска самого IntelliJ.

...