Fügen Sie dem Klassenpfad von IntelliJ eine Eigenschaftendatei hinzu

122

Ich führe ein einfaches Java-Programm über die IntelliJ IDE über das Menü Ausführen-> Ausführen aus. Es funktioniert gut. Jetzt möchte ich log4j logging hinzufügen.

Ich habe einen Ressourcenordner unter meinem Projektstamm hinzugefügt. Ich habe eine log4j.properties-Datei in diesem Ordner hinzugefügt. Ich habe den Code geändert, um etwas zu protokollieren.

Wie kann IntelliJ angewiesen werden, den Ressourcenordner in den Klassenpfad aufzunehmen, damit die Eigenschaftendatei angezeigt wird?

Mit IntelliJ 8 könnte ich wie ein betrunkener Affe raten und es schließlich zum Laufen bringen. Ich habe jetzt 9 und bin völlig erfolglos. Ich habe es eine Stunde lang versucht. Wie wäre es mit einer Option "Zum Klassenpfad hinzufügen" irgendwo? / Rauch / Entlüftung / Schimpfen

Tony Ennis
quelle
Ok, die Situation ist gelöst. Dies ist eine Neuinstallation von IntelliJ - log4J ist standardmäßig NICHT enthalten. In meinem Code hatte ich den Lagerlogger importiert, nicht log4j. Der Stock Logger unterstützt ähnliche Methoden, daher war es nicht offensichtlich, dass ich den falschen Logger verwendet habe! Kein Wunder, dass ich die log4j-Eigenschaftendatei nicht gelesen oder gemeldet habe, dass ich log4j konfigurieren musste. Was für ein Tritt in die Zähne!
Tony Ennis
Fand eine gute Beschreibung für einen Anfänger zu log4j tuttlem.github.io/2015/02/08/start-logging-with-log4j2.html
Rahal Kanishka

Antworten:

91

Versuche dies:

  • Gehen Sie zur Projektstruktur.
  • Wählen Sie Ihr Modul aus.
  • Suchen Sie den Ordner in der Baumstruktur rechts und wählen Sie ihn aus.
  • Klicken Sie auf die Schaltfläche Quellen über diesem Baum (mit dem blauen Ordner), um diesen Ordner zu einem Quellenordner zu machen.
ColinD
quelle
Ich habe das ungefähr 50 Mal gemacht, ich habe es einfach noch einmal gemacht. Meine Ausgabe ändert sich nicht, obwohl ich das Layout-Konvertierungsmuster in etwas geändert habe, das offensichtlich gewesen wäre. Ich frage mich, ob sich in meinem Klassenpfad noch eine log4j.properties befindet.
Tony Ennis
29
Überprüfen Sie die Ressourcenmuster in den Compiler-Einstellungen. Überprüfen Sie, ob "? *. Properties" vorhanden ist. Es ist standardmäßig da, aber das ist das einzige andere, was mir auf den ersten Blick einfällt.
ColinD
3
Alternative zur Schaltfläche "Quellen"
mschr
10
Beachten Sie, dass diese Lösung nicht funktioniert, wenn Sie Ihr Projekt aus einem Maven POM anstelle einer Ad-hoc-Quellstruktur erstellt haben. Stattdessen müssen Sie dieses Verzeichnis als Ressource zum POM hinzufügen. Siehe Peter Thygesens Antwort.
Lreeder
Kann auch programmgesteuert über PropertyConfigurator.configure ("../ conf / log4j.properties") durchgeführt werden
Jason D
47

Tatsächlich haben Sie mindestens zwei Möglichkeiten, die erste Möglichkeit wird von ColinD beschrieben. Sie konfigurieren lediglich den Ordner "resources" als Quellenordner in IDEA. Wenn die Ressourcenmuster die Erweiterung Ihrer Ressource enthalten, wird sie in das Ausgabeverzeichnis kopiert, wenn Sie festlegen, dass das Projekt- und Ausgabeverzeichnis automatisch ein Klassenpfad Ihrer Anwendung ist.

