Aggiungi un file delle proprietà al classpath di IntelliJ


122

Sto eseguendo un semplice programma Java dall'IDE IntelliJ utilizzando il menu Esegui-> Esegui. Funziona bene. Ora voglio aggiungere la registrazione log4j.

Ho aggiunto una cartella delle risorse sotto la radice del mio progetto. Ho aggiunto un file log4j.properties in quella cartella. Ho cambiato il codice per registrare qualcosa.

Qual è il modo giusto per dire a IntelliJ di includere la cartella delle risorse nel classpath in modo che venga visualizzato il file delle proprietà?

Con IntelliJ 8 potevo indovinare come una scimmia ubriaca e alla fine farlo funzionare. Ora ne ho 9 e non ho avuto successo. Ci provo da un'ora. Che ne dici di un'opzione "Aggiungi a classpath" da qualche parte? / fume / vent / rant


Ok, la situazione è risolta. Questa è una nuova installazione di IntelliJ - log4J NON è incluso per impostazione predefinita. Nel mio codice avevo importato lo stock logger, non log4j. Lo stock logger supporta metodi simili quindi non era ovvio che stavo usando il logger sbagliato! Nessuna sorpresa perché non stava leggendo il file delle proprietà di log4j o non stava segnalando che avevo bisogno di configurare log4j. Che calcio nei denti!
Tony Ennis,

Ho trovato una buona descrizione per un principiante per log4j tuttlem.github.io/2015/02/08/start-logging-with-log4j2.html
Rahal Kanishka

Risposte:


91

Prova questo:

  • Vai a Struttura del progetto.
  • Seleziona il tuo modulo.
  • Trova la cartella nell'albero a destra e selezionala.
  • Fare clic sul pulsante Fonti sopra quell'albero (con la cartella blu) per rendere quella cartella una cartella di sorgenti.

L'ho fatto circa 50 volte, l'ho fatto di nuovo. Il mio output non cambia anche se ho cambiato il modello di conversione del layout in qualcosa che sarebbe stato ovvio. Mi chiedo se un altro log4j.properties è nel mio classpath.
Tony Ennis,

29
Controlla i modelli di risorsa nelle impostazioni del compilatore. Controlla che "? *. Properties" sia presente. È lì per impostazione predefinita, ma è l'unica altra cosa a cui riesco a pensare in cima alla mia testa.
ColinD

3
Alternativa al pulsante Fonti: fai clic con il pulsante destro del mouse su qualsiasi directory che hai creato e seleziona "Contrassegna directory come": "Source Root"
mschr

10
Nota che se hai creato il tuo progetto da un Maven POM, invece di una struttura sorgente ad-hoc, questa soluzione non funzionerà. Invece è necessario aggiungere quella directory come risorsa al POM. Vedi la risposta di Peter Thygesen.
lreeder

Può anche essere fatto in modo programmatico tramite PropertyConfigurator.configure ("../ conf / log4j.properties")
Jason D

47

In realtà, hai almeno 2 modi per farlo, il primo è descritto da ColinD, devi solo configurare la cartella "risorse" come cartella Sorgenti in IDEA. Se i modelli di risorsa contengono l'estensione della risorsa, verranno copiati nella directory di output quando si crea il progetto e la directory di output è automaticamente un percorso di classe dell'applicazione.

Un altro modo comune è aggiungere direttamente la cartella "risorse" al classpath. Vai alla struttura del progetto | Moduli | Il tuo modulo | Dipendenze , fare clic su Aggiungi , Libreria modulo a voce singola , specificare il percorso della cartella "risorse".

Un'altra soluzione potrebbe essere quella di mettere il file log4j.properties direttamente nella root di origine del progetto (nella directory del pacchetto predefinita). È lo stesso del primo modo tranne per il fatto che non è necessario aggiungere un'altra radice di origine nelle impostazioni dei percorsi del modulo , il file verrà copiato nella directory di output su Make.

Se si desidera eseguire il test con diverse configurazioni log4j, potrebbe essere più semplice specificare un file di configurazione personalizzato direttamente nella configurazione Run / Debug , i parametri della VM sono archiviati come:

-Dlog4j.configuration=file:/c:/log4j.properties.


