Grails探索系列之 domain class的编译期属性注入(终结篇)

几个月前,我曾研究过Grails的domain class的编译期属性注入专题(可参见拙文《Grails探索系列之 domain class的编译期属性注入》 http://sam-ds-chen.iteye.com/blog/676070

在那篇文章中,提到了一个悬而未决的问题
引用

...权且试试,把编译后得到的类拷贝进%GRAILS_HOME%/dist/grails-core-1.2.2.jar,覆盖之。执行grails clean, grails run-app...结果很令人沮丧,domain class中deleted, dateCreated, history这三个属性一个都没有。(期间还碰到一个问题,让我现在依然摸不着头脑:执行grails war,得到的war中WEB-INF/lib下的grails-core-1.2.2.jar 竟然还是未被修改过的!它是从哪里来的呢?dist下的确定已经修改成功了,源代码也改了,甚至网线也断掉了,不可能从dist拷贝过来,也不是从src编译过来然后打的jar包,也不可能从grails网站下载 -- 它到底是从哪来的呢?????? 这个问题权且放一放。)


并得到了一个错误的结论
引用

结论:假设不成立。


今天机缘巧合,一举解除了这个盘踞在我心里的疑惑。
一切纯属巧合:我再一次尝试修改了Grails的DefaultGrailsDomainClassInjector,让它注入String类型的id,而不是Long类型,同时除了注入id和version两个属性之外,再多注入deleted, dateCreated, createdBy三个属性。然后把编译得到的DefaultGrailsDomainClassInjector.class替换掉位于我的E盘的grails-core-VERSION.jar中的同名类。

正当我准备做下一步试验时,我的计算机突然报“C盘空间低”,原来C盘装了很多我不怎么用的软件。我懒得一个一个去卸载了,干脆来个一键恢复。这一恢复,我好比乘坐时间机器回到了从前,机器空荡荡一片好干净,C盘剩余2G。

我重新设置了GRAILS_HOME,执行grails clean命令,再grails run-app把我的Grails应用跑起来。这时我在IntelliJ IDEA中发现,我的domain在没有加@GrsDomainClass(自定义的annotation,用来指示Grails编译期注入其他属性)的情况下,编译出来的domain class中含有那些额外注入的属性。这说明我对grails-core-VERSION.jar的修改生效了!

然则为什么数月前的修改没生效呢?当我看到我的user目录下有个.ivy2,其下有个cache子目录时,我恍然大悟:无论怎么修改grails-core-VERSION.jar,只要cache没被清空,grails使用的仍然是cache下的grails-core-VERSION.jar!一旦cache被清空(今天因为我使用了一键恢复,.ivy2/cache整个被干掉了),那些依赖(包括被修改过的grails-core-VERSION.jar)便会被grails从%GRAILS_HOME%下的dist和lib下拷贝到cache目录。这也很好地解答了我上文提到的那个悬而未决的问题。

现在我只需直接修改grails-core-VERSION.jar,并注意cache的问题就好了,自定义的@GrsDomainClass已成摆设,干脆把它删了。

问题的出现,在一瞬间;找到答案,也往往在一刹那。

你可能感兴趣的:(C++,c,cache,C#,grails)