如何将 Vaadin 7.3.9 集成到 Eclipse 中的 Grails 项目中?

How to integrate Vaadin 7.3.9 into a Grails project in Eclipse?

我在将 Vaadin 集成到 Eclipse 中的 Grails 项目时遇到了一些问题。

我正在使用 Spring Tool Suite(版本 3.6.3)和 Grails(版本 2.4.4)提供的 Eclipse(版本 4.4 Luna)。

我创建了一个 Grails 项目:

我正在看 Vaadin Cookbook 这本书,作者说要在 Grails 项目中使用 Vaadin,必须安装 Grails 的 Vaadin 插件。作者说应该:

但是,自 Grails 2.4.3 起已弃用该插件,必须像这样将插件添加到 BuildConfig.groovy 文件中(基于该书合著者之一的教程 -> https://vaadin.com/wiki/-/wiki/Main/Vaadin%20on%20Grails%20-%20Create%20project%20in%20IntelliJ%20IDEA(链接中使用的是IntelliJIDEA URL 而不是Eclipse)):

// BuildConfig.groovy
// ...
grails.project.dependency.resolution = {
     //...
      plugins {
          //...
          compile ":vaadin:7.3.9"
          //...
      }
}

但是,我该怎么办?在书中他们说 grails-app/vaadin 文件夹必须标记为源文件夹 (Build Path -> Use as source folder),但在我的 Grails 项目中没有这样的文件夹。

此外,从上面链接的 InlliJIDEA 教程中,作者说:

现在我尝试编辑 UrlMappings.groovy 文件以删除所有映射:

class UrlMappings {

    static mappings = {

    }
}

然后当我 运行 run-app 命令时,我得到以下异常:

|Running Grails application
objc[42370]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.
| Error 2015-01-30 11:33:56,213 [localhost-startStop-1] ERROR context.GrailsContextLoaderListener  - Error initializing the application: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.cfg.beanvalidation.IntegrationException: Error activating Bean Validation integration
Message: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.cfg.beanvalidation.IntegrationException: Error activating Bean Validation integration
    Line | Method
->>  266 | run       in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    617 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run       in java.lang.Thread
Caused by BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.cfg.beanvalidation.IntegrationException: Error activating Bean Validation integration
->>  266 | run       in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    617 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run       in java.lang.Thread
Caused by BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.cfg.beanvalidation.IntegrationException: Error activating Bean Validation integration
->>  266 | run       in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    617 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run       in java.lang.Thread
Caused by IntegrationException: Error activating Bean Validation integration
->>  266 | run       in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    617 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run       in java.lang.Thread
Caused by NoClassDefFoundError: javax/validation/ParameterNameProvider
->>  760 | defineClass in java.lang.ClassLoader
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    142 | defineClass in java.security.SecureClassLoader
|    455 | defineClass in java.net.URLClassLoader
|     73 | access0 in     ''
|    367 | run . . . in java.net.URLClassLoader
|    361 | run       in     ''
|    360 | findClass in java.net.URLClassLoader
|    424 | loadClass in java.lang.ClassLoader
|    269 | configure in javax.validation.Validation$GenericBootstrapImpl
|    111 | buildDefaultValidatorFactory in javax.validation.Validation
|    266 | run . . . in java.util.concurrent.FutureTask
|   1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    617 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run       in java.lang.Thread
Caused by ClassNotFoundException: javax.validation.ParameterNameProvider
->>  372 | run       in java.net.URLClassLoader
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    361 | run       in     ''
|    360 | findClass in java.net.URLClassLoader
|    424 | loadClass in java.lang.ClassLoader
|    760 | defineClass in     ''
|    142 | defineClass in java.security.SecureClassLoader
|    455 | defineClass in java.net.URLClassLoader
|     73 | access0 in     ''
|    367 | run . . . in java.net.URLClassLoader
|    361 | run       in     ''
|    360 | findClass in java.net.URLClassLoader
|    424 | loadClass in java.lang.ClassLoader
|    269 | configure in javax.validation.Validation$GenericBootstrapImpl
|    111 | buildDefaultValidatorFactory in javax.validation.Validation
|    266 | run . . . in java.util.concurrent.FutureTask
|   1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    617 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run       in java.lang.Thread
Error |
Forked Grails VM exited with error
|Server running. Browse to http://localhost:8080/vaadin-in-grails

它最后说 "Server running" 但它不是真的,并且没有根据需要创建 grails-app/vaadin 文件夹。

我没有找到涵盖该主题的任何其他教程(具体来说,我正在搜索我链接的 IntelliJIDEA 教程的 Eclipse 版本,但没有找到)。

因此,据我所知,我正在阅读的这本书涵盖了旧版本的 Grails,其中插件是通过 install-plugin 已弃用的命令安装的,我无法使用它,因为我曾尝试使用compile ":vaadin:7.3.9" 指令没有成功,我在这里问 SO 的人。

如何解决此问题并开始使用 Grails/Vaadin 进行编程?

不要使用安装插件的方法。

将其放在 BuildConfig.groovy 的插件部分:

 compile ":vaadin:7.4.1"

据我从插件作者那里了解到,较新版本的 Vaadin/Grails 插件不再创建 grails-app/vaadin 目录。相反,您现在需要将 vaadin 代码放在典型的 src/groovy 或 src/java 文件夹中。

兄弟,我遇到了同样的问题,但是在阅读了很多关于 Grails 的 Vaadin 这本书并进行了大量试验之后,我找到了解决方案,重要的是要提到我的 grails 项目正在使用这个配置,没有重大变化版本所以我相信它应该工作:

  • Grails 2.4.5
  • Vaadin 7.4.8,比较新,
  • 用于数据库的 Oracle Express(这是不可知的)

从您的日志跟踪中,我看到了这一行:

Caused by ClassNotFoundException: javax.validation.ParameterNameProvider

好的,首先,转到您的 BuildConfig.groovy 并设置以下值:

//BuildConfig.groovy

dependencies {
    // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g.
    // runtime 'mysql:mysql-connector-java:5.1.29'
    // runtime 'org.postgresql:postgresql:9.3-1101-jdbc41'
    compile 'javax.validation:validation-api:1.1.0.Final'
    test "org.grails:grails-datastore-test-support:1.0.2-grails-2.4"
}

plugins {
    // plugins for the build system only
    build ":tomcat:7.0.55.2" // or ":tomcat:8.0.20"

    // plugins for the compile step
    //compile ":scaffolding:2.1.2"
    compile ':cache:1.1.8'
    compile ":asset-pipeline:2.1.5"
    compile ":vaadin:7.4.8"

    // plugins needed at runtime but not for compilation
    runtime ":hibernate4:4.3.6.1"
    runtime ":database-migration:1.4.0"
    //runtime ":jquery:1.11.1"
}

从上面的代码中需要注意两点:

  1. 插件部分正在使用 hibernate4:4.3.6.1
  2. 在 Dependencies 部分,我添加了以下行,从我的许多阅读中有人提到,由于从 Hibernate3 到 Hibernate4 的变化,为了满足一些标准,规范中有一些变化(这里是 javax.validation API 已弃用),所以这是解决您问题的行: 编译 'javax.validation:validation-api:1.1.0.Final'

现在在你的文件 DataSource.groovy 中,注意以下几点: 1. 你还记得我把项目设置为使用Hibernate4,所以应该做适当的配置。

//DataSource.groovy
dataSource {
    pooled = true
    jmxExport = true
    username = "db_user"
    password = "db_password"
    dialect = org.hibernate.dialect.Oracle10gDialect
    driverClassName = 'oracle.jdbc.OracleDriver'
}
hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = false
//    cache.region.factory_class = 'org.hibernate.cache.SingletonEhCacheRegionFactory' // Hibernate 3
    cache.region.factory_class = 'org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory' // Hibernate 4
    singleSession = true // configure OSIV singleSession mode
    flush.mode = 'manual' // OSIV session flush mode outside of transactional context
    jdbc.use_get_generated_keys = true
}

