ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示

2013/01/27

astahにクラウディアさんからの癒しを

長時間仕事をしていて疲れたとき、そんなホッと一息つきたくなるようなときでも、仕事が立て込んでいるとそうもいかないので、じゃあ、強制的に割り込んできてもらいましょう。

今回作ったのは、システム設計支援ツールのastahを長時間使用していると、Windows Azure公認キャラクターのクラウディア・窓辺さんが、あなたに優しいお顔と音声で休憩を促してくれるプラグインです。
えぇ、まぁ、それだけです。

astah Nannyプラグイン

4時間くらい仕事をしていると疲れたあなたに優しく声をかけてくれて、断ると1時間後にまた優しく声をかけてきてくれます。
興味をもった奇特な方はGitHubからclone/forkして、メッセージや音声は自分好みにカスタマイズしてくれてかまいません。

※ ホントはastahで操作したファイルや図、モデルの数値や時間を計測してゴニョゴニョしたかったんだけど、途中でAPIが足りないことに気付いて、なぜかこんなものに化けてしまった...。

2010/01/13

1/31, 2/7は福井でHappy coding♪

京都GTUG(Google Technology User Group)、北陸エンジニアグループ、FITEAとで、Google Hackathonを開催することになりました。
テーマはGoogle App Engineです。

「GAEってPython、Javaのどっちが対象?GAEっておいしいの?」という疑問を持たれる方がいるかも知れませんが、GAE/Jの登場でJava VMが動くようになってからは、RubyやPHP、Scalaも動かす事ができるようになったので、言語については特に制限を設けません。

「Hackathon?レベルの高い人たちの集まりかな?そんなの怖いわー。ついてけないよ。」という心配もございません。
Hackathonでは、入門者チームを設ける予定ですし、AppEngine API Expertの山下さん、京都GTUGスタッフの皆さん、チームメイト、力を貸してくれる方々が沢山いらっしゃいます。また、1/31(日)には事前勉強会も行います。
学生や初心者の方も安心してご参加ください。

Google App Engineを詳しく知りたい方はこちらに目を通しておくと良いと思います。
もちろん事前勉強会では「Google App Engineってなんぞや?」から扱うので、一読するのは勉強会後でもかまいません。

Google App Engine デベロッパーガイド
http://code.google.com/intl/ja/appengine/docs/

1/31(日)には、GAEの解説、グループ分け、アイデア出し(Ideathon)、午後にはHackathonに向けたGAEの勉強会を行います。
2/7(日)には、丸一日かけてみんなでガリガリ開発をします。

タイムスケジュールや詳細はこちらをご覧ください。
http://fitea.org/?p=115

参加される方はこちらの登録フォームから申し込みをお願いします。
http://bit.ly/611cYf

=================================================================
『Google Hackathon for GAE in 福井』 1/31(日) & 2/7(日)

■イベント概要
 Google App Engine(GAE)をテーマに技術者が集ってその場でアプリ
ケーションやサービスを作り、最後にプレゼンをするイベントです。
 App Engine API Expertの山下大介氏をお迎えします。
 GAE初心者向けの勉強会も同時開催しますので、学生や初心者の方も
安心してお気軽にご参加ください。
■日時:2010年1月31日午前及び2月7日全日
 ※2日構成で、1/31と2/7両日ともの参加が必要です。
 ※1/31の午後にはGAE勉強会が開催されます(無料)
■定員:最大30名(事前登録制)
■参加費:無料
 ※但し、ランチ代は各自ご負担となります(出前又は弁当等)。
■会場:めがね会館7F 株式会社jig.jp様 会議室
■主催・運営:京都GTUG、FITEA、北陸エンジニアグループ
■会場協力:株式会社jig.jp 様
=================================================================

個人的には、GAE側でHTTPサービスを提供するようにしてUIを Flex / Flash や GWT、HTML5 関連APIゴリゴリで作りたいなぁ。
デザイナさん、チームに欲しいなぁ。

Hackathonと言えば、この辺は要チェックですね。
Hackathon in a Box - http://sites.google.com/site/devreljp/Home/hackathon-in-a-box
Hackathon を快適にする Tips - http://googlejapan.blogspot.com/2009/03/hackathon-tips.html

2009/04/10

