image-arm.png

Julien Bédia / Insight
14/06/24 09:14

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.

Partager cet article :
Lien copié

Insight

Autres articles qui pourraient vous plaire…

Card image cap

/

Card image cap

/

Card image cap

/