Search code examples
javagrailsapache-poi

HowTo Install Apache POI in Grails 2.3.11


Using Apache's example, I am trying to load Apache POI into my Grails app. I have GGTS (an Eclipse clone setup for Grails development) as my IDE. When I try to create a new HSSFWorkbook object like so: HSSFWorkbook workbook = new HSSFWorkbook(), The IDE tells me unable to resolve class HSSFWorkbook. How do I properly set up Apache POI so that it works in Grails 2.3.11? I have to work with Excel files and the Apache POI gives me more control. I've seen it working in another Grails 2.3.11 app so I know it's possible. I prefer latest version supported in Grails 2.3.11.

BuildConfig.groovy

grails.servlet.version = "3.0" // Change depending on target container compliance (2.5 or 3.0)
grails.project.class.dir = "target/classes"
grails.project.test.class.dir = "target/test-classes"
grails.project.test.reports.dir = "target/test-reports"
grails.project.work.dir = "target/work"
grails.project.target.level = 1.6
grails.project.source.level = 1.6
grails.server.port.http=8070
//grails.project.war.file = "target/${appName}-${appVersion}.war"

grails.project.fork = [
    // configure settings for compilation JVM, note that if you alter the Groovy version forked compilation is required
    //  compile: [maxMemory: 256, minMemory: 64, debug: false, maxPerm: 256, daemon:true],

    // configure settings for the test-app JVM, uses the daemon by default
    test: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, daemon:true],
    // configure settings for the run-app JVM
    run: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false],
    // configure settings for the run-war JVM
    war: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false],
    // configure settings for the Console UI JVM
    console: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256]
]

grails.project.dependency.resolver = "maven" // or ivy
grails.project.dependency.resolution = {
    // inherit Grails' default dependencies
    inherits("global") {
        // specify dependency exclusions here; for example, uncomment this to disable ehcache:
        // excludes 'ehcache'
    }
    log "error" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose'
    checksums true // Whether to verify checksums on resolve
    legacyResolve false // whether to do a secondary resolve on plugin installation, not advised and here for backwards compatibility

    repositories {
        inherits true // Whether to inherit repository definitions from plugins

        grailsPlugins()
        grailsHome()
        mavenLocal()
        grailsCentral()
        mavenCentral()
        // uncomment these (or add new ones) to enable remote dependency resolution from public Maven repositories
        //mavenRepo "http://repository.codehaus.org"
        //mavenRepo "http://download.java.net/maven/2/"
        //mavenRepo "http://repository.jboss.com/maven2/"
    }

    dependencies {
        // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g.
        // runtime 'mysql:mysql-connector-java:5.1.27'
        // runtime 'org.postgresql:postgresql:9.3-1100-jdbc41'
        test "org.grails:grails-datastore-test-support:1.0-grails-2.3"
        runtime 'org.codehaus.groovy:groovy-all:2.4.7'
        runtime 'org.apache.poi:poi:3.14'
        runtime 'org.apache.poi:poi-ooxml:3.14'
    }

    plugins {
        // plugins for the build system only
        build ":tomcat:7.0.54"

        // plugins for security
        compile ':spring-security-core:2.0.0'
        compile ':spring-security-ldap:2.0.0'

        // plugins for the compile step
        compile ":scaffolding:2.0.3"
        compile ':cache:1.1.7'

        // plugins needed at runtime but not for compilation
        runtime ":hibernate4:4.3.5.4"
        runtime ":database-migration:1.4.0"
        runtime ":jquery:1.11.1"
        runtime ":resources:1.2.8"
        runtime ':console:1.5.12'
        // Uncomment these (or add new ones) to enable additional resources capabilities
        //runtime ":zipped-resources:1.0.1"
        //runtime ":cached-resources:1.1"
        //runtime ":yui-minify-resources:0.1.5"

        // An alternative to the default resources plugin is the asset-pipeline plugin
        //compile ":asset-pipeline:1.6.1"

        // Uncomment these to enable additional asset-pipeline capabilities
        //compile ":sass-asset-pipeline:1.5.5"
        //compile ":less-asset-pipeline:1.5.3"
        //compile ":coffee-asset-pipeline:1.5.0"
        //compile ":handlebars-asset-pipeline:1.3.0.1"
    }
}

Solution

  • Change your dependencies block to set compile time dependency, and also remove unneeded groovy dependency:

    dependencies {
        test "org.grails:grails-datastore-test-support:1.0-grails-2.3"
        compile 'org.apache.poi:poi:3.14'
        compile 'org.apache.poi:poi-ooxml:3.14'
    }
    

    Grails already provides an appropriate version of Groovy, so you won't need to provide that. The POI dependencies will be needed for code compilation and so they should be compile time dependencies.

    If that does not fix your problem it is at least possible that GGTS is not downloading dependencies correctly, but I doubt that will be the case.