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

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

在那篇文章中,提到了一个悬而未决的问题
[quote]
...权且试试,把编译后得到的类拷贝进%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[color=red]竟然还是未被修改过的!它是从哪里来的呢?dist下的确定已经修改成功了,源代码也改了,甚至网线也断掉了,不可能从dist拷贝过来,也不是从src编译过来然后打的jar包,也不可能从grails网站下载 -- 它到底是从哪来的呢??????[/color] 这个问题权且放一放。)
[/quote]

并得到了一个错误的结论
[quote]
[color=red]结论:假设不成立。 [/color]
[/quote]

今天机缘巧合,一举解除了这个盘踞在我心里的疑惑。
一切纯属巧合:我再一次尝试修改了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已成摆设,干脆把它删了。

问题的出现,在一瞬间;找到答案,也往往在一刹那。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值