Wenn Sie maven verwenden, setzen Sie normalerweise log4j.properties unter Java oder Ressourcen?

128

Wo soll ich die Datei log4j.properties ablegen, wenn ich die herkömmlichen Maven-Verzeichnisse verwende?

user496949
quelle
6
src / test / resources - Der Verbraucher Ihres Artefakts legt die für die Bereitstellung erforderlichen Protokollierungsstufen fest. Ich würde jedoch slf4j empfehlen, wenn Sie dies für kommerzielle Arbeiten tun. Dies bietet die Möglichkeit, die Protokollierungsframeworks bei der Bereitstellung zu wechseln. slf4j.org
David Victor
2
Übrigens, wenn Sie nur experimentieren möchten, ist es möglich, log4j ohne eine Eigenschaften- / XML-Konfigurationsdatei zu verwenden. Aus ' logging.apache.org/log4j/1.2/manual.html - Konfiguration' "Durch den Aufruf der BasicConfigurator.configure-Methode wird ein recht einfaches log4j-Setup erstellt." Siehe auch: logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/… maven.apache.org/plugins/maven-resources-plugin/examples/…
David Victor

Antworten:

141

src/main/resources ist die "Standardplatzierung" dafür.

Update: Das Obige beantwortet die Frage, ist aber nicht die beste Lösung. Schauen Sie sich die anderen Antworten und Kommentare dazu an ... Sie würden wahrscheinlich nicht Ihre eigenen Protokollierungseigenschaften mit dem JAR versenden, sondern es dem Client überlassen (z. B. App-Server, Bühnenumgebung usw.), um die gewünschte Protokollierung zu konfigurieren. Daher ist es src/test/resourcesmeine bevorzugte Lösung , es einzulegen.

Hinweis: Das Sprechen der konkreten log Config an den Client / Benutzer verlassen, sollten Sie ersetzen betrachten log4jmit slf4jin Ihrer Anwendung.

Jan Galinski
quelle
Ich habe festgestellt, dass keine Ressourcen erstellt werden können. Muss ich es manuell machen?
user496949
3
ja. Manuell erstellen resourcesund log4j.propertiesin dem in der Antwort genannten Ordner.
Nishant
@ user496949: Dateien unter src/main/resourceswerden standardmäßig kopiert nachtarget/classes
Splash
17
Es sei denn, Sie beabsichtigen, Ihre log4j-Einstellungen als Teil Ihres Artefakts zu exportieren - es ist weitaus besser, sie unter src / test / resources zu platzieren
David Victor
1
@FerasOdeh, um es von generierten Artefakten (Gläsern, Kriegen usw.) auszuschließen und nur während des Tests zu verwenden: "Es sei denn, Sie beabsichtigen, Ihre log4j-Einstellungen als Teil Ihres Artefakts zu exportieren".
Ali Shakiba
60

Durch einfaches Einlegen src/main/resourceswird es im Artefakt gebündelt. Wenn Ihr Artefakt beispielsweise ein JAR ist, haben Sie daslog4j.properties Datei darin, wodurch der ursprüngliche Punkt verloren geht, an dem die Protokollierung konfigurierbar ist.

Normalerweise lege ich es ein src/main/resourcesund setze es so, dass es wie folgt ausgegeben wird:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <targetPath>${project.build.directory}</targetPath>
            <includes>
                <include>log4j.properties</include>
            </includes>
        </resource>
    </resources>
</build>

Damit log4j es tatsächlich sehen kann, müssen Sie außerdem das Ausgabeverzeichnis zum Klassenpfad hinzufügen. Wenn es sich bei Ihrem Artefakt um eine ausführbare JAR handelt, haben Sie wahrscheinlich das Maven-Assembly-Plugin verwendet, um es zu erstellen. In diesem Plugin können Sie den aktuellen Ordner der JAR zum Klassenpfad hinzufügen, indem Sie einen Class-PathManifesteintrag wie folgt hinzufügen :

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.your-package.Main</mainClass>
            </manifest>
            <manifestEntries>
                <Class-Path>.</Class-Path>
            </manifestEntries>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Jetzt befindet sich die Datei log4j.properties direkt neben Ihrer JAR-Datei und kann unabhängig konfiguriert werden.

Um Ihre Anwendung direkt von Eclipse aus auszuführen, fügen Sie das resourcesVerzeichnis Ihrem Klassenpfad in Ihrer Ausführungskonfiguration hinzu: Run->Run Configurations...->Java Application->NewWählen Sie die ClasspathRegisterkarte aus, wählen Sie AdvancedIhr src/resourcesVerzeichnis aus und navigieren Sie zu ihm .

