Grails笔记二:grails 2.4.3版本下generate-*失效问题解析

时间:2023-03-09 02:19:19
Grails笔记二:grails 2.4.3版本下generate-*失效问题解析

最近在学grails框架,因为其敏捷性让我非常喜欢,不过有点让人恼怒的是也许因为grails框架太新了,所以关于grails的书籍很少,而且市面上的书籍大部分都是2007或者2009年的,官方文档又都是英文的,原谅我英语太差了~参照这些书籍学习却使用官方提供的最新grails,难免会有很多不同,需要不断尝试才能解决问题!(解决办法在随笔最后,不想看过程的可直接拉到最后)

回归正题,如果你在看grails权威指南(07版),甚至09年的一些关于grails的书籍,都可能会发生一种情况:使用grails的generate-*(generate-all等,参照下图图一)会发现命令无效的情况(图二)

Grails笔记二:grails 2.4.3版本下generate-*失效问题解析

图一

Grails笔记二:grails 2.4.3版本下generate-*失效问题解析

图二

顺便提一下,对于初学者(包括我自己)在刚开始使用grails命令的时候直接输入:grails help,会发现命令列表中没有上述或者一些其他的命令,如下图所示:

Grails笔记二:grails 2.4.3版本下generate-*失效问题解析

图三

对比上图可以发现没有generate-*命令,这是怎么回事呢?其实也很简单,图二的所有命令都是针对一个grails工程的,而图一所示的命令还包括了针对工程中各项文件的命令,出现二者的区别就在于:使用grails命令时是否是在grails工程里面。

拿图说话吧,在windows的情况下直接调出cmd窗口是类似于这样的:

Grails笔记二:grails 2.4.3版本下generate-*失效问题解析

图四

并不会进入grails工程里面,比如我有个叫myFirst的grails工程,如果使用cd myFirst后,再使用grails help就会出现图一所示的命令行了。

回到generate-*命令出现无效情况中,我可以确保自己在domian文件夹中一定有个Hello,如图五:

Grails笔记二:grails 2.4.3版本下generate-*失效问题解析

图五

那么为什么会出现这种情况呢?毫无疑问generate-*是对的,我们看下图五中Hello这个domian的路径,是不是不直接在domian文件夹下而多了一层以工程名(全部小写)的文件夹?

所以generate-*自然在domain根目录下是找不到这个领域模型的,那么也许有人会问,如果我把Hello这个领域模型放到domain的根目录下是不是就可以了呢?

不妨一试,我把book(我换了一个,参照图五可以看到它是没有被generate-all执行过的)放到了domain的根目录下(注意地址栏):

Grails笔记二:grails 2.4.3版本下generate-*失效问题解析 图六

使用generate-all命令,会出现下面的情况:

Grails笔记二:grails 2.4.3版本下generate-*失效问题解析

图七

很抱歉,这样会报错。所以目前认为这是不可行的。

那么该怎么解决图二所展示的问题呢?我查阅了一些其他牛人的说法,大致为把:grails generate-all domain-class-name换为grails generate-all  projectName.domian-class。注意其中有个点,这个很重要。

我尝试了一下,使用grails generate-all  myFirst.Book(我建立了一个名称为myFirst的grails工程),结果如下:

Grails笔记二:grails 2.4.3版本下generate-*失效问题解析

图八

结果还是一样,难道大神的说法是错误的吗?回到图五,其实我们会发现,在domain下有个叫myfirst的文件夹,与工程名很类似,但显然和工程名不一样,我尝试把grails generate-all myFirst.Book改为grails generate-all myfirst.Book,结果如下:

Grails笔记二:grails 2.4.3版本下generate-*失效问题解析

图九

Grails笔记二:grails 2.4.3版本下generate-*失效问题解析

图十


成功了,综上所述,这种问题的解决办法应该是把grails generate-* domain-class-name改为grails generate-* (domain下相应的文件夹名称).domain-class-name。

还有点需要注意的是,domain-class-name必须要和生成的groovy类名一致,区分大小写。