task merge - jmr-source/doc GitHub Wiki
###目录:###
- 前言
- 文件的通用合并
- Java的合并
- 创建:@create @create include{} @create exclude{}
- 合并:@merge、@merge all、@merge include{}、@merge exclude{}
###例子位置:###
- demo/task/merge.jmr.xml 任务中的 task
##前言##
我们知道,任务有3种模式,新建、合并和覆盖。新建和覆盖都很好理解,新建是文件不存在时执行任务会生成新的文件,覆盖是文件已经存在了,重新生成替换掉之前的内容。而合并,则是需要遵循一定的规则。
合并目前分成2类,一类是文件的合并,另一类是Java的合并,Java是文件的特例。
##文件的通用合并##
任何文本类型的文件,都可以通过简单的2种方式运行合并操作:
- 插入式合并:在标记位置的末尾插入新的内容。
- 更新式合并:替换标记位置的所有内容。
##插入式合并:insert##
- 标记开始符:insert_start id="..."
- 标记结束符:insert_end
- 可以使用<insert>标签作用相同
合并演示:
模版中: insert_start id="..." <insert id="..."> ..(2).. 或者 ..(2).. insert_end </insert> 文件合并位置同样id的部分: //insert_start id="..." ..(1).. //insert_end 合并后: //insert_start id="..." ..(1).. ..(2).. //insert_end
不管是在模板还是Java或者各种类型的文件,都是以这2个符号作为识别标识的。 只不过在不同的文件中,我们可以加入一些符号,避免语法错误。
比如在Java中,我们可以用//或者//TODO。我们输入insert,可以出现提示
在其它文件中,比如xml或者html、jsp等,可以使用<!-- -->;输入insert,可以出现提示。
例子:在菜单栏中插入新的链接。
在模板中,除了用标记符外,还可以使用<insert>标签,效果一样。
常用insert的地方如struts、spring配置文件注册bean、action,菜单栏注册新链接等。 实战用例请阅读:
##更新式合并:update##
- 标记开始符:update_start id="..."
- 标记结束符:update_end
- 可以使用<update>标签作用相同
合并演示:
模版中: update_start id="..." <update id="..."> ..(2).. 或者 ..(2).. update_end </update> 文件合并位置同样id的部分: //update_start id="..." ..(1).. //update_end 合并后: //update_start id="..." ..(2).. //update_end
不管是在模板还是Java或者各种类型的文件,都是以这2个符号作为识别标识的。 只不过在不同的文件中,我们可以加入一些符号,避免语法错误。
比如在Java中,我们可以用//或者//TODO。我们输入update,可以出现提示
在其它文件中,比如xml或者html、jsp等,可以使用<!-- -->;输入insert,可以出现提示。
例子:在菜单栏中更新链接。
在模板中,除了用标记符外,还可以使用<update>标签,效果一样。
##Java的合并##
Java的合并是粗细粒度可以控制的系统,通过在多行注释中使用@tag。同时,方法体中也可以使用通用的insert、update合并,合并的标识有2种
-
@create:在模板中添加新属性(field)、新构造方法(constructor)、新方法(method)后,添加新结构到Java类中。
-
@merge:在模版中改变类、属性(field)、构造方法(constructor)、方法(method)的结构后,同步更新到Java类中。
。
本章后续会用到的术语说明
- package:包名声明。
- import:导入声明。
- flag:public、protected、private或者不填(不填为protected)。
- className:类名或接口名。
- superClass:父类声明。
- superInterface:父接口声明。
- field:类的属性。
- type:属性的类型。
- initializer:属性的初始化值。
- constructor:构造方法。
- method:方法。
- returnType:返回类型(可以为void)。
- parameter:构造方法或者方法的参数声明。
- exception:异常抛出声明。
- body:构造方法或者方法的方法体。
###创建:@create @create include{} @create exclude{}###
-
@create:默认的结构都会被添加,属性(field)、构造方法(constructor)、方法(method)都是默认结构;合并时都会被添加。
-
@create include{}:只有包含的结构才会添加。
-
@create exclude{}:与include相反,只有排除的结构才不会添加。
如何得到提示:
在类的多行注释中,输入@可以提示出来。
在@create include{}中按提示键可以提示出属性
在@create exclude{}中按提示键可以提示出属性
@create例子:可以看到所有结构都被添加。
@create include{}例子:可以看到只有属性(field)被添加。
@create exclude{}例子:可以看到只有属性(field)没被添加。
###合并:@merge、@merge all、@merge include{}、@merge exclude{}###
-
@merge:合并类、属性、构造方法、方法的结构。
-
@merge include{}:只有包含的结构才会合并。
-
@merge exclude{}:与include相反,只有排除的结构才不会合并。
类的合并结构:package、import、flag、className、superClass、superInterface。
属性(field)的合并结构:flag, type, initializer。
构造方法(constructor)的合并结构:flag、parameter、exception、body。
方法(method)的合并结构:flag、returnType、parameter、exception、body。
如何得到提示:
在类、属性、构造方法、方法的多行注释中,输入@可以提示出来。
在@create include{}中按提示键可以提示出属性,每个结构属性都不同。
在@create exclude{}中按提示键可以提示出属性,每个结构属性都不同
@merge例子:可以看到所有结构都被合并。
@merge include{}例子:可以看到模版中改了flag、parameter、exception、returnType、body, 但只有parameter、expection、body合并了,flag和exception没有变化。
@merge exclude{}例子:可以看到模版中改了flag、parameter、exception、returnType、body, 但只有flag和exception合并了,parameter、expection、body没有变化。
##body可使用通用的合并方式##
Java类和接口的合并除了使用@create和@merge外,构造方法和方法的方法体(body)中,还可以使用insert和update的方式。
如果方法的注释中有@merge,原本会把方法体(body)全部合并,但是如果有insert、update的合并时,body的合并将会无效。
不过更好的建议是,如果既要使用@merge,又要在方法体中使用insert、update,最好写成@merge exclude{body}。