Ho fatto i tuoi paragrafi 2 e 3 senza alcun effetto. Sono sicuro che i suggerimenti funzionano , è solo che non hanno avuto alcun effetto: si comporta come se ci fosse un altro file log4j.properties nel classpath. Ma non riesco a vederlo da nessuna parte. Se rimuovo del tutto il mio file delle proprietà log4j non ricevo l'avviso "è necessario configurare log4j" nella console. Sto usando IntelliJ gratuito (e la versione 9.x) per la prima volta, quindi forse ha qualcosa a che fare con questo.
Tony Ennis,

1
Anche l'utilizzo del parametro -D VM esplicito non ha avuto alcun effetto. A questo punto posso solo supporre di essere caduto dalla cima dello "stupido albero" e di aver colpito tutti i rami durante la discesa! Penso che andrò a strascicare a JetBrains e chiederò in giro ...
Tony Ennis,

Potresti inviare il progetto di esempio con i passaggi esatti per riprodurre il problema a support@jetbrains.com?
CrazyCoder

Stavo passando -Dlog4j.configuration = file: / c: /log4j.properties negli argomenti del programma. I parametri della VM hanno fatto il trucco per me.
Ajak6

42

Ho lo stesso problema e mi infastidisce tremendamente !!

Ho sempre pensato di essere costretto a fare come risposta 2. Questo funzionava in Intellij 9 (ora usando 10).

Tuttavia ho capito che aggiungendo queste righe al mio file pom di maven aiuta:

<build>
  ...
  <resources>
    <resource>
      <directory>src/main/resources</directory>
    </resource>
  </resources>
  ...
</build>

Questo era esattamente il problema che stavo avendo, ora i file di risorse vengono copiati correttamente nella cartella di output.
artjomka

Questa risposta funziona davvero. Ho fatto anche quello che ColinD ha suggerito nei suoi commenti. Grazie.

Grazie, questa è l'unica soluzione che ha funzionato per me.
Minh Thiện

18

Ho passato parecchio tempo a capire come farlo in Intellij 13x. Apparentemente non ho mai aggiunto i file delle proprietà agli artefatti che li richiedevano, il che è un passaggio separato in Intellij. La configurazione seguente funziona anche quando si dispone di un file delle proprietà condiviso da più moduli.

  • Vai alla configurazione del tuo progetto (CTRL + ALT + MAIUSC + S)
  • Nell'elenco selezionare il modulo a cui si desidera aggiungere uno o più file delle proprietà.
  • A destra, seleziona la scheda Dipendenze.
  • Fare clic sul segno più verde e selezionare "Jars o directory".
  • Ora seleziona la cartella che contiene i file delle proprietà. (Non ho provato a includere un singolo file)
  • Intellij ora ti chiederà qual è la "categoria" del file selezionato. Scegli "classi" (anche se non lo sono).
  • Ora devi aggiungere i file delle proprietà all'artefatto. Intellij ti darà la scorciatoia mostrata di seguito. Mostrerà gli errori nella parte rossa in basso e una "lampadina rossa" che, se cliccata, mostra un'opzione per aggiungere i file all'artefatto. Puoi anche andare alla sezione "artefatti" e aggiungere manualmente i file agli artefatti.

inserisci qui la descrizione dell'immagine


14

Ha affrontato una sfida simile aggiungendo file con estensioni .ini al classpath. Trovato questa risposta , che è di aggiungerla a Preferenze -> Compilatore -> Modelli di risorse -> [...]; *. Ini


1
questo era il problema esatto che stavo avendo con i file .conf
James

Ho pensato che diavolo c'è di sbagliato nel mio codice? Grazie per questa soluzione
Shoaib Chikate

5

