Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dbm-gorm-diff test.groovy fails with no jansi in java.library.path #987

Open
madsj opened this issue Jan 22, 2025 · 4 comments
Open

dbm-gorm-diff test.groovy fails with no jansi in java.library.path #987

madsj opened this issue Jan 22, 2025 · 4 comments

Comments

@madsj
Copy link

madsj commented Jan 22, 2025

Expected Behavior

When I am trying to run

> ./gradlew dbmGormDiff -Pargs="my-changes.groovy --add"

I am getting this output

Exception in thread "main" java.lang.ExceptionInInitializerError
at grails.ui.command.GrailsApplicationContextCommandRunner.run(GrailsApplicationContextCommandRunner.groovy:45)
at grails.ui.command.GrailsApplicationContextCommandRunner.main(GrailsApplicationContextCommandRunner.groovy:102)
Caused by: org.codehaus.groovy.runtime.InvokerInvocationException: java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no jansi in java.library.path: /Users/user/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:., /private/var/folders/dl/tyh5fnpj3vvdyd2ng2lcqsqw0000gn/T/libjansi-64-3530738537611309095.jnilib: dlopen(/private/var/folders/dl/tyh5fnpj3vvdyd2ng2lcqsqw0000gn/T/libjansi-64-3530738537611309095.jnilib, 0x0001): tried: '/private/var/folders/dl/tyh5fnpj3vvdyd2ng2lcqsqw0000gn/T/libjansi-64-3530738537611309095.jnilib' (fat file, but missing compatible architecture (have 'x86_64,i386', need 'arm64e' or 'arm64')), '/System/Volumes/Preboot/Cryptexes/OS/private/var/folders/dl/tyh5fnpj3vvdyd2ng2lcqsqw0000gn/T/libjansi-64-3530738537611309095.jnilib' (no such file), '/private/var/folders/dl/tyh5fnpj3vvdyd2ng2lcqsqw0000gn/T/libjansi-64-3530738537611309095.jnilib' (fat file, but missing compatible architecture (have 'x86_64,i386', need 'arm64e' or 'arm64'))]
at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:74)
at org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:59)
at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1812)
at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1601)
at org.codehaus.groovy.runtime.InvokerHelper.invokeConstructorOf(InvokerHelper.java:1090)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.newInstance(DefaultGroovyMethods.java:18111)
at org.grails.core.io.support.GrailsFactoriesLoader.loadFactoriesWithArguments(GrailsFactoriesLoader.groovy:65)
at org.grails.core.io.support.GrailsFactoriesLoader.loadFactories(GrailsFactoriesLoader.groovy:47)
at grails.dev.commands.ApplicationContextCommandRegistry.(ApplicationContextCommandRegistry.groovy:33)
... 2 more


Caused by: java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no jansi in java.library.path: /Users/user/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:., /private/var/folders/dl/tyh5fnpj3vvdyd2ng2lcqsqw0000gn/T/libjansi-64-3530738537611309095.jnilib: dlopen(/private/var/folders/dl/tyh5fnpj3vvdyd2ng2lcqsqw0000gn/T/libjansi-64-3530738537611309095.jnilib, 0x0001): tried: '/private/var/folders/dl/tyh5fnpj3vvdyd2ng2lcqsqw0000gn/T/libjansi-64-3530738537611309095.jnilib' (fat file, but missing compatible architecture (have 'x86_64,i386', need 'arm64e' or 'arm64')), '/System/Volumes/Preboot/Cryptexes/OS/private/var/folders/dl/tyh5fnpj3vvdyd2ng2lcqsqw0000gn/T/libjansi-64-3530738537611309095.jnilib' (no such file), '/private/var/folders/dl/tyh5fnpj3vvdyd2ng2lcqsqw0000gn/T/libjansi-64-3530738537611309095.jnilib' (fat file, but missing compatible architecture (have 'x86_64,i386', need 'arm64e' or 'arm64'))]
at org.fusesource.hawtjni.runtime.Library.doLoad(Library.java:182)
at org.fusesource.hawtjni.runtime.Library.load(Library.java:140)
at org.fusesource.jansi.internal.CLibrary.(CLibrary.java:42)
at org.fusesource.jansi.AnsiConsole.wrapOutputStream(AnsiConsole.java:48)
at org.fusesource.jansi.AnsiConsole.(AnsiConsole.java:38)
at grails.build.logging.GrailsConsole.ansiWrap(GrailsConsole.java:319)
at grails.build.logging.GrailsConsole.wrapInPrintStream(GrailsConsole.java:220)
at grails.build.logging.GrailsConsole.bindSystemOutAndErr(GrailsConsole.java:204)
at grails.build.logging.GrailsConsole.initialize(GrailsConsole.java:178)
at grails.build.logging.GrailsConsole.(GrailsConsole.java:159)
at grails.build.logging.GrailsConsole.createInstance(GrailsConsole.java:407)
at grails.build.logging.GrailsConsole.getInstance(GrailsConsole.java:329)
at scaffolding.CreateScaffoldControllerCommand.(CreateScaffoldControllerCommand.groovy:40)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:72)
... 10 more

I am using an Apple M1 Max hence the requirement for arm. I seems as far as i know to be an issue regarding a very old version of jansi.version=1.18 in the GrailsConsole.

Are there any way to apply a workaround?

Actual Behaviour

GrailsConsole works and dbm-gorm-diff runs

Steps To Reproduce

> ./gradlew dbmGormDiff -Pargs="my-changes.groovy --add"

Environment Information

macos 15.1.1 (M1 Max)

