Вопрос-ответ

IntelliJ inspection gives "Cannot resolve symbol" but still compiles code

Проверка IntelliJ выдает "Не удается разрешить символ", но все равно компилирует код

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

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

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

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;
}
}

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

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

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

Похоже, что путь к классу проверки нарушен, но, похоже, нигде в областях Settings => Intentions | Compiler для этого нет настройки (не то чтобы я ожидал каких-либо таких настроек, я считаю, что 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 зависимостей отсутствует).

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

Переведено автоматически
Ответ 1

Прежде всего, вы должны попробовать File | Invalidate Caches и, если это не поможет, удалить системный каталог IDEA. Затем повторно импортируйте проект Maven и посмотрите, поможет ли это.

В некоторых странных случаях скомпилированные классы могут сообщать неверную информацию и сбивать с толку ИДЕЮ. Убедитесь, что классы из этого jar сообщают правильные имена, используя javap.

Ответ 2

Следующий трюк решил эту проблему для меня:


  • Щелкните правой кнопкой мыши в редакторе кода

  • Наведите курсор на Maven и разверните

  • Нажмите на повторный импорт

Моя версия idea - 12.0.4

Ответ 3

Ни одно из вышеперечисленных решений у меня не сработало. Что я сделал, так это удалил main.iml файл вручную, и он внезапно заработал.

Ответ 4

Это упоминалось в другом ответе на этот же вопрос здесь, но только это исправляет проблему для меня. Я делаю все свои сборки в отдельном терминале, за пределами IntelliJ. Поэтому для приложения IntelliJ в кэше должны быть установлены соответствующие разрешения для их чтения.

Запустите его из корневой папки проекта.

$ mvn -U idea:idea
java maven intellij-idea