// environment specific settings
environments {
    development {
        dataSource {
            dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
            //url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
            url = "jdbc:oracle:thin:@localhost:1521:xe"
        }
    }
    test {
        dataSource {
            dbCreate = "update"
            url = "jdbc:oracle:thin:@localhost:1521:xe"
        }
    }
    production {
        dataSource {
            dbCreate = "update"
            url = "jdbc:oracle:thin:@localhost:1521:xe"
            properties {
               // See http://grails.org/doc/latest/guide/conf.html#dataSource for documentation
               jmxEnabled = true
               initialSize = 5
               maxActive = 50
               minIdle = 5
               maxIdle = 25
               maxWait = 10000
               maxAge = 10 * 60000
               timeBetweenEvictionRunsMillis = 5000
               minEvictableIdleTimeMillis = 60000
               validationQuery = "SELECT 1"
               validationQueryTimeout = 3
               validationInterval = 15000
               testOnBorrow = true
               testWhileIdle = true
               testOnReturn = false
               jdbcInterceptors = "ConnectionState"
               defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED
            }
        }
    }
}

在休眠部分中,您必须设置以下值:

cache.region.factory_class

在我的例子中,我使用的是 Hibernate4,因此您应该使用相同的值。

来源: 查看此项目:https://github.com/vaadin-on-grails/sass-compilation 并且不要忘记购买 Vaadin on Grails 这本书,它有很多相关信息。