J'ai une construction multiprojet et j'ai mis une tâche pour construire un gros pot dans l'un des sous-projets. J'ai créé la tâche similaire à celle décrite dans le livre de cuisine .
jar {
from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
manifest { attributes 'Main-Class': 'com.benmccann.gradle.test.WebServer' }
}
L'exécuter entraîne l'erreur suivante:
Cause: vous ne pouvez pas modifier une configuration qui n'est pas dans un état non résolu!
Je ne sais pas ce que signifie cette erreur. J'ai également signalé cela sur le Gradle JIRA au cas où il s'agirait d'un bug .
def mainClassName
pour que le code fonctionne ... Je recevais Impossible de définir la propriété inconnue 'mainClassName' pour le projet racineimplementation
configuration au lieu du maintenant obsolètecompile
. Le code ci-dessus me construit un petit pot sans les dépendances. Quand je le change (from { configurations.implementation.collect {...} }
), une erreur se produit disant que la résolution directe de la `` mise en œuvre '' de la configuration n'est pas autoriséeconfigurations.compileClasspath
corrigera tous lesimplementation
s, mais laissera de côté lesapi
dépendances afik. Trouvé ici dans une autre réponse la solutionruntimeClasspath
. Cela inclut également lesapi
dépendances.La réponse de @felix m'a presque amené là-bas. J'ai eu deux problèmes:
La configuration suivante résout ce problème
Pour l'ajouter à la tâche d'assemblage ou de construction standard, ajoutez:
Edit: grâce à @mjaggard: dans les versions récentes de Gradle, passez
configurations.runtime
àconfigurations.runtimeClasspath
la source
artifacts
: exactement ce que je cherchais.gradle fatJar
les dépendances d'exécution ne semblent pas être compilées, elles ne peuvent donc pas être copiées.Si vous souhaitez que la
jar
tâche se comporte normalement et ait également unefatJar
tâche supplémentaire , utilisez ce qui suit:La partie importante est
with jar
. Sans lui, les classes de ce projet ne sont pas incluses.la source
group "build"
et cette tâche sera enbuild
groupe (avec d'autres tâches, par exemplejar
tâche.with jar
mot - clé, que fait-il exactement?Cela fonctionne bien pour moi.
Ma classe principale:
Et c'est le contenu de mon fichier build.gradle:
Et j'écris ce qui suit dans ma console:
Et la sortie est excellente:
la source
Pour générer un gros JAR avec une classe exécutable principale, en évitant les problèmes avec les JAR signés, je suggère le plugin gradle-one-jar . Un plugin simple qui utilise le projet One-JAR .
Facile à utiliser:
la source
Sulution simple
la source
La réponse de @ben fonctionne presque pour moi sauf que mes dépendances sont trop grandes et que j'ai l'erreur suivante
Pour résoudre ce problème, je dois utiliser le code suivant
la source
Pour ceux qui ont besoin de construire plus d'un pot à partir du projet.
Créez une fonction dans gradle:
puis appelez:
Fonctionne sur gradle 5.
Jar sera placé à
./build/libs
.la source
J'utilise tâche
shadowJar
par plugin. com.github.jengelman.gradle.plugins:shadow:5.2.0
L'utilisation juste exécuter le
./gradlew app::shadowJar
fichier de résultat sera àMyProject/app/build/libs/shadow.jar
build.gradle
fichier de niveau supérieur :build.gradle
fichier de niveau de module d'applicationla source
Gradle 6.3, bibliothèque Java. Le code de la "tâche jar" ajoute les dépendances à la tâche "build / libs / xyz.jar" lors de l'exécution de la tâche " gradle build ".
la source
Si vous êtes habitué à la fourmi, vous pouvez également essayer la même chose avec Gradle:
la source