2011-12-12 18 views
6

He tratado de buscar una solución para esto, pero no han tenido la alegría: En IntelliJ IDEA He creado un conjunto de módulos de manera que tengo el siguiente:IntelliJ IDEA editor: Para la ruta de clase

  • Mi Proyecto web (todas las dependencias del módulo establecido en 'tiempo de ejecución')
  • Mi web del Proyecto Dependencia # 1 (+ artefacto que copias JAR del PCM/wEB-INF/lib)
  • Mi web del Proyecto Dependencia # 2 (+ artefacto que copia JAR en MWP/WEB-INF/lib)

Dependency # 1 tiene una clase org.acme.foo, pero también lo hace MWP y la definición difiere (oh joy). Construye bien - todo el código en MWP construye correctamente contra las clases en MWP en lugar de Dependency # 1.

Pero ... en su editor, Intellij me está dando el garabato rojo porque está prefiriendo hacer referencia a la clase en Dependencia n. ° 1 con su definición incompatible.

Ignorando el hecho de que realmente no debería haber este choque de clase/paquete, ¿alguien puede ayudarme a presionar a Intellij para que mire la clase en el módulo local y no en la clase de la dependencia?

EDIT: Estoy usando la última Intellij 11.

EDIT: para cualquier persona encontrar esta pregunta, estos problemas se fueron en IntelliJ 12+

Respuesta

8

que estaba frente a la misma cuestión en IntelliJ 11 (versión para Mac OS X).

Edité manualmente el archivo .iml de mi proyecto y reorganicé las dependencias en el orden correcto: Puse el elemento orderEntry que contiene la versión correcta del archivo .jar en la parte superior.

Espero que esto ayude.

+0

Gracias. Acabo de volver a esto, después de abandonar Intellij y volver a Eclipse: presiones de fecha límite. Intenté nuevamente esta semana con el mismo proyecto y descubrí que el problema había desaparecido en Leda EAP. El pedido de las dependencias funcionó correctamente esta vez. – tridian

0

Tengo un problema similar que estoy tratando de trabajar a través.

He encontrado dos situaciones en las que sé que esto ocurre y he encontrado una forma de sortear una de ellas.

Escenario 1) la clase se refiere a una clase en la ruta de clase más arriba en la cadena a la que también se encuentra en la jarra, sin embargo, en la declaración de importación la declaración de importación es de la forma

import com.company.classes.to.use.* 

Por bulking ellos, el IDE parece recoger todas las clases en ese paquete desde la misma ubicación de jar. Al dividirlos en declaraciones de clase de importación individuales, el IDE los recogerá por separado.

Escenario 2) Usted clasifica los métodos de encadenamiento de margaritas para la clase anulada.

something.getSomethingElse().getAnotherThing().getYetAnotherThing(); 

si getSomethingElse() devuelve un objeto que no es otra cosa en la clase (para que no tenga que importarlo), entonces usted todavía consigue el error. (Agregar los grises de importación a la línea, ya que reconoce que no se utiliza, por lo que no ayuda). No aprobaría este método de todos modos.

edición: alternativa obvia a esto es refactorizar el código para romper la línea de abajo a

ObjectToImport obj = something.getSomethingElse(); 
result = obj.getAnotherThing.getYetAnotherThing(); 

y luego importar la variable temp ...

Obviamente esto no es ideal, y no deberías refaccionar tu código por el bien de tu IDE, pero las necesidades deben, esas líneas rojas me molestan muchísimo.

Espero que estos ayuden. Si ha encontrado una mejor solución, ¡por favor comparta!

Saludos, M

+2

Gracias - Acabo de volver a esto, después de abandonar Intellij y volver a Eclipse: presiones de fecha límite. Intenté nuevamente esta semana con el mismo proyecto y descubrí que el problema había desaparecido en Leda EAP. El pedido de las dependencias funcionó correctamente esta vez. – tridian

+0

Creo que malinterpretas lo que importa. Es simplemente una taquigrafía sintáctica, nada más. No influye en qué JAR aparecen en el classpath ni nada de eso. Simplemente lo ayuda a ahorrar tiempo y hace que su código sea más legible al permitirle escribir 'ObjectToImport' en lugar de' com.company.classes.to.use.ObjectToImport'. – Frans

+0

Gracias Frans pero no, yo no. Lo que estaba en cuestión no es qué importa, o qué hace Java, sino qué estaba haciendo Intellij. Por supuesto, esto es hace media década, así que estoy seguro de que ya no sufrirá más. –

11

Tuve este problema y estaba usando la respuesta de Vladimir que funcionó (de ahí mi voto) pero desafortunadamente encontré que tenía que seguir reeditando el archivo .iml ya que constantemente se reescribía. Después de algo de investigación he encontrado cómo cambiar esta forma permanente:

Vaya a Archivo -> Estructura del proyecto -> Módulos -> -> Dependencias pestaña

IntelliJ añadirá las dependencias de la ruta de clase en el orden en que aparecen allí . Para moverlos, simplemente resalte la dependencia que desea mover y use las flechas hacia arriba y hacia abajo en la barra de herramientas en la parte inferior.

+0

Entonces, ¿esa sería la respuesta? – Rekin

+0

Funciona para mí :-) –

+0

Hola. Volviendo a esto eones después de su respuesta ... vida, etc. ... lo que describió funcionó perfectamente en Intellij 12+, pero no en 11. – tridian

1

En mi caso, funcionó bien en Eclipse pero sucedió en IntelliJ. La razón es realmente las librerías de carga/frascos herramientas en función de diferentes mecanismos:

  • Eclipse: archivos .classpath
  • IntelliJ: archivos * .iml

Tengo un montón de libs/frascos son en un directorio El directorio está incluido en el archivo * .iml como este <orderEntry type="library" name="external-libs" level="project" /> Hay 2 libs/jar que tienen conflicto (ambos contienen "org.joda.time.DateTime" en mi caso). Pero 2 DateTimes tienen diferentes funciones. Tengo que especificar que uno de ellos debe estar cargado antes que otro.

Solución:

  1. Ir a "Archivo-> Proyecto de Estructura-> Dependencias"
  2. Pulse el botón "+" en la parte inferior para incluir el directorio lib/tarro quiero cargar primero.
  3. Use los botones arriba/abajo para mover la lib/jar incluida arriba del directorio/jars/libs del conflicto.
  4. Reconstruye el proyecto.

Ver la captura de pantalla. joda-time-2.4.jar se agrega arriba de libs-externas para controlar la secuencia de carga. joda-time-2.4.jar is added before external-libs to be loaded first.