7

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

8

Проблема с IntelliJ IDEA и зависимостями Maven

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

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

Затем я добавил библиотеку jmime от hunnysoft в мой локальный репозиторий 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 в файле pom.xml без проблем. Однако для всех импортов hunnysoft он сообщает: "Не удается разрешить символ 'ByteString/Field/FieldBody'", НО сборка ⇒ Компилировать 'StackOverflowQuestion.java' компилирует всё корректно, и юнит-тест, который я создал для этого класса, выполняется без проблем (хотя IntelliJ также помечает вызов метода 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-файле.

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

Так что, может у кого-то есть идеи?

5 ответ(ов)

1

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

  • Щелкните правой кнопкой мыши на редакторе кода.
  • Наведите курсор на Maven и разверните меню.
  • Нажмите на "Reimport" (Переимпортировать).

У меня версия IDEA 12.0.4.

0

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

0

Одним дополнительным шагом, когда я сделал "Файл" → "Очистить кэш" и перезапустил IDE, открыл проект. В верхнем правом углу появилось всплывающее уведомление с вопросом, нужно ли включить автоимпорт, и это решило проблему.

0

Проблема у меня возникла из-за несовместимых/дублирующихся имен модулей в структуре проекта.

  1. Перейдите в Файл -> Структура проекта -> Модули.
  2. Щелкните на модули, которые подчеркиваются красным.
  3. Перейдите на вкладку "Зависимости".
  4. Убедитесь, что зависимости, отмеченные красным, действительно существуют в списке зависимостей. Если их нет, переименуйте их так, чтобы они соответствовали существующим именам зависимостей.

Это может произойти, если IntelliJ не закрылся должным образом, и, следовательно, не смог корректно сохранить переименованные имена модулей.

0

Еще одна вещь, которую стоит проверить: убедитесь, что зависимости не дублируются. В моем случае я обнаружил, что модуль, демонстрирующий это поведение, был неправильно настроен: он имел зависимость от другого модуля и зависимость от jar-файла, созданного этим другим модулем. Это приводило к дублированию каждого символа и вызывало неоднозначность.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь