Ajout d’entrées de classpath à l’aide du plug-in Gradle’s Application

J’utilise le plug-in d’application de Gradle pour générer l’installation d’une application Java autonome. J’ai un fichier de configuration que je dois mettre sur le classpath mais je n’arrive pas à le faire pour générer le classpath correctement dans les fichiers sh / bat. Ce fichier de configuration doit être situé à l’extérieur du fichier jar.

Le fichier conf se trouve dans le répertoire /src/dist/conf/ donc quand je lance installApp il l’installe sous un répertoire conf comme celui-ci $APP_HOME/conf .

J’ai essayé d’append ce répertoire au claspath comme ceci:

 startScripts.classpath.add(files('$APP_HOME/conf')) 

mais quand je regarde le classpath dans les fichiers sh / bat, il ajoute une entrée qui ressemble à ceci:

 $APP_HOME/lib/conf 

Comment puis-je dire à Gradle de supprimer la section lib pour cette entrée?

    Une autre solution de contournement pour ce problème ( GRADLE-2333 ) est proposée par Alexandr Fadeev ici .

    Voici (un peu modifié) la solution d’Alexandr qui a résolu le problème pour moi sur Gradle-1.6:

     startScripts { classpath += files('src/dist/XxxAPlaceHolderForAConfigxxX') doLast { def windowsScriptFile = file getWindowsScript() def unixScriptFile = file getUnixScript() windowsScriptFile.text = windowsScriptFile.text.replace('%APP_HOME%\\lib\\XxxAPlaceHolderForAConfigxxX', '%APP_HOME%\\config') unixScriptFile.text = unixScriptFile.text.replace('$APP_HOME/lib/XxxAPlaceHolderForAConfigxxX', '$APP_HOME/config') } } 

    C’est un peu plus laid que la solution de Josh, mais cela vous permet de conserver la disposition exacte du répertoire (/ src / dist / conf et $ APP_HOME / conf) mentionnée dans la question initiale.

    Le moyen le plus simple d’obtenir un fichier sur le chemin de classe consiste à le placer dans src/main/resources . src/dist sert à append des fichiers à la dissortingbution (fichier zip), et non au chemin Jar / class.

    Ce n’est pas une bonne réponse à votre question, mais j’ai trouvé quelques cas où la tâche startScripts n’a pas encore la flexibilité dont nous avons besoin.

    J’ai travaillé sur quelques-unes de ces situations en modifiant directement le contenu du fichier … ne tirant pas vraiment parti de l’excellent modèle de Gradle et n’étant pas particulièrement recommandé, mais montrant au moins à quel point Gradle est flexible!

    Ainsi, vous pourriez pirater quelque chose dans le classpath comme ceci:

     tasks.startScripts { doLast { def scriptFile = file "${outputDir}/${applicationName}" scriptFile.text = scriptFile.text.replace('CLASSPATH=$APP_HOME/lib', 'CLASSPATH=$APP_HOME/conf/:$APP_HOME/lib') } } 

    Veillez à rompre l’indépendance de la plate-forme du script de démarrage en procédant ainsi.

    Il me semble que ce que j’essaie de faire ne devrait pas être aussi éloigné de l’ordinaire, mais comme solution de contournement, je peux avoir le répertoire dist src/dist/lib/conf ce qui permet de placer le répertoire conf le répertoire lib et le chemin de classe que gradle génère pour que les fichiers sh / bat soient corrects.

    J’accepterai une autre réponse si quelqu’un en a une meilleure.

    J’ai fait une variante de la recette de Martin Dow ci-dessous:

    Je remplace “APP_HOME =” par “export APP_HOME =” dans le script de démarrage.

    Ensuite, mon code peut faire System.env.get (“APP_HOME”), puis naviguer vers le dossier conf / par exemple.

    Ceci est mon hack Gradle:

     tasks.startScripts { doLast { def scriptFile = file "${outputDir}/${applicationName}" scriptFile.text = scriptFile.text.replaceAll('APP_HOME=', 'export APP_HOME=') } } 

    Exemple de code Java dans l’application:

     Ssortingng APP_HOME = System.env().get("APP_HOME"); Properties p = new Properties(); p.load(new FileInputStream(APP_HOME + "/conf/myapp.properties")) 

    J’espère que cela t’aides.

    REMARQUE: “exporter” ne fonctionne pas sous Windows!