随笔-67  评论-522  文章-0  trackbacks-0
    前两篇对mybatis-generator-core源码进行了修改,在一定程度上做到了方便使用。这一篇先将写个测试程序看看生成的结果,然后用maven assembly将它打包生成一个zip文件。
    新建一个类StartUp,找到org.mybatis.generator.api.ShellRunner这个类,它就是生成文件的入口类,拷贝106-117行代码,再稍微作下修改。
    
    
    
generatorConfig.xmlresources目录下面,它里面要定义输出文件的目录,如果不指定具体的路径,默认是在当前文件夹下面生成。
    

    但是呢,这里有个比较蛋疼的地方,mybatis-generator-core默认是不给你生成文件夹的,不信?请看org.mybatis.generator.internal.DefaultShellCallback的第50行,当指定的目录不存在时,就抛出ShellException异常,所以输出文件也就不可能有了。这里我们注释掉51行代码,添加如下代码:
    
    
    现在再来执行StartUp看看,发现在与srctarget同级目录下生成了mybatis3目录,里面有相应的pojoxml,打开之后看看效果,与我们改动代码后预想的结果一致。那么接下来就看看,如何将它打包输出成下面这样的效果。
    

    首先我们新建一个src/main/scripts/run.bat文件,内容如下:
    java -jar mybatis-generator-1.3.2.jar -configfile generatorConfig.xml –overwrite
    pause

    其实就是一个java命令行,里面加的参数都是ShellRunner需要的,加上pause是方便查看输出信息。
    然后修改pom文件,既然最终输出有源文件JAR和编译后的class JAR,所以我们需要增加maven-source-pluginmaven-jar-plugin这两个插件,另外还用到了maven-assembly-plugin插件。这些plugin具体的用法,我就不讲了,我只说下要注意的地方。
    

    注意红色框的内容,表示我将打包的源代码只会是原来的,增加的com.bolo.StartUp是不会包含进去的,而且这也没必要添加进去。
    

    编译之后的打包同样只包含原来的代码,并且一定要在这里指定入口类。classpathPrefix是类目录,为空就是生成在当前目录下。如果写成<classpathPrefix>lib/</classpathPrefix>这样,则表示生成的mybatis-generator-1.3.2.jar会在lib目录下面。
    

    上图descriptor里面的内容表明了assembly.xml的位置,它可以做很多自定义设置。
    

    这里定义的id默认是加到生成的文件名后面的,但我们在上图中设置了<appendAssemblyId>false</appendAssemblyId>,所以,这个all-in-one就不会加到生成的文件名后面了,如果想要这个名字,将false改成true即可。<format>zip</format>表示将生成一个以zip为后缀的压缩包。
    

    我们最终是想把几个文件都放在一个目录下面,所以outputDirectory就不需要再定义其它的名字。通过前面的输出知道,最后只会包含generatorConfig.xmlrun.bat这两个文件,其它的配置文件并不是我们需要的,因此这里需要排除它们。
    另外还有两个fileSet是指定源代码的JAR和编译classJAR,这两个设置和前面类似。
    
    有点补充说明:此例都是以MySQL数据库为例,所以运行是需要mysql的数据库驱动的,但我又不想在输出里面包含这个jar,因此就在generatorConfig.xml文件里面进行了配置,不清楚的可以看看。
    最后的最后,这些我们都做完了,那么就可以打包输出了,使用mvn package或是在Run As -> Maven Build -> Goals里面填写package,点击 Run
    源码下载: mybatis-generator-1.3.2.zip
    本文为菠萝大象原创,如要转载请注明出处。http://www.blogjava.net/bolo
posted on 2015-04-10 14:24 菠萝大象 阅读(12512) 评论(21)  编辑  收藏 所属分类: mybatis-generator

评论:
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三)[未登录] 2015-06-05 11:36 | Eric
你有没有QQ啊,加来交流下,我现在也在修改代码,但是不知道pom里面要怎么写,才不会出错  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-07-22 16:59 | 隔壁小王
大象,我自己写了一个分页插件,使用classpath把插件包加进去,可是还是会提示“org.mybatis.generator.plugins.MysqlPaginationPlugin”,这个肿么办啊?跪谢了  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-07-22 17:20 | 隔壁小王
@隔壁小王
刚刚说错了,是generatorConfig.xml里的classPathEntry  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-07-24 10:55 | 菠萝大象
@隔壁小王
你自定义的插件只需要在配置文件里加上<plugin>标签就可以了,另外分页不都是扩展mybatis的Interceptor接口来实现的么?为什么要在mybatis-generator里写呢?  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-07-24 17:26 | 隔壁小王
@菠萝大象
org.mybatis.generator.plugins.MysqlPaginationPlugin这个插件是我自己写的,不在mgb包里,我用classPathEntry配置好以后还是会报错“Unexpected error while running MyBatis Generator.
Cannot instantiate object of type org.mybatis.generator.plugins.MysqlPaginationPlugin
”,大象可不可以加下我的qq(164286472)请教你一下啊  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-09-29 16:26 | 隔壁王叔
基本看完,收获挺多,但是还没有解决我的问题,我想问的是,自动生成实体类的时候,那个实体类的注释乱码问题怎么破?  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-09-30 10:13 | 菠萝大象
@隔壁王叔
这个地方我写掉了,你要改下org.mybatis.generator.api.MyBatisGenerator这个类的314行,把gjf.getFileEncoding()换成"UTF-8"就好了。我估计是因为我们中文windows系统的原因,如果不改,就会取当前系统的文件格式,而windows默认的文件格式就是ANSI  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-12-16 21:14 | masque
INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.766s
[INFO] Finished at: Wed Dec 16 21:06:13 CST 2015
[INFO] Final Memory: 7M/110M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate (default-cli) on project imonline: ORA-00900: 无效 SQL 语句 -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate (default-cli) on project imonline: ORA-00900: 无效 SQL 语句

