TECHBLOGスキルブログ

MyBatis GeneratorにおけるSQLServer Driverの取り扱いについて

2016.03.12

こんにちは、ユニトラストの大島です。
今回は私がブログを担当させて頂きます。

MyBatis Generatorをサクッと使用しようと思ったら物凄くハマった話。
最終的には凄く単純な話だったため、教訓として残そうと思います。

MyBatis Generatorを使おうと思ったキッカケ

MyBatisを使用する事になり、調査をしていると自動生成ツールであるMyBatis Generatorをカスタマイズ出来ると言う事がわかった。
自動生成ファイルで出力される内容はすでにわかっていて、それでは対応出来ない事もわかっていた。(なんでかは後述)
そこでMyBatis Generatorをカスタマイズして出力内容に必要な情報を追加しようと思ったのがキッカケ。

今回使用した環境

以下、各種バージョンになります。参考までに。

  • Windows 7 SP1
  • Spring Tool Suite 3.7.3
  • Java 1.8
  • Maven 3.3.9
  • mybatis-generator-maven-plugin 1.3.2
  • SQLServer Driver 4.2
  • SQLServer 2014 Express
  • MyBatis Generator使用する

    MyBatis Generatorの使用方法を記載しているサイトは沢山あり、
    だいたいのサイトでは「mavenプロジェクトでプラグインとしてpom.xmlに書けば動く」と記載されていた。
    以下の通り。

    <build>
    	<plugins>
    		<plugin>
    			<groupId>org.mybatis.generator</groupId>
    			<artifactId>mybatis-generator-maven-plugin</artifactId>
    			<version>1.3.2</version>
    		</plugin>
    	</plugins>
    </build>

    動かない。何故?

    予定では10分で自動生成をし、その後カスタマイズのコードを書いていくつもりだった。

    しかし、動かない。なぜだ??

    エラーが出ていたのでよく見てみる。

    Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate (default-cli) on project MyBatisGenerator: Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate failed: Exception getting JDBC Driver: com.microsoft.sqlserver.jdbc.SQLServerDriver

    お?ドライバーが見つからないと?

    generatorConfig.xmlの確認とpom.xmlへの追記

    とりあえずgeneratorConfig.xmlを確認。

    <generatorConfiguration>
    	<context id="context1">
    		<commentGenerator>
    			<property name="suppressDate" value="true" />
    		</commentGenerator>
    		<jdbcConnection driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver"
    			connectionURL="jdbc:sqlserver://XXXXXXXXX:NNNN;databaseName=[Database_Name]"
    			userId="*****" password="*****" />
    		<javaModelGenerator targetPackage="jp.co.model.entity"
    			targetProject="C:\workspace\MyBatisGenerator\src\main\java\" />
    		<sqlMapGenerator targetPackage="jp.co.sigel.start.model.mapper"
    			targetProject="C:\workspace\MyBatisGenerator\src\main\java\" />
    		<javaClientGenerator targetPackage="jp.co.sigel.start.model.mapper"
    			targetProject="C:\workspace\MyBatisGenerator\src\main\resources\"
    			type="XMLMAPPER" />
    		<table schema="******" tableName="%"></table>
    	</context>
    </generatorConfiguration>

    問題無さそうなのでpom.xmlにdependencyでSQLServerDriverのjarを入れればいいだろうと思い、以下の様に追記。

    <build>
    	<plugins>
    		<plugin>
    			<groupId>org.mybatis.generator</groupId>
    			<artifactId>mybatis-generator-maven-plugin</artifactId>
    			<version>1.3.2</version>
    		</plugin>
    	</plugins>
    </build>
    
    <dependencies>
    	<dependency>
    		<groupId>com.microsoft.sqlserver.jdbc</groupId>
    		<artifactId>sqljdbc4</artifactId>
    		<version>4.2</version>
    	</dependency>
    </dependencies>

    よし。これで動くだろう!
    起動・・・・

    動かない!!!おなじエラー!!

    MSの罠?

    なんで動かないのか色々と調べてみると
    「MSが提供するsqljdbcはライセンスの関係なのか、mavenでうまい事やってくれない」
    との記載を発見する。
    理由をちゃんと知りたかったのだけど、調べても見つからず。知っている人が居たら教えて下さい。
    その場合、mvnコマンドでインストールしてあげるとmaven側で参照出来るんだとか。

    コマンドプロンプトを立ち上げてmvnコマンドを叩いてみた所、反応無し。
    EclipseでMavenが使えるなら使えそうなのになー。Pathが通れば使えるんだろうか。

    mvnインストール&コマンド実行

    ちょっと急ぎだったのでmvnコマンドを最速で使用出来るようにします。
    ココからzipファイルをダウンロードし、解凍して任意の場所に置く。
    ②環境変数のPathに解凍したフォルダ配下のbinフォルダまでのフルパスを追加。(私の場合はc:\maven\bin)
    ③環境変数のJAVA_HOMEがあるか確認。無ければ追加。JAVA_HOMEはbinを含めない。(私の場合はc:\Java\jdk1.8.0_73)

    コマンドプロンプトを立ち上げて、

    mvn --version

    を叩いてみてバージョンが表示されてばコマンド利用可能。

    mvn installコマンドを叩いてみます。

    mvn install:install-file -DgroupId=com.microsoft.sqlserver.jdbc -DartifactId=sqljdbc4 -Dversion=4.2 -Dpackaging=jar -DgeneratePom=true -Dfile="C:\Users\[user_name]\.m2\repository\sqljdbc42.jar"

    以下の結果が表示されました。うまくインストール出来たみたいです。

    [INFO] Scanning for projects...
    [INFO]
    [INFO] ------------------------------------------------------------------------
    [INFO] Building Maven Stub Project (No POM) 1
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] --- maven-install-plugin:2.4:install-file (default-cli) @ standalone-pom ---
    [INFO] Installing C:\Users\[user_name]\.m2\repository\sqljdbc42.jar to C:\Users\[user_name]\.m2\repository\com\microsoft\sqlserver\jdbc\sqljdbc4\4.2\sqljd
    bc4-4.2.jar
    [INFO] Installing C:\Users\PARTNE~1\AppData\Local\Temp\mvninstall5367997380168745330.pom to C:\Users\[user_name]\.m2\repository\com\microsoft\sqlserver\
    jdbc\sqljdbc4\4.2\sqljdbc4-4.2.pom
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 0.619 s
    [INFO] Finished at: 2016-03-07T21:02:09+09:00
    [INFO] Final Memory: 6M/123M
    [INFO] ------------------------------------------------------------------------

    これでmavenが通るはず!
    起動・・・

    動かない!!!おなじエラー!!もー!!(怒)

    これも理由をかなり探してみたのですが、わかりませんでした。
    分かる方居たら教えて下さい。
    やっている事は間違っていないと思いますし、実際にこれで動いている人も居るはず。

    灯台下暗し

    何故か私の環境ではDriverを認識してくれず、この後もプロジェクトの設定でjarにパスを通してみたり、
    クラスパス上にjarを置いてみたり色々試行錯誤をしてみたのですが、一向に動かず。
    埒が明かないなーと思いつつ、公式リファレンスをもう一度よく読みなおす。
    今までDB接続部分とファイル出力部分ばかりに目を凝らしていたのですが、最初から1行1行よーく見てみたら、

    <classPathEntry location="" />

    もしや・・・
    generatorConfig.xmlを以下の様に書き換えました。

    <generatorConfiguration>
        <classPathEntry location="C:\Users\[user_name]\.m2\repository\sqljdbc42.jar" /> 
        <context id="context1">
            <commentGenerator>
                <property name="suppressDate" value="true" />
            </commentGenerator>
            <jdbcConnection driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver"
                connectionURL="jdbc:sqlserver://XXXXXXXXX:NNNN;databaseName=[Database_Name]"
                userId="*****" password="*****" />
            <javaModelGenerator targetPackage="jp.co.model.entity"
                targetProject="C:\workspace\MyBatisGenerator\src\main\java\" />
            <sqlMapGenerator targetPackage="jp.co.sigel.start.model.mapper"
                targetProject="C:\workspace\MyBatisGenerator\src\main\java\" />
            <javaClientGenerator targetPackage="jp.co.sigel.start.model.mapper"
                targetProject="C:\workspace\MyBatisGenerator\src\main\resources\"
                type="XMLMAPPER" />
            <table schema="******" tableName="%"></table>
        </context>
    </generatorConfiguration>

    起動・・・

    [INFO] Scanning for projects...
    [INFO]                                                                         
    [INFO] ------------------------------------------------------------------------
    [INFO] Building MyBatisGenerator 0.0.1-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO] 
    [INFO] --- mybatis-generator-maven-plugin:1.3.2:generate (default-cli) @ MyBatisGenerator ---
    log4j:WARN No appenders could be found for logger (org.mybatis.generator.internal.db.DatabaseIntrospector).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 8.700 s
    [INFO] Finished at: 2016-03-07T21:06:13+09:00
    [INFO] Final Memory: 11M/379M
    [INFO] ------------------------------------------------------------------------

    おおおお!!動いた!

    無事に生成されてました!(テーブル名の関係などでファイルは公開しませんが)

    教訓

  • MS製品は特殊な場合がある
  • 個人サイトは有用な情報が多々あるが、鵜呑みにしない
  • 公式リファレンスは穴が空くほどしっかり読む
  • 英語でもくじけない
  • これを思い知らさせた1日でした。
    みなさんもリファレンスはちゃんと読みましょう。

    後述

    実はantで動かすと簡単に起動するのは知っていました。
    前の週にantで動かしていたので。
    私の端末はWindows8.1だったのですが、あまりにもエクスプローラーの調子が悪く(ローカルのフォルダ1つ開けるだけで固まる)
    週末にWindows7に入れ替えて頂いていました。
    MyBatis Generatorを利用するプロジェクトのバックアップを取るのを忘れたために、作り直しとなったのですが、
    最速を目指してMavenでやってみる事にしました。
    結果的には時間が掛かってしまいましたが、勉強になる事が多かったです。
    ちなみにantだとこんな具合にant_build.xmlを作成して動かすと動きます。
    ※mybatis-generator-core.jarとsqljdbc4.jarをlib配下に置いておく必要があります。

    <?xml version="1.0" encoding="utf-8"?>
    <project default="generate" basedir=".">
      <property name="generated.source.dir" value="${basedir}" />
      <path id="class.path">
        <fileset dir="lib" includes="*.jar" />
        <dirset dir="bin" />
      </path>
       <target name="generate" description="Generate the files" depends="init">
       <taskdef name="mbgenerator" classname="org.mybatis.generator.ant.GeneratorAntTask" classpathref="class.path" />
        <mbgenerator overwrite="true" configfile="resource/generatorConfig.xml" verbose="false"></mbgenerator>
      </target>
     </project>
    

    以上になります。

                  

    OTHER CONTENTSその他のコンテンツ

    UNITRUST会社を知る

    • 私たちについて

    • 企業情報

    SERVICE事業内容

    • システム開発

    • 自社サービス

    CONTACT
    お問い合わせ

    あなたの「想い」に挑戦します。

    どうぞお気軽にお問い合わせください。

    受付時間:平日9:00〜18:00 日・祝日・弊社指定休業日は除く

    お問い合わせ