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"/> 读取源文件的属性值并设置为目标文件的属性值
源文件,相当于新生成的代码,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"/> 读取源文件的属性值并设置为目标文件的属性值