Google App EngineでH2 Database Engine使ってみた

巷で話題になっているけど、Google App EngineでJavaがサポートされたことで、GroobyやJRuby、Scalaも動かせるようになりました。
Googleがそんなステキなことをしてくれていた陰で、H2はH2 Database Engine 1.1.111をリリースしています。

その変更履歴にこんな1文が。
Version 1.1.111 (2009-04-10)
* In-memory databases can now run inside the Google App Engine.
Google App Engineで、DBにはGoogle App Engine Datastoreを使わないといけなかった(?)んだけど、JavaサポートのおかげでRDBのH2(in-memory)も使えるようになっていたみたい。
ということで、さっそくお約束のHello Worldを試してみました。

まずはweb.xmlにDBの起動/接続設定とHelloWorldServletの定義を追記します。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
<listener>
<listener-class>org.h2.server.web.DbStarter</listener-class>
</listener>

<context-param>
<param-name>db.url</param-name>
<param-value>jdbc:h2:mem:HelloWorld</param-value>
</context-param>
<context-param>
<param-name>db.user</param-name>
<param-value>sa</param-value>
</context-param>
<context-param>
<param-name>db.password</param-name>
<param-value>sa</param-value>
</context-param>

<servlet>
<servlet-name>helloworld</servlet-name>
<servlet-class>net.air_life.gae.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>


JDBC URLにjdbc:h2:mem:というように、memを指定してメモリオンリーデータベースとして動作するようにします。
memを指定しないとDBファイルを作ろうとして、下記のような例外が発生します。
org.h2.jdbc.JdbcSQLException: General error: java.security.AccessControlException: access denied (java.io.FilePermission /HelloWorld.data.db read) [50000-111]
次にDBにアクセスするHelloWorldServletを作ります。
package net.air_life.gae;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

import javax.servlet.http.*;

@SuppressWarnings("serial")
public class HelloWorldServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");

try {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:mem:HelloWorld", "sa", "sa");
ResultSet rs = conn.createStatement().executeQuery("select 'Hello World on Google App Engine for Java'");
while (rs.next()) {
resp.getWriter().print(rs.getString(1));
}
rs.close();
conn.close();
} catch (Exception e) {
resp.getWriter().print(e.getMessage());
}
}
}
あとはデプロイして、アクセスするとHello Worldが表示されます。
だいぶ適当ですが、まずはこれくらいに。

2009/03/19

Tomcat 6.0.18のcp932問題

Windows Vista環境でApache Tomcat 6.0.18をダウンロード、インストール、実行とすると次のようなエラーで起動できない現象に遭遇した(だいぶ前からだけど)。

