Проверка 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 ]

0 голосов
/ 02 февраля 2018

Перейдите в Файл-> Структура проекта -> SDK и проверьте правильность пути к файлу SDK.

0 голосов
/ 06 января 2017

Или, может быть, импортируемый вами файл слишком велик. Это мой случай, когда я изменяю свойство Intellij: iead.max.intellisen.filesize (путь равен $ {idea dir} /bin/idea.properties) на больший значение, как 25000, и перезапустите IDE, проблема исчезла. Надеюсь, это поможет.

0 голосов
/ 05 июня 2017

У меня была похожая проблема при переключении на новый компьютер.

Я скопировал все файлы IDEA (даже связанные папки% APPDATA%), но затем сборка Maven прошла успешно, но IDEA не нашла никаких классов из зависимостей при его создании.1004 * Решение: я начал с нового и чистого профиля IDEA, удалив папки из папок% APPDATA%

0 голосов
/ 24 мая 2019

Похоже, это случается со мной в основном, когда баночка зависимостей также является толстой банкой.К счастью, у меня был контроль над постройкой «Жирной банки», после того, как я сделал ее не «Жирной банкой», тогда все заработало.Ни одно из других исправлений ни одного из ответов или комментариев здесь не сработало для меня.Также, вероятно, следует отметить, что мой код был на Kotlin, а Fat Jar также связывал некоторые Kotlin-зависимости.

0 голосов
/ 09 февраля 2017

В моем случае эта проблема обнаружилась после того, как я проверил большую реструктуризацию файлов в моем проекте maven.Во время проверки у меня были некоторые свои собственные непроверенные в изменениях, все еще активных.Насколько я могу судить, изменения не произошли ни в одном из файлов, которые были реструктурированы.

Отмена кеша и перезапуск не работали для меня.То, что сработало, было:

  • отмена изменений, которые я сделал перед большой проверкой реструктуризации
  • повторное импортирование всех модулей maven
...