出处。
作者:尹燕成
Xdoclet是什么?
XDoclet 是一个通用的代码生成实用程序,是一个扩展的Javadoc Doclet引擎(现已与Javadoc Doclet独立),XDoclet是EJBDoclet的后继者,而EJBDoclet是由Rickard Oberg发起的。(http://xdoclet.sourceforge.net/xdoclet/index.html), 它允许您使用象 JavaDoc 标记之类的东西来向诸如类、方法和字段之类的语言特征添加元数据。随后,它利用这些额外的元数据来生成诸如部署描述符和源代码之类的相关文件。可以让你创 建自己的javadoc @tags进而利用XDoclet中的Templet enging基于这些@tags生成源代码或其他文件(例如xml的deployment descriptors)。
XDoclet 继承了 JavaDoc 引擎的思想,允许根据定制 JavaDoc 标记生成代码和其他文件。当然,XDoclet 也可以访问整个解析树。这样,它就可以访问类、类的包结构和类的方法。
XDoclet 提供了自己的模板引擎。该模板引擎在概念上类似于 JavaServer Pages(JSP)技术。它实质上包含两类标记:块标记(block tag)和内容标记(content tag)。块标记控制如 Java 编程语言中的 if 和 for 语句之类的流。内容标记打印当前解析树上下文的片段,如类名称、方法名称和参数,等等。
Xdoclet的应用实例
Xdoclet不是单独可以运行的工具(不像Ant工具),它可以与其它工具一起配合运行,如Ant。我们下面的例子就是基于Ant和xdoclet的。
1、首先需要保证ant是可用的。
2、下载并解压xdoclet的包(我们现在使用的是xdoclet2,具体版本是xdoclet-plugins-1.0.3)。
3、在ant构建工具中定义xdoclet任务,并使用:
<?xml version="1.0" encoding="GBK"?> <project name="OA系统构建脚本" default="生成Hibernate配置文件" basedir="."> <property name="src.dir" value="${basedir}/src"/> <property name="build.dir" value="${basedir}/bin"/> <property name="webapp.dir" value="${basedir}/src/webapp"/> <property name="xdoclet.home" value="D:/opensources/xdoclet/xdoclet-plugins-1.0.3"/> <!-- Build classpath --> <path id="xdoclet.task.classpath"> <fileset dir="${xdoclet.home}/lib"> <include name="**/*.jar"/> </fileset> <fileset dir="${xdoclet.home}/plugins"> <include name="**/*.jar"/> </fileset> </path> <taskdef name="xdoclet" classname="org.xdoclet.ant.XDocletTask" classpathref="xdoclet.task.classpath" /> <target name="生成Hibernate配置文件"> <xdoclet> <fileset dir="${src.dir}/com/oa/model"> <include name="**/*.java"/> </fileset> <component classname="org.xdoclet.plugin.hibernate .HibernateConfigPlugin" destdir="${src.dir}" version="3.0" hbm2ddlauto="update" jdbcurl="jdbc:mysql://127.0.0.1/oa" jdbcdriver="com.mysql.jdbc.Driver" jdbcusername="root" jdbcpassword="mysql" dialect="org.hibernate.dialect.MySQLDialect" showsql="true" /> </xdoclet> </target> <target name="生成hibernate映射文件"> <xdoclet> <fileset dir="${src.dir}/com/oa/model"> <include name="**/*.java"/> </fileset> <component classname="org.xdoclet.plugin.hibernate. HibernateMappingPlugin" version="3.0" destdir="${src.dir}" /> </xdoclet> </target> </project> |
以上就是一个完整的可运行的ant构建脚本。我们努力来理解这个文件把:
- <property>标签定义一些变量,这些变量可以通过${变量名}的方式引用
- <path>标签定义了类路径
- <taskdef>标签定义了xdoclet任务(因为ant本身肯定是不包含xdoclet任务的)
- 我们在下面的两个<target>中,使用了<xdoclet>标签,这个标签正是我们自己定义的。
使用XDoclet简化hibernate配置文件
我们可以在java代码中使用类似于javadoc的注释,来表达更多的内容。这些额外的注释,通过使用xdoclet工具,我们可以将它们转换为我们需要的各种配置文件。先看一个简单的例子:
比如有一个java文件的源代码如下:
/** * @hibernate.class * table="T_Party" */ public class Party { /** * @hibernate.id * generator-class="native" */ private int id; /** * @hibernate.many-to-one * column="parentid" */ private Party parent; /** * @hibernate.set * @hibernate.key * column = "parentid" * @hibernate.one-to-many * class = "com..oa.model.Party" */ private Set children; /** * @hibernate.property * column="thename" */ private String name; /** * @hibernate.property */ private String sn; /** * @hibernate.property */ private String description; /** * * @return */ public Set getChildren() { return children; } public void setChildren(Set children) { this.children = children; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } /** */ public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Party getParent() { return parent; } public void setParent(Party parent) { this.parent = parent; } public String getSn() { return sn; } public void setSn(String sn) { this.sn = sn; } } |
通过xdoclet,我们可以得到关于这个类的Hibernate映射文件,如下:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE hibernate-mapping PUBLIC " -//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class table="T_Party" name="com.oa.model.Party"> <id name="id"> <generator class="native"/> </id> <many-to-one column="parentid" name="parent"/> <set name="children"> <key column="parentid"/> <one-to-many class="com.oa.model.Party"/> </set> <property name="name" column="thename"/> <property name="sn"/> <property name="description"/> </class> </hibernate-mapping> |
四、总结
XDoclet 是一个有用的、智能的代码生成器,可以用它自动进行许多日常的 Java 开发任务。不要被它表面的复杂所吓退。随着逐渐精通 XDoclet(以及与之相关的 Apache Ant),会节约许多宝贵的时间,并在未来的开发工作中,得到数倍的回报。