Si vous utilisez maven, vous mettez généralement log4j.properties sous java ou resources?

128

Où dois-je placer le fichier log4j.properties lorsque j'utilise les répertoires Maven conventionnels?

user496949
la source
6
src / test / resources - le consommateur de votre artefact définirait les niveaux de journalisation requis pour le déploiement. Je recommanderais cependant slf4j si vous faites cela pour un travail commercial. Cela donne la possibilité de changer de cadre de journalisation lors du déploiement. slf4j.org
David Victor
2
BTW si vous souhaitez simplement expérimenter, il est possible d'utiliser log4j sans fichier de configuration properties / xml. De ' logging.apache.org/log4j/1.2/manual.html - Configuration' "L'appel de la méthode BasicConfigurator.configure crée une configuration log4j plutôt simple." Voir aussi: logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/… maven.apache.org/plugins/maven-resources-plugin/examples
David Victor

Réponses:

141

src/main/resources est le "placement standard" pour cela.

Mise à jour: ce qui précède répond à la question, mais ce n'est pas la meilleure solution. Consultez les autres réponses et les commentaires à ce sujet ... vous ne livreriez probablement pas vos propres propriétés de journalisation avec le fichier jar, mais laisseriez au client (par exemple, serveur d'application, environnement de scène, etc.) le soin de configurer la journalisation souhaitée. Ainsi, l'introduire src/test/resourcesest ma solution préférée.

Remarque: en parlant de laisser la configuration du journal concret au client / utilisateur, vous devriez envisager de remplacer log4jpar slf4jdans votre application.

Jan Galinski
la source
Je n'ai trouvé aucun répertoire de ressources créé. Dois-je le faire manuellement?
user496949
3
oui. Créez manuellement resourceset log4j.propertiesdans le dossier mentionné dans la réponse.
Nishant
@ user496949: les fichiers sous src/main/resourcesseront copiés par défaut verstarget/classes
splash le
17
À moins que vous n'ayez l'intention d'exporter vos paramètres log4j dans le cadre de votre artefact - il est de loin préférable de le placer sous src / test / resources
David Victor
1
@FerasOdeh pour l'exclure des artefacts générés (jars, wars, etc.) et être utilisé uniquement pendant les tests, "Sauf si vous avez l'intention d'exporter vos paramètres log4j dans le cadre de votre artefact".
Ali Shakiba
60

Le simple fait de le placer src/main/resourcesle regroupera dans l'artefact. Par exemple, si votre artefact est un JAR, vous aurez le log4j.propertiesfichier à l'intérieur, perdant son point initial de rendre la journalisation configurable.

Je le mets généralement et je le src/main/resourcesconfigure pour qu'il soit affiché sur la cible comme suit:

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

De plus, pour que log4j le voie réellement, vous devez ajouter le répertoire de sortie au chemin de classe. Si votre artefact est un JAR exécutable, vous avez probablement utilisé le plugin maven-assembly-plugin pour le créer. Dans ce plugin, vous pouvez ajouter le dossier actuel du JAR au chemin de classe en ajoutant une Class-Pathentrée de manifeste comme ceci:

<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>

Maintenant, le fichier log4j.properties sera juste à côté de votre fichier JAR, configurable indépendamment.

Pour exécuter votre application directement depuis Eclipse, ajoutez le resourcesrépertoire à votre chemin de classe dans votre configuration d'exécution: Run->Run Configurations...->Java Application->Newsélectionnez l' Classpathonglet, sélectionnez Advancedet accédez à votre src/resourcesrépertoire.

