Ajoutez des ressources, des fichiers de configuration à votre jar en utilisant gradle

91

Comment ajouter des fichiers de configuration ou d'autres ressources dans mon fichier jar en utilisant gradle?

Ma structure de projet:

src / main / java / com / perseus / .. --- Paquets Java (fichiers source)

src / main / java / config / *. xml --- Fichiers de configuration Spring

Structure de pot attendue:

com / perseus / .. --- Paquets Java (fichiers de classe)

config / *. xml --- Fichiers de configuration Spring

Pritesh Mhatre
la source

Réponses:

80

Je suis tombé sur cet article cherchant comment ajouter un répertoire supplémentaire pour les ressources. J'ai trouvé une solution qui peut être utile à quelqu'un. Voici ma configuration finale pour l'obtenir:

sourceSets {
    main {
        resources {
            srcDirs "src/main/resources", "src/main/configs"
        }
    }
}
Wellington Souza
la source
5
C'est une solution beaucoup plus simple que la réponse acceptée
Stewart
70

Déplacez les fichiers de configuration de src/main/javavers src/main/resources.

Peter Niederwieser
la source
1
Fonctionne pour moi, ressemble à la manière la plus simple et la plus «correcte» d'y parvenir.
EM-Creations
Cette réponse suggère une solution de contournement plutôt qu'une solution, et Gradle fournit une solution.
Terrible Tadpole
@TerribleTadpole c'est la bonne solution. Tous les autres sont des solutions de contournement.
jannis le
63

Merci les gars, je migrais un projet existant vers Gradle et je n'aimais pas trop l'idée de changer la structure du projet.

Je l'ai compris, j'ai pensé que ces informations pourraient être utiles aux débutants.

Voici un exemple de tâche de mon 'build.gradle':

version = '1.0.0'

jar {
   baseName = 'analytics'
   from('src/main/java') {
      include 'config/**/*.xml'
   }

   manifest {
       attributes 'Implementation-Title': 'Analytics Library', 'Implementation-Version': version
   }
}
Pritesh Mhatre
la source
34
Il est plus précis de reconfigurer l'ensemble source. Quelque chose comme sourceSets.main.resources { srcDirs = ["src/main/java"]; exclude "**/*.java" }.
Peter Niederwieser
1
Merci @PeterNiederwieser !! J'ai essayé d'inclure mon fichier log4j.xml dans mon fichier exécutable que je construisais en utilisant shadow. Moi aussi, j'avais affaire à un projet plus ancien et je ne pouvais pas facilement changer la structure des répertoires. Votre suggestion était exactement ce dont j'avais besoin !! : D
Piko
@PeterNiederwieser - Je remarque dans la documentation du plugin Java que les ressources sont déjà définies pour exclure * .java. "Contient uniquement des ressources et exclut tous les fichiers .java trouvés dans les répertoires source des ressources."
Joe Bowbeer
25

Par défaut, tous les fichiers que vous ajoutez src/main/resourcesseront inclus dans le fichier jar.

Si vous devez modifier ce comportement pour une raison quelconque, vous pouvez le faire en configurant sourceSets.

Cette partie de la documentation contient tous les détails

geoand
la source
4
Savez-vous pourquoi seul le contenu de .../resources/est inclus au lieu du répertoire de ressources avec le contenu?
sargas du
@sargas Vous devriez probablement commencer une nouvelle question où vous pouvez facilement inclure tout le contexte. Il est difficile d'obtenir beaucoup d'informations dans la section des commentaires :(
geoand
18

J'ai rencontré le même problème. J'avais un fichier PNG dans un package Java et il n'a pas été exporté dans le JAR final avec les sources, ce qui a provoqué le blocage de l'application au démarrage (fichier introuvable).

Aucune des réponses ci-dessus n'a résolu mon problème mais j'ai trouvé la solution sur les forums Gradle. J'ai ajouté ce qui suit à mon build.gradlefichier:

sourceSets.main.resources.srcDirs = [ "src/" ]
sourceSets.main.resources.includes = [ "**/*.png" ]

Il indique à Gradle de rechercher des ressources dans le srcdossier et lui demande de n'inclure que les fichiers PNG.

EDIT: sachez que si vous utilisez Eclipse, cela cassera vos configurations d'exécution et vous obtiendrez une main class not founderreur lorsque vous essayez d'exécuter votre programme. Pour résoudre ce problème, la seule solution que j'ai trouvée est de déplacer la ou les images vers un autre répertoire, res/par exemple, et de la définir comme srcDirsau lieu de src/.

imparfait
la source
2
J'ai utilisé l' +=opérateur pour ajouter mes sourceSets.main.resources.srcDirs += [ "src/main/java" ]
répertoires aux répertoires
3

Sachez que le chemin sous src / main / resources doit correspondre au chemin du package de vos fichiers .class souhaitant accéder à la ressource. Voir ma réponse ici .

Mike rongeur
la source