J'ai passé 3 jours à essayer de faire fonctionner le pot de graisse, voici la solution et ce qui suit avant la clarification de la solution :
LES ERREURS QUE J'AI COMMISES AU DÉBUT
- Je n'aurais pas dû me précipiter sur docker, j'aurais dû d'abord faire fonctionner le fat jar en local.
- withJava() a été omis, ce qui a été le principal gaspillage de 36 heures de travail... Quel est l'intérêt de cette fonction ?
- dependsOn(build) : je ne comprends pas pourquoi le type de tâche jar ne le sait pas déjà.
- main.compileDependencyFiles : J'ai utilisé ceci pendant un certain temps à la place de la carte de l'argument ci-dessous.
- main.output.classesDirs : manquait dans les autres solutions et c'est ce qui semble inclure votre code réel.
NOTE : Aucun plugin shadow n'est nécessaire, ce qui est fantastique (les plugins gradle ont tendance à ne pas bien fonctionner ensemble IMHO, jamais).
NOTE : La version est importante car cette pile semble changer environ 50 fois plus vite que la documentation dans certains cas, la version suivante a été utilisée pour cette solution :
- Kotlin 1.3.72
- Gradle 6.5
- Ktor 1.3.2
CODE :
//Import variables from gradle.properties
val environment: String by project
val kotlinVersion: String by project
val ktorVersion: String by project
//Build File Configuration
plugins {
java
kotlin("multiplatform") version "1.3.72"
}
group = "com.app"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
jcenter()
jcenter {
url = uri("https://kotlin.bintray.com/kotlin-js-wrappers")
}
maven {
url = uri("https://jitpack.io")
}
}
//Multiplatform Configuration
kotlin {
jvm {
withJava()
compilations {
val main = getByName("main")
tasks {
register<Jar>("buildFatJar2") {
group = "application"
dependsOn(build)
manifest {
attributes["Main-Class"] = "com.app.BackendAppKt"
}
from(configurations.getByName("runtimeClasspath").map { if (it.isDirectory) it else zipTree(it) }, main.output.classesDirs)
archiveBaseName.set("${project.name}-fat2")
}
}
}
}
js {
browser {
}
}
sourceSets { SKIPPED FOR LENGTH }
}
J'espère que cela permettra à quelqu'un d'économiser 3 jours, faites-moi savoir si vous trouvez des améliorations (je suis toujours en train d'apprendre aussi). Kotlin, gradle, multiplateforme, docker... tout cela est très difficile à gérer, ils doivent mettre à jour la documentation en parallèle IMHO ou jetbrains est condamné.
AMÉLIORATIONS POTENTIELLES :
- Le jar produit semble beaucoup plus gros qu'il ne devrait l'être avec des tonnes de choses inutiles, je soupçonne que le fait de changer le chemin de compilation au lieu du chemin d'exécution va corriger cela (CONFIRMÉ 30% de réduction de taille).
- Des attributs plus manifestes peut-être.
- A noter également que j'ai lu un article suggérant à juste titre que les fatJars ne devraient pas être déployés sur docker, que les dépendances java devraient être construites en tant que partie de l'image.