2009/03/16 16:52:18 org.apache.catalina.core.AprLifecycleListener init
情報: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre6\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\pcdNavi\bin;
2009/03/16 16:52:20 org.apache.coyote.http11.Http11Protocol init
情報: Coyote HTTP/1.1を http-8080 で初期化します
2009/03/16 16:52:20 org.apache.catalina.startup.Catalina load
情報: Initialization processed in 3364 ms
2009/03/16 16:52:21 org.apache.naming.NamingContext lookup
警告: 参照の解決中に予測しない例外が発生しました
java.io.UnsupportedEncodingException: cp932
at sun.nio.cs.StreamDecoder.forInputStreamReader(Unknown Source)
at java.io.InputStreamReader.(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.createReader(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.setEncoding(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanXMLDeclOrTextDecl(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$XMLDeclDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1663)
at org.apache.catalina.users.MemoryUserDatabase.open(MemoryUserDatabase.java:402)
at org.apache.catalina.users.MemoryUserDatabaseFactory.getObjectInstance(MemoryUserDatabaseFactory.java:103)
at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:140)
at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
at org.apache.naming.NamingContext.lookup(NamingContext.java:793)
at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
at org.apache.naming.NamingContextBindingsEnumeration.nextElementInternal(NamingContextBindingsEnumeration.java:113)
at org.apache.naming.NamingContextBindingsEnumeration.next(NamingContextBindingsEnumeration.java:71)
at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:137)
at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:109)
at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.lifecycleEvent(GlobalResourcesLifecycleListener.java:81)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:703)
at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2009/03/16 16:52:21 org.apache.catalina.mbeans.GlobalResourcesLifecycleListener createMBeans
致命的: Exception processing Global JNDI Resources
javax.naming.NamingException: cp932
at org.apache.naming.NamingContext.lookup(NamingContext.java:805)
at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
at org.apache.naming.NamingContextBindingsEnumeration.nextElementInternal(NamingContextBindingsEnumeration.java:113)
at org.apache.naming.NamingContextBindingsEnumeration.next(NamingContextBindingsEnumeration.java:71)
at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:137)
at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:109)
at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.lifecycleEvent(GlobalResourcesLifecycleListener.java:81)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:703)
at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2009/03/16 16:52:21 org.apache.catalina.core.StandardService start
情報: サービス Catalina を起動します
2009/03/16 16:52:21 org.apache.catalina.core.StandardEngine start
情報: Starting Servlet Engine: Apache Tomcat/6.0.18
2009/03/16 16:52:21 org.apache.naming.NamingContext lookup
警告: 参照の解決中に予測しない例外が発生しました
java.io.UnsupportedEncodingException: cp932
at sun.nio.cs.StreamDecoder.forInputStreamReader(Unknown Source)
at java.io.InputStreamReader.(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.createReader(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.setEncoding(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanXMLDeclOrTextDecl(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$XMLDeclDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1663)
at org.apache.catalina.users.MemoryUserDatabase.open(MemoryUserDatabase.java:402)
at org.apache.catalina.users.MemoryUserDatabaseFactory.getObjectInstance(MemoryUserDatabaseFactory.java:103)
at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:140)
at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
at org.apache.naming.NamingContext.lookup(NamingContext.java:793)
at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
at org.apache.catalina.realm.UserDatabaseRealm.start(UserDatabaseRealm.java:253)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1037)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2009/03/16 16:52:21 org.apache.catalina.realm.UserDatabaseRealm start
致命的: キー UserDatabase でユーザデータベースを検索中の例外です
javax.naming.NamingException: cp932
at org.apache.naming.NamingContext.lookup(NamingContext.java:805)
at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
at org.apache.catalina.realm.UserDatabaseRealm.start(UserDatabaseRealm.java:253)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1037)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2009/03/16 16:52:21 org.apache.catalina.startup.Catalina start
致命的: Catalina.start:
LifecycleException: キー UserDatabase でユーザデータベースコンポーネントが見つかりません
at org.apache.catalina.realm.UserDatabaseRealm.start(UserDatabaseRealm.java:261)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1037)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2009/03/16 16:52:21 org.apache.catalina.startup.Catalina start
情報: Server startup in 1109 ms

原因はTOMCAT_HOME/conf/tomcat-users.xmlファイルでフォーマットにcp932が指定されているせい。
なぜUTF-8じゃない??

ちなみに、UTF-8に修正すると普通に動く。

2009/01/16

Adobe AIRとJavaをMerapiで連携

以前、無理矢理AIRからソケット接続でJavaと連携させたことあったけど、そんな必要ないのか!?

Building a Bridge between Adobe AIR and Java

http://www.merapiproject.net/

ムラピ火山(メラピって発音かな)のムラピ?
AIRとJava間で共通のブリッジを通して、メッセージをやり取りする。
今のところαリリースで、ダウンロードにはユーザー登録が必要。

※図とソースコードはHow Merapi Worksより引用
Sending a message from ActionScript:

var message : Message = new Message();
message.data = "Hello from Merapi Flex.";
message.type = "Reply";
Bridge.instance.sendMessage( message );


Sending a message from Java:

Bridge bridge = Bridge.getInstance();

Message message = new Message();
message.setData("Hello from Merapi Java.");
bridge.sendMessage(message);


Receiving a message in Flex:

<merapi:BridgeInstance
id="bridge" result="handleResult(event)" />

