Search code examples
springhibernategrailsgroovygrails-orm

GORM not bootstrapping from JAR


Replacing a persistence layer in legacy app with a JAR file using Spring, Hibernate and GORM. Methods like person.save() work fine when running agains project with Gradle etc. in project. However, after I build the fat jar and reference it with -cp my-big-fat-gorm.jar I get:

java.lang.IllegalStateException: Method on class [blah.Person] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.

Using Spring boot for Spring, Hibernate4 and GORM and build.gradle file show below...

apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'application'

mainClassName = "blah.App"

jar {
    baseName = 'blah-gorm'
    version =  '1.0-SNAPSHOT'
    from {
        configurations.compile.collect {
            it.isDirectory() ? it : zipTree(it)
        }
        configurations.runtime.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
}

repositories {
    mavenLocal()
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.8.2'
    compile 'org.grails:gorm-hibernate4-spring-boot:1.1.0.RELEASE'
    compile 'org.slf4j:slf4j-simple:1.7.7'
    runtime 'com.h2database:h2:1.4.181'
}

Am I missing something in the JAR file creation that causes Spring boot to honor @Entity etc.?

Here is a GitHub project that illustrates this and should allow you to execute and see the same stuff I'm seeing.

https://github.com/twcrone/spring-gorm-jar


Solution

  • You don't have the Spring Boot Gradle plugin installed so you're not actually creating a fat JAR you need to add the following to your build.gradle file:

    apply plugin: 'spring-boot'
    
    buildscript {
        ext {
            springBootVersion = '1.1.0.M2'
            groovyVersion = '2.3.2'
        }
        repositories {
            mavenCentral()
            maven {
                url 'http://repo.spring.io/milestone'
            }
        }
        dependencies {
            classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        }
    }
    

    With this in place doing gradle assemble and then java -jar ... results in bootstrapping GORM correctly