Eine andere übliche Methode besteht darin, den Ordner "resources" direkt zum Klassenpfad hinzuzufügen. Gehen Sie zu Projektstruktur | Module | Ihr Modul | Abhängigkeiten , klicken Sie auf Hinzufügen , Modulbibliothek mit einem Eintrag , und geben Sie den Pfad zum Ordner "Ressourcen" an.

Eine weitere Lösung wäre, die Datei log4j.properties direkt unter dem Quellstamm Ihres Projekts (im Standardpaketverzeichnis) abzulegen . Es ist das gleiche wie die erste Art und Weise , außer Sie eine andere Quelle Wurzel in den Modul nicht hinzufügen müssen Pfade Einstellungen, die Datei in das Ausgabeverzeichnis auf Make kopiert werden.

Wenn Sie mit verschiedenen log4j Konfigurationen testen möchten, kann es einfacher sein , um eine benutzerdefinierte Konfigurationsdatei direkt in die angeben Run / Debug - Konfiguration , VM - Parameter abgelegt , wie:

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

CrazyCoder
quelle
Ich habe Ihre Absätze 2 und 3 ohne Wirkung gemacht. Ich bin mir sicher, dass die Vorschläge funktionieren , nur dass sie keine Wirkung hatten - es verhält sich so, als ob sich im Klassenpfad eine weitere Datei log4j.properties befindet. Aber ich kann es nirgendwo sehen. Wenn ich meine log4j-Eigenschaftendatei vollständig entferne, wird in der Konsole nicht die Warnung "Sie müssen die log4j-Warnung konfigurieren" angezeigt. Ich benutze das kostenlose IntelliJ (und Version 9.x) zum ersten Mal, also hat es vielleicht etwas damit zu tun.
Tony Ennis
1
Die Verwendung des expliziten Parameters -D VM hatte ebenfalls keine Auswirkung. An diesem Punkt kann ich nur vermuten, dass ich von der Spitze des 'dummen Baumes' gefallen bin und jeden Ast auf dem Weg nach unten getroffen habe! Ich denke, ich werde bei JetBrains
Tony Ennis
Könnten Sie bitte das Beispielprojekt mit den genauen Schritten zur Reproduktion des Problems an [email protected] senden?
CrazyCoder
Ich habe -Dlog4j.configuration = file: / c: /log4j.properties in Programmargumenten übergeben. VM-Parameter haben den Trick für mich gemacht.
Ajak6
42

Ich habe das gleiche Problem und es nervt mich enorm !!

Ich habe immer gedacht, ich wäre als Antwort 2 zu tun. Das funktionierte früher in Intellij 9 (jetzt mit 10).

Ich habe jedoch herausgefunden, dass das Hinzufügen dieser Zeile zu meiner Maven Pom-Datei hilft:

<build>
  ...
  <resources>
    <resource>
      <directory>src/main/resources</directory>
    </resource>
  </resources>
  ...
</build>
Peter Thygesen
quelle
Das war genau das Problem, das ich hatte. Jetzt werden Ressourcendateien erfolgreich in den Ausgabeordner kopiert.
Artjomka
Diese Antwort funktioniert wirklich. Ich habe auch getan, was colinD in seinen Kommentaren vorgeschlagen hat. Danke dir.
Vielen Dank, dies ist die einzige Lösung, die für mich funktioniert hat.
Minh Thiện
18