<mx:Script>
<![CDATA[
private function handleResult( event : ResultEvent ) : void
{
var message : IMessage = event.result as IMessage;


Receiving a message in Java:

Bridge.getInstance().registerMessageHandler("Reply", messageHandlerInstance );

public void handleMessage( IMessage message )
{
System.out.println( message.getData() );
}
Merapiを使って、AIRからレゴマインドストームロボット(Lego Mindstorm Robot)を操作してる!?
(lego Mindstorm APIを使うJavaと連携してるっぽい)


※追記(2009/02/27)
MerapiがついにInfoQでも紹介されました。
Merapiプロジェクト:AIRおよびJavaのブリッジ
http://www.infoq.com/jp/news/2009/02/merapi-project

2009/01/13

BlazeDSとGuiceの連携

Google Codeにguice-blazedsというプロジェクトを見つけたので、ちょっと試してみました。

guice-blazeds(Guice injection for BlazeDS)
http://code.google.com/p/guice-blazeds/

ソースコードを覗いてみたら、とってもシンプル。2クラスだけしかありません。
uk.co.chasetechnology.guice_blazeds.AbstractGuiceFactory.java
uk.co.chasetechnology.guice_blazeds.GuiceFactoryInstance.java

BlazeDS用のFactoryクラスのベースを提供してくれるだけのようです。

guice-blazedsアプリの作成手順としては、まず、リモートサービスを定義。
package net.air_life.guice_blazeds.service;

public class HelloWorldService {
public String sayHello() {
return "Hello World.";
}
}
次にBlazeDSで使用するFactoryを作るために、guice-blazedsが提供してくれてるAbstractGuiceFactoryのサブクラスを定義。
package net.air_life.guice_blazeds.factory;

import uk.co.chasetechnology.guice_blazeds.AbstractGuiceFactory;
import com.google.inject.Guice;
import com.google.inject.Injector;

public class GuiceFactory extends AbstractGuiceFactory {
private Injector injector;

public GuiceFactory() {
injector = Guice.createInjector();
}

public <T> T createInjectedObject(Class<T> clazz) {
return injector.getInstance(clazz);
}
}
あとはBlazeDS側の設定services-config.xmlに上記のFactoryを追加。
<services-config>
....
<factories>
<factory id="guice" class="net.air_life.guice_blazeds.factory.GuiceFactory"/>
</factories>
</services-config>
最後にremoting-config.xmlにHelloWorldServiceを追加。

....
<destination id="helloWorld">
<properties>
<source>net.air_life.guice_blazeds.service.HelloWorldService</source>
<factory>guice</factory>
</properties>
</destination>
あとはクライアント側からhelloWorld宛にサービス呼び出しをかけると、HelloWorldという文字列を受け取れます。

2008/12/22

Spring BlazeDS IntegrationもApache Ivy使ってる

Spring BlazeDS IntegrationもApache Ivy使ってるみたい。
アーカイブを展開したらIvy関連のファイルが見当たった。

ライブラリの依存関係に関する面倒くささを解消したいだけであれば、MavenよりIvyだよなと思う。

2008/08/19

RemoteObjectサービスの負荷テスト - BlazeDS

JMeter 2.3.2からAMFのキャプチャが出来るようになりました。

JMeter - Changes
http://jakarta.apache.org/jmeter/changes.html
Improvements
The Proxy server can now record binary requests. By default the content types application/x-amf and application/x-java-serialized-object will be treated as binary and saved in a file. To change the content types, update the property proxy.binary.types .

これでJava + Tomcat + Seasar2 +S2BlazeDS環境のRemoteObjectサービスについて負荷テストができます。
試したところ結構やりづらいですけど・・・。

2008/08/07

Migrate4j - RailsのMigrationをJavaで

Migrate4j
http://migrate4j.sourceforge.net/

DBのデータを、組み込むプロダクトのバージョンに合わせて移行する方法を検討する、という状況になったので、イイやり方やツールを調べてみたところ、RailsのMigration、Gearshift(GearsのSQLite用)、Migrate4jなどが見つかりました。

Migrate4jはプロダクトの特性に合っているため、これに的を絞って調査開始です。
Migrate4jはRailsのMigrationをJavaでも実現しようというツールであり、Rubyスクリプトではなく、Javaプログラムでデータベースのスキーマ定義のバージョン管理をします。

ちなみにバージョンは0.04とまだまだ若いようです。
ライセンスはGPLになっています。

DBのサーポート状況
http://migrate4j.sourceforge.net/status.html

ステータスを見るとH2とMySqlがイイ感じでPASSしてました。
ソースコードやテストコードを覗いたところ興味が湧いてきたので、もうちょっと深く調査を続行しようと思います。