openjdk version "17.0.8.1" 2023-08-24

Example Application

No response

Version

6.2.3

@jdaugherty
Copy link
Contributor

FYI: Grails commands like migrate use the gradle classpath and not the classpath of your project. If you add the library to the buildscript using the classpath scope, it should fix this.

@madsj
Copy link
Author

madsj commented Feb 20, 2025

I can seem to get it working with the classpath scope. however i got it working by adding this to my build.gradle

dependencies {
    runtimeOnly "org.fusesource.jansi:jansi:1.18"
  ...
}

@jamesfredley
Copy link
Contributor

@madsj If that is the case, then you likely were missing https://mvnrepository.com/artifact/org.grails/grails-shell/7.0.0-M1 in your build.gradle dependencies {} and buildscript{} dependencies {} or buildSrc/build.gradle dependencies {} which provides org.fusesource.jansi:jansi. Can you confirm?

@jamesfredley jamesfredley transferred this issue from grails/grails-core Feb 20, 2025
@jamesfredley
Copy link
Contributor

jamesfredley commented Feb 20, 2025

@madsj Actually, grails-shell is coming from org.grails:grails-gradle-plugin which then provides org.fusesource.jansi:jansi.

Here is a working build.gradle from start.grails.org with the database migration plugin added.

buildscript {
    repositories {
        maven { url "https://repo.grails.org/grails/core" }
        mavenCentral()
    }
    dependencies { // Not Published to Gradle Plugin Portal
        classpath platform("org.grails:grails-bom:$grailsVersion")
        classpath "org.grails:grails-gradle-plugin"
        classpath "org.grails.plugins:database-migration"
        classpath "org.grails.plugins:hibernate5"
    }
}

plugins {
    id "groovy"
    id "war"
    id "idea"
    id "com.bertramlabs.asset-pipeline" version "$assetPipelineGradleVersion"
    id "eclipse"
}

// Not Published to Gradle Plugin Portal
apply plugin: "org.grails.grails-web"
apply plugin: "org.grails.grails-gsp"

group = "com.example"

repositories {
    mavenCentral()
    maven { url "https://repo.grails.org/grails/core/" }
}

dependencies {
    profile "org.grails.profiles:web"
    developmentOnly "org.webjars.npm:bootstrap"
    developmentOnly "org.webjars.npm:bootstrap-icons"
    developmentOnly "org.webjars.npm:jquery"
    implementation platform("org.grails:grails-bom:$grailsVersion")
    implementation "org.grails:grails-core"
    implementation "org.grails:grails-logging"
    implementation "org.grails:grails-plugin-databinding"
    implementation "org.grails:grails-plugin-i18n"
    implementation "org.grails:grails-plugin-interceptors"
    implementation "org.grails:grails-plugin-rest"
    implementation "org.grails:grails-plugin-services"
    implementation "org.grails:grails-plugin-url-mappings"
    implementation "org.grails:grails-web-boot"
    implementation "org.grails.plugins:database-migration"
    implementation "org.grails.plugins:gsp"
    implementation "org.grails.plugins:hibernate5"
    implementation "org.grails.plugins:scaffolding"
    implementation "org.springframework.boot:spring-boot-autoconfigure"
    implementation "org.springframework.boot:spring-boot-starter"
    implementation "org.springframework.boot:spring-boot-starter-actuator"
    implementation "org.springframework.boot:spring-boot-starter-logging"
    implementation "org.springframework.boot:spring-boot-starter-tomcat"
    implementation "org.springframework.boot:spring-boot-starter-validation"
    console "org.grails:grails-console"
    runtimeOnly "com.bertramlabs.plugins:asset-pipeline-grails"
    runtimeOnly "com.h2database:h2"
    runtimeOnly "com.zaxxer:HikariCP"
    runtimeOnly "org.fusesource.jansi:jansi"
    integrationTestImplementation testFixtures("org.grails.plugins:geb")
    testImplementation "org.grails:grails-gorm-testing-support"
    testImplementation "org.grails:grails-web-testing-support"
    testImplementation "org.spockframework:spock-core"
}

compileJava.options.release = 17

tasks.withType(Test) {
    useJUnitPlatform()
}
assets {
    excludes = [
            'webjars/jquery/**',
            'webjars/bootstrap/**',
            'webjars/bootstrap-icons/**'
    ]
    includes = [
            'webjars/jquery/*/dist/jquery.js',
            'webjars/bootstrap/*/dist/js/bootstrap.bundle.js',
            'webjars/bootstrap/*/dist/css/bootstrap.css',
            'webjars/bootstrap-icons/*/font/bootstrap-icons.css',
            'webjars/bootstrap-icons/*/font/fonts/*',
    ]
}
3:31:17 PM: Executing 'dbmGormDiff -Pargs="my-changes.groovy --add"'…

> Task :compileJava NO-SOURCE
> Task :configScript UP-TO-DATE
> Task :compileGroovy
> Task :buildProperties
> Task :processResources UP-TO-DATE
> Task :classes
> Task :findMainClass

> Task :dbmGormDiff

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.4.2)

Grails application running at http://localhost:0 in environment: development
BEST PRACTICE: The changelog generated by diffChangeLog/generateChangeLog should be inspected for correctness and completeness before being deployed. Some database objects and their dependencies cannot be represented automatically, and they may need to be manually updated before being deployed.

BUILD SUCCESSFUL in 13s
6 actionable tasks: 4 executed, 2 up-to-date
3:31:31 PM: Execution finished 'dbmGormDiff -Pargs="my-changes.groovy --add"'.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants