Ajouter un fichier de propriétés au chemin de classe d'IntelliJ

122

J'exécute un programme Java simple à partir de l'IDE IntelliJ en utilisant le menu Exécuter-> Exécuter. Ça fonctionne bien. Maintenant, je veux ajouter la journalisation log4j.

J'ai ajouté un dossier de ressources sous la racine de mon projet. J'ai ajouté un fichier log4j.properties dans ce dossier. J'ai changé le code pour enregistrer quelque chose.

Quelle est la bonne façon de dire à IntelliJ d'inclure le dossier de ressources dans le chemin de classe afin que le fichier de propriétés soit visible?

Avec IntelliJ 8, je pourrais deviner comme un singe ivre et finalement le faire fonctionner. J'en ai 9 maintenant et je n'ai pas du tout de succès. J'essaye depuis une heure. Que diriez-vous d'une option "Ajouter au chemin de classe" quelque part? / fume / évent / diatribe

Tony Ennis
la source
Ok, la situation est résolue. Il s'agit d'une nouvelle installation d'IntelliJ - log4J n'est PAS inclus par défaut. Dans mon code, j'avais importé l'enregistreur de stock, pas log4j. L'enregistreur de stock prend en charge des méthodes similaires, il n'était donc pas évident que j'utilisais le mauvais enregistreur! Pas étonnant qu'il ne lisait pas le fichier de propriétés log4j ou ne signalait pas que j'avais besoin pour configurer log4j. Quel coup de pied dans les dents!
Tony Ennis du
Trouvé une bonne description pour un débutant à log4j tuttlem.github.io/2015/02/08/start-logging-with-log4j2.html
Rahal Kanishka

Réponses:

91

Essaye ça:

  • Accédez à la structure du projet.
  • Sélectionnez votre module.
  • Recherchez le dossier dans l'arborescence de droite et sélectionnez-le.
  • Cliquez sur le bouton Sources au-dessus de cette arborescence (avec le dossier bleu) pour faire de ce dossier un dossier sources.
ColinD
la source
Je l'ai fait environ 50 fois, je viens de le refaire. Ma sortie ne change pas même si j'ai changé le modèle de conversion de disposition en quelque chose qui aurait été évident. Je me demande si un autre log4j.properties est dans mon chemin de classe.
Tony Ennis
29
Vérifiez les modèles de ressources dans les paramètres du compilateur. Vérifiez que "? *. Properties" s'y trouve. C'est là par défaut, mais c'est la seule autre chose à laquelle je puisse penser du haut de ma tête.
ColinD le
3
Alternative au bouton Sources - cliquez avec le bouton droit sur le répertoire que vous avez créé et sélectionnez "Marquer le répertoire comme": "Source Root"
mschr
10
Notez que si vous avez créé votre projet à partir d'un POM Maven, au lieu d'une structure source ad hoc, cette solution ne fonctionnera pas. Au lieu de cela, vous devez ajouter ce répertoire en tant que ressource au POM. Voir la réponse de Peter Thygesen.
lreeder
Peut également être fait par programme via PropertyConfigurator.configure ("../ conf / log4j.properties")
Jason D
47

En fait, vous avez au moins 2 façons de le faire, la première est décrite par ColinD, il vous suffit de configurer le dossier "resources" comme dossier Sources dans IDEA. Si les modèles de ressources contiennent l'extension de votre ressource, elle sera copiée dans le répertoire de sortie lorsque vous faites du projet et le répertoire de sortie est automatiquement un chemin de classe de votre application.

Une autre méthode courante consiste à ajouter directement le dossier "resources" au chemin de classe. Aller à la structure du projet | Modules | Votre module | Dépendances , cliquez sur Ajouter , Bibliothèque de modules à entrée unique , spécifiez le chemin d'accès au dossier «ressources».

Une autre solution serait de placer le fichier log4j.properties directement sous la racine Source de votre projet (dans le répertoire du package par défaut). C'est la même chose que la première façon sauf que vous n'avez pas besoin d'ajouter une autre racine source dans les paramètres des chemins du module , le fichier sera copié dans le répertoire de sortie sur Make.

Si vous souhaitez tester avec différentes configurations log4j, il peut être plus facile de spécifier un fichier de configuration personnalisé directement dans la configuration Exécuter / Déboguer , les paramètres de VM classés comme:

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

CrazyCoder
la source
J'ai fait vos paragraphes 2 et 3 sans effet. Je suis sûr que les suggestions fonctionnent, c'est juste qu'elles n'ont eu aucun effet - cela se comporte comme un autre fichier log4j.properties dans le chemin de classe. Mais je ne peux le voir nulle part. Si je supprime complètement mon fichier de propriétés log4j, je n'obtiens pas le message "vous devez configurer l'avertissement log4j" dans la console. J'utilise le logiciel gratuit IntelliJ (et la version 9.x) pour la première fois, alors peut-être que cela a quelque chose à voir avec ça.
Tony Ennis
1
L'utilisation du paramètre explicite -D VM n'avait également aucun effet. À ce stade, je ne peux que supposer que je suis tombé du haut de «l'arbre stupide» et que j'ai frappé toutes les branches en descendant! Je pense que je vais faire du chalutage à JetBrains et poser des questions ...
Tony Ennis
Pourriez-vous s'il vous plaît envoyer l'exemple de projet avec les étapes exactes pour reproduire le problème à [email protected]?
CrazyCoder du
Je passais -Dlog4j.configuration = file: / c: /log4j.properties dans les arguments du programme. Les paramètres VM ont fait l'affaire pour moi.
Ajak6
42

J'ai le même problème et ça me gêne énormément !!

J'ai toujours pensé que j'étais surposée pour faire comme réponse 2. Cela fonctionnait auparavant dans Intellij 9 (maintenant en utilisant 10).

Cependant, j'ai compris qu'en ajoutant ces lignes à mon fichier maven pom aide:

<build>
  ...
  <resources>
    <resource>
      <directory>src/main/resources</directory>
    </resource>
  </resources>
  ...
</build>
Peter Thygesen
la source
C'était exactement le problème que j'avais, maintenant les fichiers de ressources sont copiés avec succès dans le dossier de sortie.
artjomka
Cette réponse fonctionne vraiment. J'ai également fait ce que ColinD a suggéré dans ses commentaires. Je vous remercie.
Merci, c'est la seule solution qui a fonctionné pour moi.
Minh Thiện
18

J'ai passé beaucoup de temps à comprendre comment faire cela dans Intellij 13x. Je n'ai apparemment jamais ajouté les fichiers de propriétés aux artefacts qui les nécessitaient, ce qui est une étape distincte dans Intellij. La configuration ci-dessous fonctionne également lorsque vous disposez d'un fichier de propriétés partagé par plusieurs modules.

  • Accédez à la configuration de votre projet (CTRL + ALT + SHIFT + S)
  • Dans la liste, sélectionnez le module auquel vous souhaitez ajouter un ou plusieurs fichiers de propriétés.
  • Sur la droite, sélectionnez l'onglet Dépendances.
  • Cliquez sur le plus vert et sélectionnez "Jars ou répertoires".
  • Sélectionnez maintenant le dossier contenant le ou les fichiers de propriétés. (Je n'ai pas essayé d'inclure un fichier individuel)
  • Intellij va maintenant vous demander quelle est la "catégorie" du fichier sélectionné. Choisissez "classes" (même si elles ne le sont pas).
  • Vous devez maintenant ajouter les fichiers de propriétés à l'artefact. Intellij vous donnera le raccourci ci-dessous. Il affichera des erreurs dans la partie rouge en bas et une `` ampoule rouge '' qui, lorsque vous cliquez dessus, vous montre une option pour ajouter les fichiers à l'artefact. Vous pouvez également accéder à la section «artefacts» et ajouter manuellement les fichiers aux artefacts.

entrez la description de l'image ici

Julius
la source
14

Face à un défi similaire en ajoutant des fichiers avec des extensions .ini au chemin de classe. J'ai trouvé cette réponse , qui consiste à l'ajouter à Préférences -> Compilateur -> Modèles de ressources -> [...]; *. Ini

prototype
la source
1
c'était exactement le problème que j'avais avec les fichiers .conf
James
Je pensais quel était le problème avec mon code? Merci pour cette solution
Shoaib Chikate
5

