通过mybatis工程学习用maven插件生成站点文档

2014/09/22更新,加入了jacoco
2015/07/20更新,jarjar-maven-plugin换成maven-shade-plugin


mybatis的文档挺不错的,最近有兴趣看了一下mybatis的工程,发现它的文档(站点)是通过maven的插件自动生成的。所以我们借巨人的肩膀,不妨分析一下他是如何做到自动生成站点的。

首先要注意的是,要在本地编译mybatis的话,需要2个工程
[url=https://github.com/mybatis/parent.git]parent[/url]
[url=https://github.com/mybatis/mybatis-3.git]mybatis-3[/url]

本文写作时,最新版本为3.3.0-SNAPSHOT。本文就针对这个版本来分析一下如何生成站点。

1. 运行效果
先不说理论,最好的学习方法就是先运行,然后看效果。
2个工程分别git clone下来以后执行mvn clean install即可。然后会发现target目录下有个site目录,里面就是生成的站点了。浏览一下,有自己写的文档,还有各种报表。

2.[url=http://maven.apache.org/plugins/maven-site-plugin/]maven-site-plugin[/url]
这个便是做到生成站点的maven插件了。要注意的是插件的版本是定义在parent中的。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.4</version> <!-- 3.3 works wrong with fluido skin 1.3.x -->
<configuration>
<locales>en,es,ja,fr,zh_CN,ko</locales>
</configuration>
<executions>
<execution>
<id>attach-descriptor</id>
<goals>
<goal>attach-descriptor</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.github.stephenc.wagon</groupId>
<artifactId>wagon-gitsite</artifactId>
<version>0.4.1</version>
</dependency>
<!-- Fluido here only for version update checks on site page -->
<dependency>
<groupId>org.apache.maven.skins</groupId>
<artifactId>maven-fluido-skin</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
</plugin>


2.1 支持多国语言,执行mvn site后target/site目录下多种语言的站点都生成了。

2.2 采用了maven-site-plugin3.4,说3.3对fluido皮肤有bug

2.3 attach-descriptor 将站点描述符(site.xml)加入到要安装和部署的文件列表中。

2.3.1 [url=http://maven.apache.org/plugins/maven-site-plugin/examples/sitedescriptor.html]站点描述符[/url]
是用来自定义站点index页面的方法,需要写src/site/site.xml

2.4 [url=http://stephenc.github.io/wagon-gitsite/]wagon-gitsite[/url]
wagon的一个实现,用来将文档部署到github上

2.4.1 [url=http://maven.apache.org/wagon/index.html]wagon[/url]
wagon是maven用来处理artifact和repository的抽象传输层,支持以下方式的代码传输:
[list]
[*]File
[*]HTTP -->http client
[*]HTTP lightweight
[*]FTP -->commons net
[*]SSH/SCP -->jsch
[*]WebDAV -->jackrabbit
[*]SCM -->maven scm api
[/list]

2.5 [url=http://maven.apache.org/skins/index.html]皮肤[/url]
该站点列举了目前可用的5种皮肤

2.5.1 [url=http://maven.apache.org/skins/maven-fluido-skin/]maven-fluido-skin[/url]
采用了Twitter Bootstrap的css作为皮肤,使得站点看上去非常的新潮漂亮。
有一点令我不解的是文档上写了要在site.xml中定义skin元素才能运用皮肤,但是mybatis没有这样做,只是如前面的xml里定义了dependency,就可以用这个皮肤了。

2.5.2 其他皮肤资料
[url]http://docs.codehaus.org/display/MAVENUSER/Maven+Skins[/url]
这个网址列举了一些皮肤实现,可用来参考激发创作灵感。

2.6 站点文档采用了xdoc格式书写,通过maven-site-plugin可以文档自动转为网站,而maven-pdf-plugin则将文档生成为pdf格式

3.[url=http://maven.apache.org/plugins/maven-pdf-plugin/]maven-pdf-plugin[/url]
执行mvn pdf:pdf以后会在target/pdf目录下生成文档的pdf版本。

这个插件默认是使用fop来生成pdf的,同时也支持itext来生成pdf。
可以定义src/site/pdf.xml,指定要包含哪些文件。

4.[url=http://maven.apache.org/doxia/index.html]doxia[/url]
doxia是一个内容生成框架,可以将各种格式的文档生成为另一种格式
比如mybatis里文档时用xdoc格式写的,结果可以输出为html或pdf格式。

目前doxia支持的文档写作格式见如下网址,大概有10来种。
[url]http://maven.apache.org/doxia/references/index.html[/url]
APT, Confluence, Simplified DocBook, Markdown, FML, FO, iText, LaTeX, RTF, TWiki, XDoc, XHTML

另外还有一个eclipse插件,可以可视化的书写文档
[url]http://maven.apache.org/doxia/doxia-ide/eclipse/[/url]

5. 打包插件
功能是打包成uber-jar。所谓的uber-jar,就是一个fat jar,包含了所有的第三方类库的class文件。之所以需要这样做,是用来将第三方的jar包(javaassist, ognl)一同打入到mybatis里用的。其中一个考虑点是避免不同版本的javassist出现jar包冲突问题。(这里打个比方,比如mybatis用了javassist 1,而客户用了javassist 2,那就jar包冲突了。)mybatis将javassist等重新换个包名打包就可以避免jar包冲突问题了。

mybatis3.3之前采用jarjar-maven-plugin,而之后换成了maven-shade-plugin

5.1 jarjar-maven-plugin
[url]http://sonatype.github.io/jarjar-maven-plugin/[/url]
[url]https://github.com/sonatype/jarjar-maven-plugin[/url]
[url]https://code.google.com/p/jarjar/[/url]


<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>jarjar-maven-plugin</artifactId>
<configuration>
<input>{classes}</input>
<input>{test-classes}</input>
<includes>
<include>ognl:ognl</include>
<include>org.javassist:javassist</include>
</includes>
<rules>
<rule>
<pattern>ognl.**</pattern>
<result>org.apache.ibatis.ognl.@1</result>
</rule>
<rule>
<pattern>javassist.**</pattern>
<result>org.apache.ibatis.javassist.@1</result>
</rule>
<keep>
<pattern>org.apache.ibatis.**</pattern>
</keep>
</rules>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<id>jarjar-classes</id>
<phase>process-test-classes</phase>
<goals>
<goal>jarjar</goal>
</goals>
<configuration>
<input>{classes}</input>
</configuration>
</execution>
<execution>
<id>jarjar-test-classes</id>
<phase>process-test-classes</phase>
<goals>
<goal>jarjar</goal>
</goals>
<configuration>
<input>{test-classes}</input>
</configuration>
</execution>
</executions>
</plugin>


mvn jarjar:jarjar
执行 mvn site以后在target/jarjar目录下有
hull-classes
hull-test-classes
uber-classes --> 可以用压缩软件打开,其中打包了javaassist, ognl
uber-test-classes

5.2 [url=https://maven.apache.org/plugins/maven-shade-plugin/]maven-shade-plugin[/url]
这个是新版的mybatis采用的插件,配置如下

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<artifactSet>
<includes>
<include>org.mybatis:mybatis</include>
<include>ognl:ognl</include>
<include>org.javassist:javassist</include>
</includes>
</artifactSet>
<relocations>
<relocation>
<pattern>ognl</pattern>
<shadedPattern>org.apache.ibatis.ognl</shadedPattern>
</relocation>
<relocation>
<pattern>javassist</pattern>
<shadedPattern>org.apache.ibatis.javassist</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>



6. 项目信息
如果浏览生成的站点的话,会发现左侧边栏有一栏叫“项目信息”

6.1 Project Dependencies
[url=http://maven.apache.org/plugins/maven-project-info-reports-plugin/]maven-project-info-reports-plugin[/url]

可以查看项目依赖的jar包,license。
Dependency Tree可以清晰的查看各个jar包之间的依赖关系
Project Plugins可以查看用到的plugin

7.项目报表
一堆报表啊,牛叉~~~

7.1 JavaDocs
很简单,用来生成javadoc的

7.1.1 [url=http://maven.apache.org/plugins/maven-javadoc-plugin/]maven-javadoc-plugin/[/url]
javadoc插件,没杀好说的。

7.1.2 [url=https://code.google.com/p/doclava/]doclava[/url]
一个新的javadoc的皮肤,使得报表看起来新颖,漂亮。
使用范例如下

<doclet>com.google.doclava.Doclava</doclet>
<docletArtifact>
<groupId>com.google.doclava</groupId>
<artifactId>doclava</artifactId>
<version>1.0.6</version>
</docletArtifact>


7.1.3 关于doclet
[url]http://www.oracle.com/technetwork/java/javase/documentation/index-jsp-135444.html[/url]
[url]http://docs.oracle.com/javase/1.5.0/docs/guide/javadoc/doclet/spec/index.html[/url]

7.1.4 另一个doclet是[url=http://www.umlgraph.org/]umlgraph[/url]
可用来自动生成类图和序列图。
另外要生成图片,还需要[url=http://www.graphviz.org/]Graphviz[/url]

生成类图的步骤:
1).[url=http://www.graphviz.org/Download_windows.php]下载[/url]
2). 环境变量加入 GRAPHVIZ_HOME=F:\down\graphviz-2.38\release
3).将%GRAPHVIZ_HOME%/bin加入到path
4).修改pom.xml,以使用新的doclet

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<configuration>
<doclet>org.umlgraph.doclet.UmlGraphDoc</doclet>
<docletPath>%GRAPHVIZ_HOME%/bin</docletPath>
<docletArtifact>
<groupId>org.umlgraph</groupId>
<artifactId>doclet</artifactId>
<version>5.1</version>
</docletArtifact>
<additionalparam>-views</additionalparam>
<useStandardDocletOptions>true</useStandardDocletOptions>
</configuration>
</plugin>


5).执行mvn javadoc:javadoc
可以看到
target\site\apidocs\org\apache\ibatis\builder下面多出了一些png图片,这些就是类图了。
下图是生成的一个效果图。
[img]http://dl2.iteye.com/upload/attachment/0100/9029/022dc04f-ad4e-3938-a872-53830181f8dd.png[/img]

7.2 Source Xref/Test Source Xref
主要方便别人,不用下载源码,可以直接在你的网站上查看源代码和测试代码的。

只要定义如下的[url=http://maven.apache.org/jxr/maven-jxr-plugin/]maven-jxr-plugin[/url],这样生成的站点报表里就含有它了。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
<version>2.4</version>
</plugin>


7.3 JDepend
[url=http://clarkware.com/software/JDepend.html]JDepend[/url]
[url=http://mojo.codehaus.org/jdepend-maven-plugin/]jdepend-maven-plugin[/url]

用来查看各个包之间的依赖程度,可以作为衡量类的层次结构的设计质量的一个参考。

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jdepend-maven-plugin</artifactId>
<version>2.0</version>
</plugin>


7.4 FindBugs Report
用来分析代码是否有潜藏bug的工具
[url=http://findbugs.sourceforge.net/]FindBugs[/url]
[url=http://mojo.codehaus.org/findbugs-maven-plugin/]findbugs-maven-plugin[/url]
新的插件已经是3.0了。
随便提一下,FindBugs用BCEL来解析java字节码,用dom4j来处理xml

7.5 Surefire Report
单元测试的统计报表
[url=http://maven.apache.org/surefire/maven-surefire-report-plugin/]maven-surefire-report-plugin[/url]
主要做的工作是解析surefire-reports下的TEST-*.xml文件,然后将他们渲染成DOXIA格式,进而用来生成站点。

7.6 PMD
[url=http://pmd.sourceforge.net/]PMD[/url]
和findbugs一样也是用来查找代码缺陷的。
[url=http://maven.apache.org/plugins/maven-pmd-plugin/]maven-pmd-plugin[/url]

加上这句话以后

<linkXref>true</linkXref>

可以发现点击缺陷可以链接到Xref源码那里。

7.7 CPD
查重复代码的。Copy/Paste Detector (CPD)
[url]http://pmd.sourceforge.net/pmd-5.1.3/cpd.html[/url]

7.8 Tag List Report
可以生成TODO,FIXME等信息的报表
[url=http://mojo.codehaus.org/taglist-maven-plugin/]taglist-maven-plugin[/url]

7.9 Clirr Results
7.9.1 [url=http://clirr.sourceforge.net/]clirr[/url]
软件不同版本之间的兼容性我们可能一般会忽略,其实这个也是要考虑的。不然如果你的API频繁改动的话,别人写的老的代码在新的版本下就编译不过了。
Clirr 是用来检查2个版本之间的兼容性的,只要给他2个jar,它就可以dump出变化的API。

7.9.2 [url=http://mojo.codehaus.org/clirr-maven-plugin/]clirr-maven-plugin[/url]


<clirr.comparisonVersion>3.2.5</clirr.comparisonVersion>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>clirr-maven-plugin</artifactId>
<version>2.6.1</version>
<configuration>
<comparisonVersion>${clirr.comparisonVersion}</comparisonVersion>
<failOnError>false</failOnError>
<failOnWarning>false</failOnWarning>
</configuration>
</plugin>


如上例可看到,比较的是mybatis3.2.5和3.3.0-SNAPSHOT之间的差异
编译的时候,如果本地没有mybatis3.2.5的话,插件会自动去maven仓库去下载3.2.5到本地仓库,然后比较。

7.10 [url=http://mojo.codehaus.org/versions-maven-plugin/]versions-maven-plugin[/url]
[list]
[*]Property Updates Report
生成property的变化报表
[*]Plugin Updates Report
列举了项目用到的plugin,同时提示plugin是否有最新版本
[*]Dependency Updates Report
列举了项目用到的的dependency,同时提示dependency是否有最新版本
[/list]

注意点:使用这个插件,pom.xml不能保存为UTF-8 带BOM, 需要存为不带BOM的,否则会出以下错

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.4:site (default-site) on project mybatis: Error generating versions-maven-plugin:2.1:property-updates-report: only whitespace content allowed before start tag and not \u9518 (position: START_DOCUMENT seen \u9518... @1:1) -> [Help 1]


7.11 Cobertura Test Coverage
单元测试覆盖率报告

7.11.1 [url=http://cobertura.github.io/cobertura/]cobertura[/url]
是基于jcoverage的单元测试覆盖率报告工具

7.11.2 [url=http://mojo.codehaus.org/cobertura-maven-plugin/]cobertura-maven-plugin[/url]

7.12 Jacoco Coverage
单元测试覆盖率报告,貌似这个现在更高端流行

[url=http://www.eclemma.org/jacoco/]jacoco[/url]
[url=http://www.eclemma.org/jacoco/trunk/doc/maven.html]jacoco-maven-plugin[/url]


<!-- Introducing jacoco for sonarqube usage initially -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.2.201409121644</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>


8.其他插件
8.1 [url=http://maven.apache.org/enforcer/maven-enforcer-plugin/]maven-enforcer-plugin[/url]
用来定义一些必须遵守的配置,校验开发环境。比如JDK的版本,Maven的版本,开发环境(Linux,Windows等),依赖jar包的版本等等。

8.2 [url=http://mojo.codehaus.org/animal-sniffer-maven-plugin/]animal-sniffer-maven-plugin[/url]

[url=http://mojo.codehaus.org/animal-sniffer/]animal-sniffer[/url]
用来检查打包出来的jar包是否兼容老的JDK版本(如JDK5)
名字的由来:动物嗅探器,因为JDK的版本都是用动物名字命名的(tiger等等),所以这个工具就是用来嗅出JDK版本的

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>animal-sniffer-maven-plugin</artifactId>
<version>1.11</version>
<configuration>
<signature>
<groupId>org.codehaus.mojo.signature</groupId>
<artifactId>java16</artifactId>
<version>1.1</version>
</signature>
</configuration>
<executions>
<execution>
<id>check-java-1.6-compat</id>
<phase>process-classes</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>

其中的java16表示要兼容JDK6,更多的签名可以参考
[url]http://mojo.codehaus.org/signatures/[/url]

8.3 maven-bundle-plugin
[url=http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html]maven-bundle-plugin[/url]
[url=http://www.aqute.biz/Bnd/Bnd]Bnd[/url]
是和OSGI打包有关的

8.4[url=http://maven.apache.org/plugins/maven-changes-plugin/] maven-changes-plugin[/url]
用来展示这个版本有哪些变化

<issueManagement>
<system>GitHub Issue Management</system>
<url>https://github.com/mybatis/mybatis-3/issues</url>
</issueManagement>

<configuration>
<issueLinkTemplate>%URL%/issues/%ISSUE%</issueLinkTemplate>
</configuration>


8.5 [url=http://maven.apache.org/plugins/maven-source-plugin/]maven-source-plugin[/url]
用来将代码打包到一个jar中

8.6 [url=http://maven.apache.org/plugins/maven-gpg-plugin/]maven-gpg-plugin[/url]
用[url=https://www.gnupg.org/]GnuPG[/url]来给包签名


9. 总结
我们平时做项目一般把代码写完就结束了,但是mybatis不然,非常重视文档。
mybatis用到了很多maven插件来生成文档(站点),是一个可以供大家学习模仿的好sample。
一些常用插件的列表可以参考
[url]http://maven.apache.org/plugins/index.html[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用mavenmybatis-generator-maven-plugin插件自动生成实体映射文件时,我们首先需要在maven的pom.xml文件中配置插件。 在<build>标签下,添加如下代码: ``` <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.4.0</version> <dependencies> <!-- 添加数据库驱动依赖 --> </dependencies> <configuration> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> </plugin> </plugins> ``` 接下来,在项目的根目录下执行以下命令生成实体映射文件: ``` mvn mybatis-generator:generate ``` 执行完毕后,插件会根据配置信息,在项目的src/main/java目录下生成对应的实体类、mapper接口和xml映射文件。 在配置插件时,可以设置数据库连接信息、需要生成的表名、生成的实体类和映射文件的位置等。具体的配置信息可以参考官方文档生成的实体类对应数据库中的表结构,各个字段通过对应的get和set方法来访问。生成的mapper接口定义了对应的数据库操作方法,通过调用这些方法可以对数据库进行增删改查操作。生成的xml映射文件定义了实体类和数据库表之间的映射关系,通过该文件可以实现对象和表的相互转换。 通过使用mavenmybatis-generator-maven-plugin插件,我们可以简化开发人员编写实体映射文件的工作,提高开发效率和代码质量。同时,插件的配置灵活多样,可以根据项目的实际需求进行定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值