隨筆-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.aygfsteel.com/bolo
          posted on 2015-04-10 14:24 菠蘿大象 閱讀(16447) 評論(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目錄下,你們再試試看有沒有問題。  回復  更多評論
            
          主站蜘蛛池模板: 新河县| 应用必备| 蒲城县| 叙永县| 梁河县| 中西区| 澄城县| 江山市| 深州市| 汶川县| 郯城县| 墨脱县| 南木林县| 图们市| 共和县| 神木县| 霍邱县| 汤阴县| 贵港市| 富源县| 天祝| 拉孜县| 霍邱县| 清苑县| 德格县| 九江市| 梓潼县| 惠东县| 开封县| 宜黄县| 福州市| 高邑县| 道孚县| 四平市| 突泉县| 准格尔旗| 淮滨县| 云林县| 拜泉县| 武汉市| 湾仔区|