Problème de build d'un Module Liferay Gradle et la librairie libjsass sur ARM
Problème de build d'un Module Liferay Gradle et la librairie libjsass sur ARM
Objectifs
Dans cet article, nous allons aborder une problématique rencontrée lors de la construction d'un module Liferay sur un Mac avec processeur ARM64.
En particulier, nous allons nous concentrer sur une erreur liée à la compatibilité de la librairie “libjsass.dylib” (utilisée pendant le processus de build d’un module Liferay contenant un fichier SCSS) et un système ARM64.
Contexte
Je travaille sur un Mac équipé d'un processeur ARM64, utilisant Gradle et Java pour développer des modules Liferay. Lors de la tentative de build d'un module Liferay contenant un fichier .scss, une erreur se produit :
buildCSS FAILED
Using native Sass compiler
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" java.lang.UnsatisfiedLinkError: /private/var/folders/v7/vg_6sjj12h1cfhv90ntt9d3m0000gn/T/libjsass-2336452128834184073/libjsass.dylib (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64'))
Ce message indique clairement que la librairie dynamique libjsass n'est pas compatible avec l'architecture ARM64.
Solution
Après réflexion, j'ai trouvé une solution efficace : recompiler la librairie pour la rendre compatible avec mon architecture et configurer Gradle pour utiliser cette nouvelle librairie dans mes projets.
Étapes pour recompiler la Librairie libjsass
Utiliser Gradle 7.5 et Java 11 pour builder le projet jsass.
1. Cloner le dépôt jsass :
git clone https://github.com/bit3/jsass.git
2. Placez-vous dans le dépôt précédemment cloné :
cd jsass/
3. Lancer la commande de build en forçant l'architecture ARM64 :
arch -arm64 ./gradlew clean assemble
4. Rechercher le fichier .dylib généré :
find ./ -name "*dylib"
5. Vérifier qu’il est bien compilé pour ARM64 avec la commande suivante :
file build/resources/main/darwin-aarch64/libjsass.dylib
Vous devriez obtenir une réponse similaire à :
jsass/build/resources/main/darwin-aarch64/libjsass.dylib: Mach-O 64-bit dynamically linked shared library arm64
Utilisation de la Nouvelle Librairie dans les Projets
1. Créer un dossier libs dans .gradle et y insérer la librairie compilée :
mkdir ~/.gradle/libs
cp build/resources/main/darwin-aarch64/libjsass.dylib ~/.gradle/libs
2. Vérifier la compilation :
file ~/.gradle/libs/libjsass.dylib
3. Créer un dossier pour insérer un script Gradle qui sera exécuté sur tous les projets Gradle afin de charger les librairies présentes dans .gradle/libs :
mkdir ~/.gradle/init.d
4. Créer le fichier et insérer le script :
nano ~/.gradle/init.d/init-libs.gradle
Contenu du script :
allprojects {
tasks.withType(JavaExec) {
doFirst {
def libsDir = file("${System.properties['user.home']}/.gradle/libs").absolutePath
environment 'DYLD_LIBRARY_PATH', libsDir
jvmArgs = ["-Djava.library.path=${libsDir}"] + jvmArgs
}
}
gradle.taskGraph.whenReady { taskGraph ->
taskGraph.allTasks.each { task ->
if (task.name.contains("Test")) {
def libsDir = file("${System.properties['user.home']}/.gradle/libs").absolutePath
task.environment 'DYLD_LIBRARY_PATH', libsDir
task.jvmArgs = ["-Djava.library.path=${libsDir}"] + task.jvmArgs
}
}
}
}
Conclusion
Avec ces étapes, vous devriez être en mesure de construire votre module Liferay sans rencontrer l’erreur de compatibilité de la librairie libjsass.
N'oubliez pas de supprimer les caches Gradle de vos projets et du dossier ~/.gradle/ :
rm -rf ~/.gradle/caches
Enfin, relancez la commande pour déployer votre module Liferay :
blade gw deploy
En suivant ces instructions, vous pourrez surmonter les problèmes de compatibilité et continuer votre développement sur un environnement ARM64 sans interruption.