Si jamais vous vous retrouvez avec le même problème avec Scala et SBT:

  • Accédez à la structure du projet. Le raccourci est (CTRL + ALT + SHIFT + S)

  • Dans la liste la plus à gauche, choisissez Paramètres du projet> Modules

  • Sur la liste des modules à droite de celle-ci, sélectionnez le module du nom de votre projet (sans la construction) et choisissez l'onglet sources

  • Au milieu, développez le dossier que la racine de votre projet pour moi c'est /home/<username>/IdeaProjects/<projectName>

  • Regardez la section Content Root sur le côté droit, les chemins rouges sont des répertoires que vous n'avez pas créés. Vous voudrez mettre le fichier de propriétés dans un répertoire Resources. J'ai donc créé src/main/resourceset mis log4j.properties dedans. Je pense que vous pouvez également modifier la racine du contenu pour la placer où vous le souhaitez (je ne l'ai pas fait).

  • J'ai exécuté mon code avec une configuration SBT et il a trouvé mon fichier log4j.properties.

entrez la description de l'image ici

user2361174
la source
2

Pour ceux d'entre vous qui migrent d'Eclipse vers IntelliJ ou l'inverse, voici une astuce lorsque vous travaillez avec des fichiers de propriétés ou d'autres fichiers de ressources.

C'est exaspérant (cela me coûte une soirée entière pour le savoir) mais les deux IDE fonctionnent assez différemment quand il s'agit de rechercher des fichiers de ressources / propriétés lorsque vous voulez exécuter localement à partir de votre IDE ou pendant le débogage. (L'emballage en .jar est également assez différent, mais c'est mieux documenté.)

Supposons que vous ayez une référence de chemin relative comme celle-ci dans votre code:

new FileInputStream("xxxx.properties");

(ce qui est pratique si vous travaillez avec des fichiers .properties spécifiques à env que vous ne souhaitez pas empaqueter avec votre JAR)

INTELLIJ

(J'utilise 13.1, mais pourrait être valable pour plus de versions)

Le fichier xxxx.properties doit être dans le répertoire PARENT du projet ROOT pour être récupéré au moment de l'exécution comme celui-ci dans IntelliJ. (Le projet ROOT est l'emplacement du dossier / src)

ÉCLIPSE

Eclipse est simplement heureux lorsque le fichier xxxx.properties est à la racine du projet lui-même.

Donc IntelliJ s'attend à ce que le fichier .properties soit 1 niveau plus haut qu'Eclipse lorsqu'il est référencé comme ça !!

Cela affecte également la façon dont vous devez exécuter votre code lorsque vous avez cette même ligne de code (new FileInputStream ("xxxx.properties");) dans votre fichier .jar exporté. Lorsque vous voulez être agile et ne voulez pas empaqueter le fichier .properties avec votre jar, vous devrez exécuter le jar comme ci-dessous afin de référencer correctement le fichier .properties à partir de la ligne de commande:

POT EXPORTÉ INTELLIJ

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

POT EXPORTÉ ECLIPSE

java -jar some.jar

où le fichier jar exécutable exporté Eclipse s'attendra simplement à ce que le fichier .properties référencé soit au même emplacement que celui où se trouve le fichier .jar

DataHacker
la source
Oui, logging.properties, contrairement à log4j2.xml ou log4j.properties, doit être trouvé dans la racine du module IntelliJ. Aussi contrairement à Log4j, qui fonctionne juste, j'avais trouvé que je devais encore faire un jury pour courir dans IntelliJ (Eclipse serait la même histoire, c'est la faute de Java Logging), voir stackoverflow.com/questions/960099/… . Une alternative serait de corriger la configuration d'exécution / débogage avec -Djava.util.logging.config.file =, ce que je trouve plutôt gênant car je préfère avoir la configuration dans le code ou dans un fichier de propriété attendu.
Russ Bateman
1

C'est peut-être un peu hors sujet, étant donné que la question a déjà reçu une réponse, mais j'ai rencontré un problème similaire. Dans mon cas, seules certaines des ressources de test unitaire ont été copiées dans le dossier de sortie lors de la compilation. Mon persistence.xml dans le dossier META-INF a été copié mais rien d'autre .

En fin de compte, j'ai "résolu" le problème en renommant les fichiers problématiques, en reconstruisant le projet, puis en changeant les noms de fichiers à ceux d'origine. Ne me demandez pas pourquoi cela a fonctionné, mais cela a fonctionné. Ma meilleure hypothèse est que, d'une manière ou d'une autre, mon projet IntelliJ s'est un peu désynchronisé avec le système de fichiers et l'opération de changement de nom a déclenché une sorte de "rescan des ressources" interne.

user1426162
la source
1

C'est l'une des erreurs stupides que j'ai faites. J'ai passé beaucoup de temps à essayer de déboguer ce problème et essayé toutes les réponses publiées ci-dessus, mais à la fin, c'était l'une de mes nombreuses erreurs stupides.

J'utilisais org.apache.logging.log4j.Logger(: fml :) alors que j'aurais dû utiliser org.apache.log4j.Logger. L'utilisation de cet enregistreur correct a sauvé ma soirée.

avp
la source
0

J'ai eu un problème similaire avec un fichier log4j.xml pour un test unitaire, j'ai fait tout ce qui précède. Mais j'ai compris que c'était parce que je ne relançais qu'un test échoué .... si je réexécute toute la classe de test, le fichier correct est récupéré. C'est sous Intelli-j 9.0.4

James B
la source