2013-05-01 53 views
3

想我的Grails项目从升级到2.1.1 2.2.2当我得到一个奇怪的堆栈跟踪,Grails的升级到2.2.2失败,并在迁移脚本ClassNotFoundException的

| 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 

出于某种原因,看起来它试图从Database Migrations plugin运行我的数据库迁移。

我发现关于这个问题的mailing list post

它看起来像我其实可以添加: 包当前 我移民来解决这个问题。 也许我应该一直这样做?

但将我的软件包添加到我的脚本并没有帮助(我甚至尝试过current)。

任何人有任何想法?

回答

4

发布后几乎直接找到了解决办法,

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 /迁移/释放/ RELEASE_1/foo.groovy - > 目标/类/让Foo.class

通过添加 '包releases.release_1' 到foo.groovy, 的开始,则以下发生:

的grails-app /迁移/释放/ RELEASE_1/foo.groovy - > 目标/类/释放/ RELEASE_1 /让Foo.class

然后,类加载器找到符合 的FileSystemResource相应的类文件。