Grails升级到2.2.2失败,迁移脚本上出现ClassNotFoundException

Jam*_*hon 3 grails grails-2.2

尝试将Grails项目从2.1.1升级到2.2.2时,出现了奇怪的堆栈跟踪信息,

| Error 2013-05-01 17:54:46,935 [localhost-startStop-1] ERROR context.GrailsContextLoader  - Error initializing the application: Error creating bean with name 'grailsApplication' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: Class not found loading Grails application: devportal.schema.schema-0
Message: Error creating bean with name 'grailsApplication' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: Class not found loading Grails application: devportal.schema.schema-0
   Line | Method
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|   138 | run      in java.util.concurrent.FutureTask
|   895 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   918 | run      in     ''
^   680 | run . .  in java.lang.Thread

Caused by GrailsConfigurationException: Class not found loading Grails application: devportal.schema.schema-0
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|   138 | run      in java.util.concurrent.FutureTask
|   895 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   918 | run      in     ''
^   680 | run . .  in java.lang.Thread

Caused by ClassNotFoundException: devportal.schema.schema-0
->> 202 | run      in java.net.URLClassLoader$1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|   190 | findClass in java.net.URLClassLoader
|   306 | loadClass in java.lang.ClassLoader
|   303 | innerRun in java.util.concurrent.FutureTask$Sync
|   138 | run . .  in java.util.concurrent.FutureTask
|   895 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   918 | run . .  in     ''
^   680 | run      in java.lang.Thread
Run Code Online (Sandbox Code Playgroud)

由于某种原因,它似乎正在尝试从Database Migrations插件运行数据库迁移。

我找到了有关该主题的邮件列表帖子

看来我可以实际添加:将最新版本打包到我的迁移中以解决问题。也许我应该一直这样?

但是将程序包添加到脚本中并没有帮助(甚至尝试了current)。

有人知道吗

Jam*_*hon 5

发布后几乎立即找到了解决方案,

http://grails.1312388.n4.nabble.com/Nested-folder-for-database-migrations-in-Grails-2-2-x-td4642106.html

为了跟进,我通过在与文件夹结构匹配的迁移脚本文件的开头添加包声明来解决该问题。不知道是引起问题的是Grails更改还是Groovy更改,但是使用声明的包结构将文件编译到了target / classes目录中(在这种情况下,文件什么也不做,导致它们位于根文件夹中) )。但是,Grails正在检测文件结构中的文件,并创建具有匹配路径的Spring FileSystemResources。这些被传递给DefaultGrailsApplication构造函数,并且ClassLoader无法在匹配的位置找到类。

grails-app / migrations / releases / release_1 / foo.groovy-> target / classes / foo.class

通过在foo.groovy的开头添加“ package releases.release_1”,将发生以下情况:

grails-app / migrations / releases / release_1 / foo.groovy-> target / classes / releases / release_1 / foo.class

然后,ClassLoader找到了FileSystemResource的相应类文件。