`

jmerge整理的一些东西

阅读更多
Eclipse jmerge 学习:一个最简单的例子2008-08-06 09:37   最近要做代码生成方面的工作,考虑需要合并生成的代码和用户手工修改的代码,研究一下eclipse的jmerge,在网上发现了一篇非常好的资料《使用Eclipse的JMerge 定制生成的代码和编辑器》,试着做几个例子。

源文件,相当于新生成的代码,Source.java.txt:

package aa;

import java.util.*;

public class Cust {

private String pa="source";

private String p_source;

public void methodA() {
   System.out.println("methodA in source");
}

public void method_source() {
 
}
}

目标文件,相当于以前生成的代码、经过用户修改后的代码,Target.java.txt:

package aa;

import java.math.*;

public class Cust {

private String pa="target";

private String p_target;

public void methodA() {
   System.out.println("methodA in target");
}

public void method_target() {
 
}
}

配置文件,最简单的merge.xml:

<?xml version="1.0" encoding="UTF-8"?>
<merge:options xmlns:merge="http://www.eclipse.org/org/eclipse/emf/codegen/jmerge/Options">
    <merge:pull   sourceGet="Method/getBody"    targetPut="Method/setBody"/>
</merge:options>

测试类,调用jmerge执行合并(将新生成的代码覆盖到以前生成的被修改过的代码),并输出合并结果,Test.java

import org.eclipse.emf.codegen.merge.java.JMerger;

public class Test {

public static void main(String[] args) throws Exception {
   JMerger jmerger = new JMerger();
   String merge = "D:\\gmf\\workspace\\demo\\src\\merge.xml";
   String source = "D:\\gmf\\workspace\\demo\\src\\Source.java.txt";
   String target = "D:\\gmf\\workspace\\demo\\src\\Target.java.txt";
   String content=jmerger.execute(null, new String[] { merge, source, target });
   System.out.println(content);
   //
}

}

执行结果:

package aa;

import java.util.*;
import java.math.*;

public class Cust {

private String pa="target";

private String p_source;

private String p_target;

public void methodA() {
   System.out.println("methodA in source");
}

public void method_source() {
 
}

public void method_target() {
 
}
}

结论:

1 . 一个方法如果只在源文件或只在目标文件中存在,那么他们都会保留在合并后的文件中;如果一个方法同时出现在源文件或目标文件,那么源文件的方法或覆盖目标文件的方法。

2.   一个属性如果同时出现在源文件和目标文件,只是属性值不一样,将会保留目标文件的属性值设置。?还得继续研究原因!

3.   原来最简单的文件合并并不需要特殊的javadoc支持。








续:修改merge.xml增加对属性的合并规则:

<?xml version="1.0" encoding="UTF-8"?>
<merge:options xmlns:merge= "http://www.eclipse.org/org/eclipse/emf/codegen/jmerge/Options">
    <merge:pull   sourceGet="Method/getBody"   targetPut="Method/setBody"/>
<merge:pull    sourceGet="Field/getInitializer"    targetPut="Field/setInitializer"/>     
</merge:options>

运行结果是:

package aa;

import java.util.*;
import java.math.*;

public class Cust {

private String pa="source";

private String p_source;

private String p_target;

public void methodA() {
   System.out.println("methodA in source");
}

public void method_source() {
 
}

public void method_target() {
 
}
}


分析:

<merge:pull   sourceGet="Method/getBody"   targetPut="Method/setBody"/>    读取源文件的方法体并设置为目标文件的方法体
<merge:pull    sourceGet="Field/getInitializer"    targetPut="Field/setInitializer"/>    读取源文件的属性值并设置为目标文件的属性值

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics