【问题标题】:How to integrate Vaadin 7.3.9 into a Grails project in Eclipse?如何将 Vaadin 7.3.9 集成到 Eclipse 中的 Grails 项目中?
【发布时间】:2015-03-29 17:23:31
【问题描述】:

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

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

我创建了一个 Grails 项目:

  • 文件 -> 新建 -> Grails 项目

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

  • 打开 grails 控制台并输入: grails> install-plugin vaadin

但是,从 Grails 2.4.3 开始不推荐使用,并且必须像这样将插件添加到 BuildConfig.groovy 文件中(基于本书的合著者之一的本教程 -> https://vaadin.com/wiki/-/wiki/Main/Vaadin%20on%20Grails%20-%20Create%20project%20in%20IntelliJ%20IDEA (在链接的 URL 中使用 IntelliJIDEA 而不是 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 | access$100 in     ''
|    367 | run . . . in java.net.URLClassLoader$1
|    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$1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    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 | access$100 in     ''
|    367 | run . . . in java.net.URLClassLoader$1
|    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

它最后说“服务器正在运行”,但这不是真的,并且没有根据需要创建grails-app/vaadin 文件夹。

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

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

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

【问题讨论】:

    标签: eclipse grails vaadin


    【解决方案1】:

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

    • Grails 2.4.5
    • Vaadin 7.4.8,有点新,
    • Oracle Express for Database(这是不可知的)

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

    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,所以应该完成propper配置。

    //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
                }
            }
        }
    }
    

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

    cache.region.factory_class
    

    在我的例子中,我使用的是 Hibernate4,所以你应该使用相同的值。

    来源: 看看这个项目:https://github.com/vaadin-on-grails/sass-compilation,别忘了买一本书 Vaadin on Grails,里面有很多相关的信息。

    【讨论】:

      【解决方案2】:

      不要使用 install-plugin 方法。

      把它放在 BuildConfig.groovy 的插件部分:

       compile ":vaadin:7.4.1"
      

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

      【讨论】:

      • 哦,是的,感谢您指出这一点,我不知道7.4.1 版本现在可用!是的,grails-app/vaadin 不再使用了,现在我们可以使用 grails vaadin-quickstart 目标创建一个简单的快速启动 UI。
      • 您能否提供一个指向您可以找到此信息的网站的链接?
      • @flp 抱歉,您的评论回复晚了,我现在才看到。无论如何,在我解决这个问题时,还没有一个网站描述了设置一个工作 vaadin/grails 项目的完整步骤,所以我最终在 GitHub 上打开了一个问题:以下链接应该会有所帮助-> github.com/ondrej-kvasnovsky/grails-vaadin-plugin/issues/48jira.grails.org/browse/GPVAADIN-25
      猜你喜欢
      • 2011-02-06
      • 2013-06-27
      • 1970-01-01
      • 2011-10-15
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      相关资源
      最近更新 更多