Ich habe ziemlich viel Zeit damit verbracht, herauszufinden, wie das in Intellij 13x geht. Ich habe die Eigenschaftendateien anscheinend nie zu den Artefakten hinzugefügt, für die sie erforderlich waren. Dies ist ein separater Schritt in Intellij. Das folgende Setup funktioniert auch, wenn Sie eine Eigenschaftendatei haben, die von mehreren Modulen gemeinsam genutzt wird.

  • Gehen Sie zu Ihrem Projekt-Setup (STRG + ALT + UMSCHALT + S).
  • Wählen Sie in der Liste das Modul aus, zu dem Sie eine oder mehrere Eigenschaftendateien hinzufügen möchten.
  • Wählen Sie rechts die Registerkarte Abhängigkeiten.
  • Klicken Sie auf das grüne Plus und wählen Sie "Gläser oder Verzeichnisse".
  • Wählen Sie nun den Ordner aus, der die Eigenschaftendatei (en) enthält. (Ich habe nicht versucht, eine einzelne Datei einzuschließen.)
  • Intellij fragt Sie nun, welche "Kategorie" die ausgewählte Datei hat. Wählen Sie "Klassen" (obwohl dies nicht der Fall ist).
  • Jetzt müssen Sie die Eigenschaftendateien zum Artefakt hinzufügen. Intellij gibt Ihnen die unten gezeigte Verknüpfung. Es werden Fehler im roten Teil unten und eine 'rote Glühbirne' angezeigt, die beim Klicken eine Option zum Hinzufügen der Dateien zum Artefakt anzeigt. Sie können auch zum Abschnitt "Artefakte" gehen und die Dateien manuell zu den Artefakten hinzufügen.

Geben Sie hier die Bildbeschreibung ein

Julius
quelle
14

Es gab eine ähnliche Herausforderung beim Hinzufügen von Dateien mit INI-Erweiterungen zum Klassenpfad. Diese Antwort wurde gefunden, indem sie zu Einstellungen -> Compiler -> Ressourcenmuster -> [...]; *. Ini hinzugefügt wird

Prototyp
quelle
1
Dies war genau das Problem, das ich mit .conf-Dateien hatte
James
Ich dachte, was ist mit meinem Code los? Vielen Dank für diese Lösung
Shoaib Chikate
5

Wenn Sie jemals das gleiche Problem mit Scala und SBT haben:

  • Gehen Sie zur Projektstruktur. Die Verknüpfung lautet (STRG + ALT + UMSCHALT + S).

  • Wählen Sie in der Liste ganz links Projekteinstellungen> Module

  • Wählen Sie in der Modulliste rechts davon das Modul Ihres Projektnamens (ohne Build) aus und wählen Sie die Registerkarte Quellen

  • Erweitern Sie in der Mitte den Ordner, der für mich das Stammverzeichnis Ihres Projekts ist /home/<username>/IdeaProjects/<projectName>

  • Schauen Sie sich den Abschnitt Content Root auf der rechten Seite an. Die roten Pfade sind Verzeichnisse, die Sie nicht erstellt haben. Sie möchten die Eigenschaftendatei in einem Ressourcenverzeichnis ablegen. Also habe ich src/main/resourceslog4j.properties erstellt und eingefügt. Ich glaube, Sie können den Inhaltsstamm auch so ändern, dass er an einer beliebigen Stelle platziert wird (ich habe dies nicht getan).

  • Ich habe meinen Code mit einer SBT-Konfiguration ausgeführt und meine Datei log4j.properties gefunden.

Geben Sie hier die Bildbeschreibung ein

user2361174
quelle
2

Für diejenigen unter Ihnen, die von Eclipse zu IntelliJ migrieren oder umgekehrt, ist hier ein Tipp, wenn Sie mit Eigenschaftendateien oder anderen Ressourcendateien arbeiten.

Es ist verrückt (es hat mich einen ganzen Abend gekostet, es herauszufinden), aber beide IDEs funktionieren sehr unterschiedlich, wenn es darum geht, nach Ressourcen- / Eigenschaftendateien zu suchen, wenn Sie lokal von Ihrer IDE oder während des Debuggens ausgeführt werden möchten. (Das Verpacken in ein .jar ist auch ganz anders, aber das ist besser dokumentiert.)

Angenommen, Sie haben eine relative Pfadverweisung wie diese in Ihrem Code:

new FileInputStream("xxxx.properties");

(Dies ist praktisch, wenn Sie mit env-spezifischen .properties-Dateien arbeiten, die Sie nicht zusammen mit Ihrer JAR packen möchten.)

INTELLIJ