Zoltán
la source
2
une autre option pourrait être de le mettre sous src / test / resources afin qu'il ne soit pas groupé.
rogerdpack
Sensationnel. Merci pour ça. C'était exactement ce dont j'avais besoin!
blissfool
@ Zoltán, j'ai du mal à ajouter le répertoire de sortie au chemin de classe comme vous l'avez conseillé. Y a-t-il un moyen de le faire manuellement, comme aller dans le fichier .classpath du projet particulier et y ajouter ce répertoire de sortie log4j afin que log4j puisse voir le fichier .properties après que l'application a été regroupée dans un fichier .war. De plus, la balise targetPath, la valeur doit-elle être utilisée telle quelle ${project.build.directory}ou doit-elle être modifiée sur le chemin réel du projet dans mon lecteur local?
Ireti le
26

Certains comptes «d'exploration de données» pour qui src/main/resourcesest l'endroit typique.

Résultats de la recherche de code Google :

  • src/main/resources/log4j.properties: 4877
  • src/main/java/log4j.properties: 215
éclaboussure
la source
4
en quoi cette réponse diffère-t-elle à quelque égard que ce soit de celle qui a été répondue il y a 20 minutes? Ce n'est resourcespas non plus le resourcecas, si je me souviens bien.
Nishant
6
@Nishant: ce n'est pas différent, car lorsque j'ai ouvert la boîte de réponse, j'ai quitté le PC. Après être revenu et avoir répondu à la question, j'ai manqué que la question avait déjà été répondue. resourcen'était qu'une faute de frappe.
splash le
1
Je suggérerais de faire un peu de lecture autour de maven, le plugin de compilation maven, les conventions pour la mise en page des projets maven. Regardez peut-être ce qui se trouve sous «cible» lorsque votre artefact est construit. Alors peut-être pourriez-vous modifier votre réponse.
David Victor
4
La bonne réponse est src / xxx / resources - ce n'est pas une convention. Voir: maven.apache.org/plugins/maven-resources-plugin/examples / ... - ici «xxx» peut être «main» ou «test». À moins que vous ne souhaitiez fournir des niveaux de journalisation préconfigurés, il est généralement plus sage de configurer la journalisation comme requis pour les tests - via «src / test / resources» - et de permettre au consommateur de votre artefact de définir le niveau de journalisation.
David Victor
22
Résultats Google pour "Jump off a bridge": 18.200.000. Résultats Google pour "Ne sautez pas d'un pont": 137.000
djjeck
9

Les ressources utilisées pour l'initialisation du projet sont de préférence placées dans le dossier src / main / resources . Pour activer le chargement de ces ressources lors de la construction, on peut simplement ajouter des entrées dans le pom.xml dans le projet maven en tant que ressource de construction

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

D'autres fichiers .properties peuvent également être conservés dans ce dossier utilisé pour l'initialisation. Le filtrage est défini sur true si vous souhaitez avoir certaines variables dans les fichiers de propriétés du dossier de ressources et les remplir à partir des fichiers de propriétés des filtres de profil, qui sont conservés dans src / main / filters qui est défini comme profils, mais il s'agit d'un cas d'utilisation complètement différent. . Pour l'instant, vous pouvez les ignorer.

C'est un excellent plugin de ressources maven , c'est utile, il suffit de parcourir d'autres sections aussi.

dévastateur
la source
Si vous copiez et collez simplement l'extrait de
code maven
6

Lorsque placer des fichiers de ressources dans un autre emplacement n'est pas la meilleure solution que vous puissiez utiliser:

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

Par exemple, lorsque les fichiers de ressources (par exemple jaxb.properties) pénètrent profondément dans les packages avec les classes Java.

Ali Shakiba
la source
1

Si votre fichier log4j.properties ou log4j.xml ne se trouve pas sous src / main / resources, utilisez ce PropertyConfigurator.configure ("log4j.xml");

   PropertyConfigurator.configure("log4j.xml");
   Logger logger = LoggerFactory.getLogger(MyClass.class);
   logger.error(message);
éthemsulane
la source
0

Ajoutez le code ci-dessous à partir des balises de ressources dans votre pom.xml à l'intérieur des balises de construction. cela signifie donc que les balises de ressources doivent être à l'intérieur des balises de construction dans votre pom.xml

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