Zoltán
quelle
2
Eine andere Möglichkeit könnte darin bestehen, es unter src / test / resources abzulegen, damit es nicht gebündelt wird.
Rogerdpack
Beeindruckend. Dank dafür. Das war genau das, was ich brauchte!
Blissfool
@ Zoltán, es fällt mir schwer, das Ausgabeverzeichnis dem Klassenpfad hinzuzufügen, wie Sie es empfohlen haben. Gibt es eine Möglichkeit, dies manuell zu tun, z. B. in die .classpath-Datei des jeweiligen Projekts zu gehen und dort dieses log4j-Ausgabeverzeichnis hinzuzufügen, damit log4j die .properties-Datei sehen kann, nachdem die App in eine .war-Datei gebündelt wurde. Sollte das targetPath-Tag den Wert unverändert verwenden ${project.build.directory}oder auf den tatsächlichen Pfad bearbeitet werden, auf dem sich das Projekt auf meinem lokalen Laufwerk befindet?
Ireti
26

Einige "Data Mining" -Konten dafür src/main/resourcessind der typische Ort.

Ergebnisse bei der Google-Codesuche :

  • src/main/resources/log4j.properties: 4877
  • src/main/java/log4j.properties: 215
Spritzen
quelle
4
Wie unterscheidet sich diese Antwort in irgendeiner Hinsicht von der vor 20 Minuten beantworteten? Auch ist es resourcesnicht resource, wenn ich mich richtig erinnere.
Nishant
6
@ Nishant: Es ist nicht anders, denn als ich das Antwortfeld öffnete, verließ ich den PC. Nachdem ich zurückgekommen war und die Frage beantwortet hatte, vermisste ich, dass die Frage bereits beantwortet wurde. resourcewar nur ein Tippfehler.
Splash
1
Ich würde vorschlagen, etwas über Maven, das Maven-Compiler-Plugin, Konventionen für das Layout von Maven-Projekten zu lesen. Schauen Sie sich vielleicht an, was unter "Ziel" passiert, wenn Ihr Artefakt erstellt wird. Dann könnten Sie vielleicht Ihre Antwort ändern.
David Victor
4
Die richtige Antwort lautet src / xxx / resources - es ist keine Konvention. Siehe: maven.apache.org/plugins/maven-resources-plugin/examples/… - hier kann 'xxx' 'main' oder 'test' sein. Sofern Sie keine vorkonfigurierten Protokollierungsstufen bereitstellen möchten, ist es im Allgemeinen sinnvoller, die Protokollierung so zu konfigurieren, dass sie zum Testen erforderlich ist - über 'src / test / resources' - und dem Verbraucher Ihres Artefakts zu ermöglichen, die Protokollierungsstufe festzulegen.
David Victor
22
Google-Ergebnisse für "Von einer Brücke springen": 18.200.000. Google Ergebnisse für "Nicht von einer Brücke springen": 137.000
djjeck
9

Die zum Initialisieren des Projekts verwendeten Ressourcen werden vorzugsweise im Ordner src / main / resources abgelegt . Um das Laden dieser Ressourcen während des Builds zu ermöglichen, können Sie einfach Einträge in der pom.xml im Maven-Projekt als Build-Ressource hinzufügen

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering> 
        </resource>
    </resources>
</build> 

In diesem Ordner können auch andere .properties-Dateien gespeichert werden, die für die Initialisierung verwendet werden. Die Filterung wird auf true gesetzt, wenn Sie einige Variablen in den Eigenschaftendateien des Ressourcenordners haben und sie aus den Eigenschaftendateien der Profilfilter füllen möchten, die in src / main / filter gespeichert sind, die als Profile festgelegt sind. Dies ist jedoch ein ganz anderer Anwendungsfall . Im Moment können Sie sie ignorieren.

Dies ist ein großartiges Ressourcen- Maven-Ressourcen-Plugin . Es ist nützlich. Durchsuchen Sie einfach auch andere Abschnitte.

Zerstörer
quelle
Wenn Sie nur das obige Maven-Snippet kopieren und einfügen, beachten Sie bitte, dass es </ resources> </ build>
rdesilva
6

Wenn das Speichern von Ressourcendateien an einem anderen Speicherort nicht die beste Lösung ist, die Sie verwenden können:

<build>
  <resources>
    <resource>
      <directory>src/main/java</directory>
      <excludes>
        <exclude>**/*.java</exclude>
      </excludes>
    </resource>
  </resources>
<build>

Zum Beispiel, wenn Ressourcendateien (z. B. jaxb.properties) zusammen mit Java-Klassen tief in Pakete eindringen.

Ali Shakiba
quelle
1

Wenn Ihre Datei log4j.properties oder log4j.xml nicht unter src / main / resources gefunden wird, verwenden Sie diese PropertyConfigurator.configure ("log4j.xml").

   PropertyConfigurator.configure("log4j.xml");
   Logger logger = LoggerFactory.getLogger(MyClass.class);
   logger.error(message);
ethemsulan
quelle
0

Fügen Sie den folgenden Code aus den Ressourcen-Tags in Ihrer pom.xml in Build-Tags hinzu. Das bedeutet, dass sich Ressourcen-Tags innerhalb der Build-Tags in Ihrer pom.xml befinden müssen

<build>
    <resources>
        <resource>
            <directory>src/main/java/resources</directory>
                <filtering>true</filtering> 
         </resource>
     </resources>
<build/>
Challa Purushotham
quelle