2011-12-12 14 views
6

Ho provato a cercare una soluzione per questo, ma non hanno avuto la gioia: In IntelliJ IDEA Ho creato un insieme di moduli in modo da avere il seguente:IntelliJ IDEA redattore: ordine classpath

  • My Web Progetto (tutte le dipendenze dei moduli impostato su 'Runtime')
  • My Web Progetto Dipendenza # 1 (+ artefatto che le copie JAR di MWP/WEB-INF/lib)
  • My Web Progetto Dipendenza # 2 (+ artefatto che copia JAR in MWP/WEB-INF/lib)

La dipendenza # 1 ha una classe org.acme.foo, ma lo stesso vale per MWP e la definizione è diversa (oh gioia). Costruisce bene - tutto il codice in MWP si basa correttamente sulle classi in MWP invece che sulla dipendenza n. 1.

Ma ... nel suo editor, Intellij mi sta dando il ghirigoro rosso perché preferisce fare riferimento alla classe in Dipendenza # 1 con la sua definizione incompatibile.

Ignorando il fatto che non ci dovrebbe essere questo scontro di classe/pacchetto, qualcuno può aiutarmi a spingere Intellij a guardare la classe nel modulo locale e non la classe nella dipendenza?

EDIT: Sto utilizzando l'ultima Intellij 11.

EDIT: per chiunque trovare questa domanda, questi problemi se ne andò in IntelliJ 12+

risposta

8

stavo affrontando lo stesso problema in IntelliJ 11 (Mac OS X versione).

Ho modificato manualmente il file .iml del mio progetto e riorganizzato le dipendenze nell'ordine corretto: ho messo l'elemento orderEntry che contiene la giusta versione del file .jar in cima.

Spero che questo aiuti.

+0

Grazie - Sono appena tornato su questo, dopo aver abbandonato Intellij e tornare su Eclipse: pressioni a scadenza. Ho provato ancora questa settimana con lo stesso progetto e ho scoperto che il problema era andato via nel LAPE di Leda. Ordinare le dipendenze ha funzionato correttamente questa volta. – tridian

0

Ho un problema simile che sto cercando di lavorare attraverso

Ho trovato due situazioni in cui so che questo si verifica e ho trovato un modo per aggirare uno di loro.

Scenario 1) Si classe si riferisce a una classe nel classpath a monte della catena di quello trovato anche in vaso, ma nella dichiarazione di importazione l'istruzione import è della forma

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

By bulking in alto, l'IDE sembra raccogliere tutte le classi in quel pacchetto dalla stessa posizione di jar. Suddividendole in singole istruzioni di classe di importazione, l'IDE le raccoglierà separatamente.

Scenario 2) Metodi di daisy class classe per la classe sovrascritta.

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

se getSomethingElse() restituisce un oggetto che non è tuttavia in classe (in modo da non dovete importarlo) allora è ancora ottenere l'errore. (Aggiungendo i grigi di importazione, la linea non appena viene riconosciuta non viene utilizzata, quindi non aiuta). Io non condonerei comunque questo metodo.

edit: Ovvio alternativa a questo è il refactoring del codice per rompere la linea verso il basso per

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

e quindi importare la variabile TEMP ...

Ovviamente questo non è l'ideale, e non dovresti refactoring il tuo codice per il tuo IDE, ma è necessario, quelle linee rosse mi infastidiscono.

Spero che questo aiuto. Se hai trovato una soluzione migliore per favore condividi!

saluti, M

+2

Grazie - Sono appena tornato su questo, dopo aver abbandonato Intellij e tornare su Eclipse: pressioni di scadenza. Ho provato ancora questa settimana con lo stesso progetto e ho scoperto che il problema era andato via nel LAPE di Leda. Ordinare le dipendenze ha funzionato correttamente questa volta. – tridian

+0

Penso che tu abbia frainteso l'importazione. È semplicemente una sintassi sintattica, niente di più. Non influenza ciò che i JAR appaiono sul classpath o qualcosa del genere. Ti aiuta solo a risparmiare tempo e rende più leggibile il tuo codice, digitando 'ObjectToImport' invece di' com.company.classes.to.use.ObjectToImport'. – Frans

+0

Grazie Frans ma no non lo so. Ciò che era in questione non è ciò che importa, o cosa fa java, ciò che Intellij stava facendo. Ovviamente questo è mezzo decennio fa quindi sono sicuro che non ne risentirà più. –

11

Ho avuto questo problema e stavo usando la risposta di Vladimir, che ha funzionato (da qui la mia upvote), ma purtroppo ho scoperto che ho dovuto continuare a ri-modificare il file .iml come è stato costantemente riscritta. Dopo un po 'di scavo ho scoperto come cambiare questo in modo permanente:

Passare a File -> Struttura Progetto -> Moduli -> -> Dipendenze scheda

IntelliJ aggiungerà le dipendenze al classpath nell'ordine in cui sono elencati lì . Per spostarli, evidenzia semplicemente la dipendenza che vuoi spostare e usa le frecce su e giù nella barra degli strumenti in basso.

+0

Quindi, questa sarebbe la risposta? – Rekin

+0

Funziona per me :-) –

+0

Ciao. Tornando a questi eoni dopo la tua risposta ...... vita ecc ... quello che hai descritto ha funzionato perfettamente in Intellij 12+, ma non in 11. – tridian

1

Nel mio caso, ha funzionato bene in Eclipse ma è successo in IntelliJ. La ragione è davvero le librerie strumenti di carico/barattoli a seconda diversi meccanismi:

  • Eclipse: i file .classpath
  • IntelliJ: file * .iml

Ho un sacco di librerie/vasi sono in una directory. La directory è inclusa nel file * .iml come questo <orderEntry type="library" name="external-libs" level="project" /> Ci sono 2 librerie/librerie con conflitto (entrambe nel mio caso contengono "org.joda.time.DateTime"). Ma 2 DateTimes hanno funzioni diverse. Devo specificare uno di loro dovrebbe essere caricato prima di un altro.

Soluzione:

  1. Vai a "File-> Progetto struttura-> Dipendenze"
  2. Premere il pulsante "+" in basso per includere il lib/vaso voglio caricare prima.
  3. Utilizzare i pulsanti su/giù per spostare la lib/jar appena inclusa sopra la directory/jar/libs del conflitto.
  4. Ricostruisci il progetto.

Vedere lo screenshot. joda-time-2.4.jar viene aggiunto sopra external-libs per controllare la sequenza di caricamento. joda-time-2.4.jar is added before external-libs to be loaded first.