La inspección de IntelliJ muestra "No se puede resolver el símbolo" pero aún compila el código
Plataforma: IntelliJ Community Edition 10.0.3
SDK: jdk1.6.0_21
SO: Windows 7
Tengo una situación extraña con IntelliJ que me tiene completamente perplejo. Configuré un proyecto Maven y agrego log4j como dependencia en el archivo pom.xml. Las inspecciones de IDEA funcionan bien y todas las pruebas de mi unidad se compilan y ejecutan.
Luego agregué la biblioteca jmime de hunnysoft a mi repositorio maven local usando el archivo mvn install:install de la siguiente manera.
mvn install:install-file -Dfile=jmime.jar -DgroupId=jmime \
-DartifactId=jmime -Dversion=3.1.1e -Dpackaging=jar
Maven instaló bien el archivo jar en mi repositorio local.
Luego entré en Configuración de IntelliJ => Maven => Servicios de repositorio y actualicé mi repositorio local (para que IntelliJ reindexara el contenido del repositorio).
Finalmente, agregué la siguiente dependencia a mi archivo pom.xml (justo encima de la dependencia log4j).
<dependency>
<groupId>jmime</groupId>
<artifactId>jmime</artifactId>
<version>3.1.1e</version>
</dependency>
Ahora creo una nueva clase de la siguiente manera:
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;
}
}
Ahora la rareza. El mecanismo de intención de IntelliJ detecta y reconoce perfectamente la importación de Logger en el archivo maven pom. Sin embargo, para todas las importaciones de hunnysoft, informa: "No se puede resolver el símbolo 'ByteString/Field/FieldBody'", PERO Build => Compile 'StackOverflowQuestion.java' compila todo correctamente y la prueba unitaria que creé para esta clase funciona bien (aunque las intenciones marcan la llamada a create() como un área problemática también).
Entonces, en algún lugar, IntelliJ está ignorando el archivo jmime.jar para el subsistema de intención. Estoy confundido porque la dependencia log4j funciona bien y todo se compila y funciona bien. F12 ("Declaración Ir a") funciona en la importación de Logger, pero falla en todas las importaciones de jmime.
Ah, otra cosa, si voy a la vista 'Paquetes' en la ventana "Proyectos", aparece el paquete "com.hunnysoft.jmime" y puedo ver TODAS las clases que importé en el fragmento de código anterior en "Bibliotecas". . Eliminar la dependencia anterior del archivo pom.xml hace que este paquete desaparezca y la compilación se interrumpa.
Parece que el classpath de la inspección está roto, pero no parece haber una configuración para esto en ninguna parte en Configuración => Intenciones | Áreas del compilador (no es que esperara tales configuraciones, creo que IDEA ya debería conocer la ruta de clases correcta según el archivo pom y JDK).
Como experimento final, creé un nuevo proyecto de aplicación J2SE estándar (sin usar maven) y agregué el archivo jmime.jar directamente al proyecto como una de sus bibliotecas. Me encuentro exactamente con los mismos problemas descritos anteriormente en este nuevo proyecto.
Aquí está el MANIFEST.MF del archivo jar jmime.
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.
No veo nada inusual en este archivo jar.
Mi mejor suposición es que quizás el problema sea una cuestión de dependencia faltante. Pero se supone que AFAIK jmime es autónomo (JarAnalyzer no genera nada, pero no estoy seguro de que lo haga si falta un contenedor de dependencia).
Entonces, ¿alguien tiene alguna IDEA?
En primer lugar, debe intentarlo File | Invalidate Caches
y, si no ayuda, eliminar el directorio del sistema IDEA . Luego vuelva a importar el proyecto Maven y vea si ayuda.
En algunos casos extraños, las clases compiladas pueden informar información incorrecta y confundir IDEA. Verifique que las clases de este jar informen los nombres correctos usando javap .
El siguiente truco resolvió este problema por mí:
- Haga clic derecho en el editor de código.
- Pase el cursor sobre Maven y expanda
- Haga clic en Reimportar
La versión de mi idea es 12.0.4
Ninguna de las soluciones anteriores funcionó para mí. Lo que hizo fue eliminar el archivo main.iml manualmente y de repente funcionó.
Esto se mencionó en otra respuesta a esta misma pregunta aquí , pero esto por sí solo me soluciona el problema. Hago todas mis compilaciones en una terminal separada, fuera de IntelliJ. Por lo tanto, el caché debe tener establecidos los permisos adecuados para que la aplicación IntelliJ los lea.
Ejecútelo desde la carpeta raíz del proyecto.
$ mvn -U idea:idea
Para usuarios de Gradle:
Es posible que necesite sincronizar su proyecto con su build.gradle
archivo.
Puede hacer clic derecho en su archivo gradle en el panel Proyecto para hacer esto, pero eso no pareció hacer nada por mí (sospecho que hay un error en mi versión). Sabrá si esto sucede porque no iniciará ninguna tarea de IntelliJ que esté esperando. En su lugar, abra el panel de herramientas Gradle y luego haga clic en el botón sincronizar (actualizar). Esto funcionó para mí, pero invalidar el caché y reiniciar no.
Mi propia circunstancia: estaba usando un proyecto Scala con Gradle y tuve que hacer esto.