Se mai dovessi ritrovarti con lo stesso problema con Scala e SBT:

  • Vai a Struttura del progetto. Il collegamento è (CTRL + ALT + MAIUSC + S)

  • Nell'elenco all'estrema sinistra, scegli Impostazioni progetto> Moduli

  • Nell'elenco dei moduli a destra di quello, seleziona il modulo del nome del tuo progetto (senza la build) e scegli la scheda delle fonti

  • Nel mezzo, espandi la cartella che è la radice del tuo progetto per me /home/<username>/IdeaProjects/<projectName>

  • Guarda la sezione Content Root sul lato destro, i percorsi rossi sono directory che non hai creato. Ti consigliamo di inserire il file delle proprietà in una directory delle risorse. Quindi ho creato src/main/resourcese inserito log4j.properties. Credo che tu possa anche modificare il Content Root per metterlo dove vuoi (non l'ho fatto).

  • Ho eseguito il mio codice con una configurazione SBT e ha trovato il mio file log4j.properties.

inserisci qui la descrizione dell'immagine


2

Per quelli di voi che migrano da Eclipse a IntelliJ o viceversa, ecco un suggerimento quando si lavora con file di proprietà o altri file di risorse.

È esasperante (mi è costato un'intera serata per scoprirlo) ma entrambi gli IDE funzionano in modo abbastanza diverso quando si tratta di cercare file di risorse / proprietà quando si desidera eseguire localmente dal proprio IDE o durante il debug. (Anche il packaging in un .jar è abbastanza diverso, ma è documentato meglio.)

Supponi di avere un riferimento di percorso relativo come questo nel tuo codice:

new FileInputStream("xxxx.properties");

(il che è comodo se lavori con file .properties specifici di env che non vuoi impacchettare insieme al tuo JAR)

IntelliJ

(Io uso 13.1, ma potrebbe essere valido per più versioni)

Il file xxxx.properties deve trovarsi nella directory PARENT del progetto ROOT per poter essere prelevato a runtime in questo modo in IntelliJ. (La ROOT del progetto è dove risiede la cartella / src)

ECLISSE

Eclipse è solo felice quando il file xxxx.properties si trova nella ROOT del progetto stesso.

Quindi IntelliJ si aspetta che il file .properties sia di 1 livello più alto di Eclipse quando viene referenziato in questo modo !!

Ciò influisce anche sul modo in cui devi eseguire il codice quando hai questa stessa riga di codice (new FileInputStream ("xxxx.properties");) nel tuo file .jar esportato. Quando vuoi essere agile e non vuoi impacchettare il file .properties con il tuo jar, dovrai eseguire il jar come di seguito per fare riferimento correttamente al file .properties dalla riga di comando:

VASO ESPORTATO INTELLIJ

java -cp "/path/to_properties_file/:/path/to_jar/some.jar" com.bla.blabla.ClassContainingMainMethod

VASO ESPORTATO ECLIPSE

java -jar some.jar

dove il jar eseguibile esportato da Eclipse si aspetta solo che il file .properties di riferimento si trovi nella stessa posizione in cui si trova il file .jar


Sì, logging.properties, a differenza di log4j2.xml o log4j.properties, deve essere trovato nella root del modulo IntelliJ. Inoltre, a differenza di Log4j, che funziona, avevo scoperto che dovevo ancora essere sottoposto a una giuria per correre all'interno di IntelliJ (Eclipse sarebbe la stessa storia, questa è colpa del logging di Java), vedi stackoverflow.com/questions/960099/… . Un'alternativa sarebbe quella di correggere la configurazione di esecuzione / debug con -Djava.util.logging.config.file =, che trovo piuttosto scomodo in quanto preferirei avere la configurazione nel codice o in un file di proprietà previsto.
Russ Bateman

1

Forse questo è un po 'fuori tema, visto che alla domanda è già stata data risposta, ma ho riscontrato un problema simile. Nel mio caso solo alcune delle risorse di unit test sono state copiate nella cartella di output al momento della compilazione. Il mio persistence.xml nella cartella META-INF è stato copiato ma nient'altro .

Alla fine ho "risolto" il problema rinominando i file problematici, ricostruendo il progetto e poi riportando i nomi dei file a quelli originali. Non chiedermi perché ha funzionato, ma ha funzionato. La mia ipotesi migliore è che, in qualche modo, il mio progetto IntelliJ fosse un po 'fuori sincrono con il file system e l'operazione di ridenominazione abbia innescato una sorta di "riscrittura delle risorse" interna.


1

Questo è uno degli stupidi errori che ho fatto. Ho passato molto tempo a cercare di eseguire il debug di questo problema e ho provato tutte le risposte pubblicate sopra, ma alla fine è stato uno dei miei tanti errori stupidi.

Stavo usando org.apache.logging.log4j.Logger(: fml :) mentre avrei dovuto usare org.apache.log4j.Logger. L'utilizzo di questo logger corretto ha salvato la mia serata.


0

Ho avuto un problema simile con un file log4j.xml per uno unit test, ho fatto tutto quanto sopra. Ma ho capito che era perché stavo solo rieseguendo un test fallito .... se riesco a rieseguire l'intera classe di test, viene prelevato il file corretto. Questo è sotto Intelli-j 9.0.4

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.