(Ich benutze 13.1, könnte aber für weitere Versionen gültig sein)

Die Datei xxxx.properties muss sich im PARENT-Verzeichnis des Projekts ROOT befinden, damit sie zur Laufzeit in IntelliJ zur Laufzeit abgerufen werden kann. (Im Projekt ROOT befindet sich der Ordner / src.)

FINSTERNIS

Eclipse ist nur glücklich, wenn sich die Datei xxxx.properties im Projekt ROOT selbst befindet.

Daher erwartet IntelliJ, dass die .properties-Datei 1 Ebene höher als Eclipse ist, wenn auf sie so verwiesen wird !!

Dies wirkt sich auch auf die Art und Weise aus, wie Sie Ihren Code ausführen müssen, wenn Sie dieselbe Codezeile (neuer FileInputStream ("xxxx.properties");) in Ihrer exportierten JAR-Datei haben. Wenn Sie agil sein und die .properties-Datei nicht mit Ihrer JAR-Datei verpacken möchten, müssen Sie die JAR-Datei wie folgt ausführen, um die .properties-Datei über die Befehlszeile korrekt zu referenzieren:

INTELLIJ EXPORTED JAR

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

ECLIPSE EXPORTED JAR

java -jar some.jar

Wenn das von Eclipse exportierte ausführbare JAR nur erwartet, dass sich die referenzierte .properties-Datei am selben Speicherort befindet wie die .jar-Datei

DataHacker
quelle
Ja, logging.properties muss im Gegensatz zu log4j2.xml oder log4j.properties im IntelliJ-Modulstamm gefunden werden. Auch im Gegensatz zu Log4j, das nur funktioniert, hatte ich festgestellt, dass ich immer noch eine Jury haben musste, um in IntelliJ zu laufen (Eclipse wäre die gleiche Geschichte, dies ist die Schuld von Java Logging), siehe stackoverflow.com/questions/960099/… . Eine Alternative wäre, die Run / Debug-Konfiguration mit -Djava.util.logging.config.file = zu korrigieren, was ich ziemlich unpraktisch finde, da ich die Konfiguration lieber im Code oder in einer erwarteten Eigenschaftendatei hätte.
Russ Bateman
1

Vielleicht ist dies ein bisschen unangebracht, da die Frage bereits beantwortet wurde, aber ich habe ein ähnliches Problem festgestellt. In meinem Fall wurden beim Kompilieren nur einige der Unit-Test-Ressourcen in den Ausgabeordner kopiert. Meine persistence.xml im META-INF- Ordner wurde kopiert, aber sonst nichts .

Am Ende "löste" ich das Problem, indem ich die problematischen Dateien umbenannte, das Projekt neu erstellte und dann die Dateinamen wieder in die ursprünglichen änderte. Fragen Sie mich nicht, warum das funktioniert hat, aber es hat funktioniert. Ich vermute, dass mein IntelliJ-Projekt irgendwie nicht mehr mit dem Dateisystem synchronisiert war und der Umbenennungsvorgang eine Art internen "Ressourcen-Rescan" auslöste.

user1426162
quelle
1

Dies ist einer der dummen Fehler, die ich gemacht habe. Ich habe viel Zeit damit verbracht, dieses Problem zu beheben, und alle oben genannten Antworten ausprobiert, aber am Ende war es einer meiner vielen dummen Fehler.

Ich habe org.apache.logging.log4j.Logger(: fml :) verwendet, während ich hätte verwenden sollen org.apache.log4j.Logger. Mit diesem richtigen Logger habe ich meinen Abend gerettet.

avp
quelle
0

Ich hatte ein ähnliches Problem mit einer log4j.xml-Datei für einen Komponententest und habe alle oben genannten Schritte ausgeführt. Aber ich habe herausgefunden, dass ich nur einen fehlgeschlagenen Test erneut ausgeführt habe. Wenn ich die gesamte Testklasse erneut ausgeführt habe, wird die richtige Datei abgerufen. Dies ist unter Intelli-j 9.0.4

James B.
quelle