web-dev-qa-db-fra.com

Déplacement des fichiers supplémentaires dans Gradle Application Plugin

J'ai un petit projet Java/Gradle. J'utilise le plug-in Application pour créer une distribution Zip (à l'aide de la tâche distZip). En utilisant la configuration standard, je reçois les répertoires suivants dans mon fichier Zip:

/poubelle - Les scripts pour démarrer l'application vont ici
/ lib - Contient le code de mon projet dans un fichier JAR et tous les fichiers JAR de dépendance.

Le problème est que je voudrais un troisième répertoire: / conf où je peux mettre mes fichiers de configuration (au lieu de les emballer dans mon fichier JAR d’application.

J'imagine qu'il s'agit d'une exigence commune, car des éléments comme log4j.xml et hibernate.properties seraient mieux placés en dehors du fichier JAR. Je n'arrive pas à comprendre comment je peux personnaliser le comportement du plug-in Application pour le faire cependant.

28
James Blewitt

J'ai revisité ce problème plusieurs mois plus tard et j'ai enfin une solution élégante. Le code suivant doit être ajouté au fichier gradle:

distZip {
    into(project.name) {
        from '.'
        include 'conf/*'
    }
}

Cela ajoute une inclusion supplémentaire à la tâche distZip. Ceci copie le répertoire "conf" (incluant le contenu) dans la distribution Zip.

Le fichier Zip généré contient un seul répertoire, identique au nom du projet. C'est pourquoi la partie "en" est requise.

30
James Blewitt

En fait, créez un répertoire dist sous le répertoire src de votre projet. Tout élément de ce répertoire est copié par le plug-in d'application (sous applicationDistribution) lors de l'exécution de installApp ou de distZip.

Ou éditez applicationDistribution pour faire autre chose, si une simple copie ne suffit pas.

26
Graham

Pour moi, un simple

applicationDistribution.from("src/main/config/") {
    into "config"
}

fait le travail. Bien entendu, vos propriétés doivent être chargées correctement à partir du code. Surtout si vous les déplacez de src/main/resources où ils ont été utilisables via Classpath, vers le nouvel emplacement. J'ai contourné cela en ajoutant un paramètre de ligne de commande qui pointe vers le fichier de configuration.

13
ferdy

Je ne sais pas si vous pouvez personnaliser le plug-in d'application, je ne l'ai jamais utilisé. Il existe cependant d'autres moyens d'atteindre ce que vous voulez atteindre.

Vous pouvez créer un répertoire /conf comme ceci:

confDir = new File("$buildDir/conf")

Vous pouvez ensuite copier les fichiers dont vous avez besoin dans ce répertoire comme ceci:

task copyConfFiles(type: Copy) {
   from _wherever your files reside_
   into confDir
   include('**/*.properties') // your configuration files 
}

Vous pouvez ensuite rattacher cette tâche de copie au processus comme suit:

distZip.dependsOn copyConfFiles

Et enfin si vous ne voulez pas que vos configurations soient dans le fichier Zip final, vous pouvez faire ceci:

distZip {
   exclude('**/*.properties') // your configuration files
}

Encore une fois, il pourrait y avoir un meilleur moyen. C'est a way.

7
c_maker

La réponse de OP peut être utile pour son cas d'utilisation, mais j'aimerais améliorer certaines choses:

  1. Sa réponse suggère qu'il a un répertoire conf parallèle au build.gradle. Maven Standard Directory Layout . Le consensus général est d'avoir un src/main/conf comme indiqué dans la documentation:

S'il existe d'autres sources contribuant à la construction de l'artefact, elles se trouveraient dans d'autres sous-répertoires: par exemple, src/main/antlr contiendrait les fichiers de définition de grammaire Antlr.

  1. Le nom du répertoire cible n'est PAS project.name, comme cela avait été souligné dans un commentaire.

  2. Si le filtrage des ressources est requis, et c'est souvent le cas, il est souhaitable d'avoir une tâche distincte. Pendant le développement local, cette tâche peut être exécutée pour générer les fichiers filtrés. La distribution utiliserait simplement le résultat de cette tâche (et contrairement à la réponse de OP, cela rend également conf disponible pour la distribution tar).

    def props = new Properties()
    file("src/main/filters/application.properties")
        .withInputStream { props.load(it) }
    
    import org.Apache.tools.ant.filters.ReplaceTokens
    
    task copyConf(type: Copy) {
        from("src/main/conf/")
        into("$buildDir/conf")
        filesMatching("**/*.y*ml") {
            filter(tokens: props, ReplaceTokens)
        }
    }
    distributions {
        main {
            contents {
                from(copyConf) {
                    into("conf")
                }
            }
        }
    }
    
0
Abhijit Sarkar