Seasar2によるサンプルアプリを作成してみます。
今回はDoltengを使います。
Java8にSeasar2は対応していない部分があるので最初のDoltengとs2jdbc-gen-buildを使うときだけ
Java7で進めます。
最後にJava8にします(その代わり以降Doltengが使えなくなります)。
1.前準備
JDKのインストール(Java8対応)
http://www.oracle.com/technetwork/java/javase/downloads/index.html
あたりからJava8(JDK8)のをインストールします
Eclipseのインストール
http://mergedoc.osdn.jp/
eclipse 4.5 Marsを推奨します。
Cドライブ直下に移動して解凍します。
eclipseというフォルダができています。
Tomcaのインストール
不要です。Eclipse付属のを使います。
もし別途Tomcatをインストールしたい場合は、
お好きなTomcatのバージョンのもの(Tomcat8あたりがおすすめ)をインストールしましょう。
その際mysql-connector-javaをTomcatのlib下に置き忘れないようにしましょう。
Tomcat8のディレクトリにmysql-connectorを置きます。
https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.39
mysql-connector-java-5.1.39
をダウンロードして
C:\Program Files\Apache Software Foundation\Tomcat 8.0\lib
に置きます。
MySQLのインストール
バージョンは何でもよいのですがここからダウンロードしましょう!
http://dev.mysql.com/downloads/mysql/
versionは5.7が良いと思います。
MySQLのユーザ作成
コマンドプロンプトなどを立ち上げて
> mysql -uroot -p > GRANT ALL PRIVILEGES ON *.* TO appuser@localhost IDENTIFIED BY 'password'; > SELECT Host, User FROM mysql.user;
を実行します。
Seasar2 pluginを入れる
以降の説明で基本的に英語表記のまま書きますが、きっと日本語環境だとあれれ?と思うところもあると思うので()内に日本語表記を併記します。
eclipseを立ち上げます。
Welcomeページが出ますが、無視して閉じます。
Help(ヘルプ) > New Install Software(新規ソフトウェアのインストール)から
Addボタンを押して
Name(名前): Seasar2 URL(ロケーション): http://eclipse.seasar.org/updates/3.3/
でOKを押します。
Kijimuna Resourcesynchronizer S2JUnit4Plugin SAStrutuPlugin
を選びNextを押します。あとは指示に従いインストールします。
最後にeclipseの再起動があります。
Seasar2アプリを作成
プロジェクトのセットアップ
Eclipseを立ち上げて 右クリック > New(新規作成) > Project(プロジェクト) > Dolteng Project とします。 次にプロジェクト名とルートパッケージ名ですが何でもよいです。
Project Name(プロジェクト名): myseasar2 Root Package Name(ルートパッケージ名): myseasar2
としておきましょう。
JRE Container(JREコンテナー)
Use an execution environment JRE(実行環境JREの使用): JavaSE-1.7
※JavaSE-1.8だとダメです。
Project Facet Settings (プロジェクトファセット設定)
Presentation: SAStruts Persistence: S2JDBC Server Management: WTP(Servlet 2.5)
を選んでFinish(完了)を押します。 そうするとすでにひな形が完成しています。
MySQL 関連する設定ファイルの書換え
Eclipseのworkspace\myseasar2001\src\resoruces\dataにある
demo.sqlを開きます。
最初の2行はMySQLでは通用しないので消して次の3行を追加します。
USE TEST; CREATE TABLE EMP(ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, EMP_NO INTEGER NOT NULL ,EMP_NAME VARCHAR(20),MGR_ID INTEGER,HIREDATE DATE,SAL NUMERIC(7,2),DEPT_ID INTEGER, VERSION_NO INTEGER); CREATE TABLE DEPT(ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, DEPT_NO INTEGER NOT NULL,DEPT_NAME VARCHAR(20),LOC VARCHAR(20), VERSION_NO INTEGER);
MySQLワークベンチを立ち上げてそのSQLを実行します。
次に
src\main\resources\jdbc.dicon
を書き換えます。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components namespace="jdbc"> <include path="jta.dicon" /> <!-- ここから --> <!-- MySQL --> <component name="xaDataSource" class="org.seasar.extension.dbcp.impl.XADataSourceImpl"> <property name="driverClassName"> "com.mysql.jdbc.Driver" </property> <property name="URL"> "jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC" </property> <property name="user">"appuser"</property> <property name="password">"password"</property> </component> <!-- ここまで --> <component name="connectionPool" class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl"> <property name="timeout">600</property> <property name="maxPoolSize">10</property> <property name="allowLocalTx">true</property> <destroyMethod name="close" /> </component> <component name="DataSource" class="org.seasar.extension.dbcp.impl.DataSourceImpl" /> </components>
test?以降がないと環境によっては
java.sql.SQLException: The server timezone value 'UTC' is unrecognized or represents more than one timezone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc timezone value if you want to utilize timezone support.
のようなエラーが出ます 別の回避策があるかもしれません。
src\main\resources\s2jdbc.dicon
も書き換えます。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include path="jdbc.dicon" /> <include path="s2jdbc-internal.dicon" /> <component name="jdbcManager" class="org.seasar.extension.jdbc.manager.JdbcManagerImpl"> <property name="maxRows">0</property> <property name="fetchSize">0</property> <property name="queryTimeout">0</property> <property name="dialect">mysqlDialect</property> </component> </components>
pom.xmlの設定を変更します
※mysql-connector-javaのバージョン6以上だと動作しないものがあります。 そのため5.1.39にしておきます。 さらにproject直下にあるpom.xmlを書き換えます
<!-- <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.0.69</version> </dependency> --> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency>
さらに問題のあるjavassistを変えておきます(Java8対応)
s2-frameworkが古いバージョンのjavassistに依存しているのでexclusionsを指定します。
<dependency> <groupId>org.seasar.container</groupId> <artifactId>s2-framework</artifactId> <version>2.4.46</version> <!-- 追加 --> <exclusions> <exclusion> <artifactId>javassist</artifactId> <groupId>jboss</groupId> </exclusion> </exclusions> <!-- 追加 --> </dependency> ... <!-- <dependency> <groupId>jboss</groupId> <artifactId>javassist</artifactId> <version>3.4.ga</version> </dependency> --> <!-- https://mvnrepository.com/artifact/org.javassist/javassist --> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.22.0-CR1</version> </dependency>
これを変えておかないと
500 - java.lang.RuntimeException: java.io.IOException: invalid constant type: 18
というエラーがでます。
ポイントは2つ
s2-framework
から古いjavassistをexclusionの指定。
また古いjavassistを新しいバージョンにします。
s2jdbc-gen-build.xmlの実行
mysql-connector-javaのVersionが6以上だとs2jdbc-gen-build.xmlが動きません しかし今は1.7にしてあるので大丈夫です。
Maven Repository: mysql » mysql-connector-java » 5.1.39
からmysql-connector-javaをダウンロードして
mysql-connector-java-5.1.39をプロジェクトのlib下に置いて(エクスプローラーからコピー&Eclipse上でペーストでOKです)
lib下をリフレッシュ
プロジェクトトップで右クリック > Java Build Path(ビルドパス) > Libraries(ライブラリー)からJARの追加をする。
これをしないとビルドパスが通ってないので次に行うant buildが失敗します。
s2jdbc-gen-build.xml
の1行目
gen-ddlをgen-entityに変えて実行します。
s2jdbc-gen-build.xml
<project name="myseasar2-s2jdbc-gen" default="gen-entity" basedir=".">
右クリック Run As(実行) > External Tools Configurations(外部ツールの構成)
ダイアログの左側のAntビルドをダブルクリック
Target(ターゲット)タブでgen-entityになっているのを確認
Common(共通)タブでEncodingでUTF-8
JREタブでここだけJava7にします
Runを押します。
正常に実行できればクラスなどが自動生成されています。
備考
Java6だとエラーが発生します。
また、mysql-connector-javaのVersionが6以上だとs2jdbc-gen-build.xmlが動かない
mysql - mybatis generator "Column name pattern can not be NULL or empty" - Stack Overflow
Mavenのビルドをします
右クリック > 実行 > maven install
を実行します。
実行できない場合はMavenプロジェクトになっているかどうか確認してください。
Tomcatの設定
Server View(サーバー)でサーバーを新規作成します。
右クリック > 新規作成
Tomcat v8.0 Serverを選択しNextを押します。
サーバ・ランタイム環境はJava8でよいです。
Add and Removeで
myseasar2があるので追加します。
Finishを押すとサーバーが作成されます。
実行します
Server ViewからStartを押します。
http://localhost:8080/myseasar2/
と押すとHello worldと出ていると思います。
Scaffoldを利用します
Java7じゃないとできません
Window(ウィンドウ) > View(ビューの表示) > Dolteng > Database View(データベースビュー)
を出します。
Database Viewでs2jdbc.diconをダブルクリックすると
DeptとEmpが出てくるのでそれぞれを右クリックして
Generate Scaffold Application(Scaffold アプリケーションの作成)を押します。
プロジェクトをリフレッシュするとviewなどが自動生成されています。
ソースコードを書き換えます。
src/main/webapp/WEB-INF/view/index.jsp
を書き換えます。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>トップページ</title> </head> <body> <s:link href="dept">dept</s:link> <s:link href="emp">emp</s:link> </body> </html>
再びブラウザを立ち上げて実行します。
リロードしましょう http://localhost:8080/myseasar2/
Java8化します
サーバを停止し、
プロジェクトを右クリック > Javaコンパイラー
Javaビルドパス上の実行環境JavaSE-1.7から準拠を使用のチェックを外し、コンパイラー準拠レベルを1.8にします。
適用を押します。
プロジェクト・ファセットを選び
Javaの部分の1.7を1.8に変更します。
以上で終わりです。
その他
なんかいろいろいじってたらサーバが立ち上がらない
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component
というエラーが出る
過去の設定のごみが残っている可能性が高いので、手っ取り早いのはサーバービューから
新規にサーバを作成してモジュールを追加して実行する
それが嫌な場合はモジュールを除去して保存して消す。
追加しなおしてtomcatワークディレクトリをクリーン&通常のクリーン
をする。
Java8にしたらエラーが…
Java8にしただけでは起きずJava8の特有の機能を使ったときに発生します。
500 - java.lang.RuntimeException: java.io.IOException: invalid constant type: 18
これが出た場合はjavassistを入れ替えましょう。対応方法はこのページに書いています。
また、これを対応した後古いjavassistが残っちゃってるのでクリーンしましょう。
私が対応したときは上記のようにごみが残っていたのでeclipse上のサーバーを作り直しました。