at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
at org.codehaus.classworlds.Launcher.main(Launcher.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: org.apache.maven.plugin.MojoExecutionException: ORA-00900: 无效 SQL 语句

at org.mybatis.generator.maven.MyBatisGeneratorMojo.execute(MyBatisGeneratorMojo.java:213)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
... 25 more

你好 我把改动的class覆盖原来的class出现这个错误  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-12-16 21:25 | masque
我下载下来的源码比你的小多了
我再用对比工具看看  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-12-16 22:57 | masque
@masque
不好意思 我想我找到原因了
我链接的是oracle  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-12-17 00:06 | masque
try {
java.sql.Statement statement = databaseMetaData.getConnection().createStatement();
java.sql.ResultSet rs = statement.executeQuery("SELECT * FROM all_tab_comments WHERE TABLE_name = '"+atn.getTableName()+"'");
String remark = "";
while (rs.next()) {
remark = rs.getString("COMMENTS");
}
table.setRemarks(remark);
closeResultSet(rs);
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}

OK获取表注释  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-12-17 12:37 | 菠萝大象
@masque
我这个例子是基于MySQL数据库写的,第一篇就说了的,不过也恭喜你解决问题  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-12-19 15:26 | masque
oracle无法生成字段注释

org.mybatis.generator.internal.db.ConnectionFactory

Connection org.mybatis.generator.internal.db.ConnectionFactory.getConnection(JDBCConnectionConfiguration config) throws SQLException

加上props.put("remarksReporting","true");

就可以生成注释了

希望能帮到更多人  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-12-21 14:15 | 菠萝大象
@masque
感谢分享,给你32个赞  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-12-21 16:42 | coco
@masque
你好,能不能把改好的工具发我一份啊,360846574@qq.com  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-12-21 17:54 | coco
@菠萝大象
能不能把生成oracle修复一下,把生成表注释加进来啊,看masque的方法,自己动手改class好麻烦,再好把addJavaFileComment的自定义注释搞成配置项,这样根据每个人需求配置就好了。谢谢啦  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2015-12-23 12:39 | 菠萝大象
@coco
这篇最下面有下载,直接打包就可以生成工具了,我写这个主要是分享,起一个抛砖引玉的作用,你可以自己动手改一下,再加上现在确实没时间。  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2016-03-15 14:50 | 王小利
classPathEntry 这个具体是在哪里配置的  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2016-06-26 14:42 | 神马技术
Exception in thread "main" java.net.MalformedURLException
at java.net.URL.<init>(URL.java:617)
at java.net.URL.<init>(URL.java:480)
at java.net.URL.<init>(URL.java:429)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:626)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1291)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(XMLEntityManager.java:1258)
at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(XMLDTDScannerImpl.java:260)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1151)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1047)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:960)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:240)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)
at org.mybatis.generator.config.xml.ConfigurationParser.parseConfiguration(ConfigurationParser.java:109)
at org.mybatis.generator.config.xml.ConfigurationParser.parseConfiguration(ConfigurationParser.java:82)
at org.mybatis.generator.config.xml.ConfigurationParser.parseConfiguration(ConfigurationParser.java:74)
at test.test.main(test.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)



我按照你的教程修改了,为什么运行的时候会报错呢?这是什么原有  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2016-08-05 18:00 | 王先森
@神马技术
我和你遇到一样的问题,希望大象帮忙!  回复  更多评论
  
# re: 修改mybatis-generator-1.3.2源码实现自定义代码生成详解(三) 2016-08-08 14:09 | 菠萝大象
@王先森
@神马技术
你们遇到的问题是自己修改代码后,写个测试类无法运行是吗?其实这很简单呐,我把代码贴下。
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<String>();
File configFile = new File(StartUp.class.getResource("/generatorConfig.xml").toURI());
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback shellCallback = new DefaultShellCallback(true);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, shellCallback, warnings);
myBatisGenerator.generate(null);
System.out.println(warnings);
}
因为工程是基于maven构建,generatorConfig.xml是在resources目录下,你们再试试看有没有问题。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: