埋め込みGlassfishは過去に何回か書いてるが、実は3.0の初期からあったやつから大幅に改良されてる。ただ、Glassfishのページからたどり着くのができないくさいけど。
クラス名とか全部別物。改良というより一から作ったくさい。その代わり大幅にパワーアップしすぎ。
サンプルコード見てもらえばわかるはず。インポートも含めてまるごと。
サンプルコード
package glassfishtest; import java.awt.Desktop; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.Scanner; import org.glassfish.embeddable.Deployer; import org.glassfish.embeddable.GlassFish; import org.glassfish.embeddable.GlassFishException; import org.glassfish.embeddable.GlassFishProperties; import org.glassfish.embeddable.GlassFishRuntime; import org.glassfish.embeddable.archive.ScatteredArchive; public class RunGlassfish { public static void main(String[] args) throws GlassFishException, IOException, URISyntaxException { String contextName = "hoge"; //環境設定 GlassFishProperties props = new GlassFishProperties(); props.setPort("http-listener", 8080); //GlassfishServer起動 long start = System.nanoTime(); GlassFish glassFish = GlassFishRuntime.bootstrap().newGlassFish(props); glassFish.start(); long end = System.nanoTime(); System.out.printf("起動時間:%,dms%n", (end - start) / 1000 / 1000); //デプロイ File webRoot = new File("webContent");//Webコンテンツのルート File classRoot = new File("build", "classes");//クラスパスルート Deployer deployer = glassFish.getDeployer(); ScatteredArchive archive = new ScatteredArchive(contextName, ScatteredArchive.Type.WAR, webRoot); archive.addClassPath(classRoot);//クラスパス追加 //archive.addClassPath(new File("hoge.jar"));//適当なライブラリがあればjarも追加可能 deployer.deploy(archive.toURI()); //ブラウザ起動 Desktop.getDesktop().browse(new URI("http://localhost:8080/"+contextName+"/")); //コンソールでEnterおすまでブロック Scanner scanner = new Scanner(System.in); scanner.hasNextLine(); //停止 glassFish.stop(); } }
この方式ならばNetBeansやEclipseなどで自由にプロジェクトを作成してすぐに導入可能なのがわかると思う。
AP鯖起動時間は1秒くらい。ちょっぱや。
ほかにもデプロイ時にWEB-INF/の下に動的に追加したり、earのアーカイブも作れたり(その場合の参照はScatteredArchiveのインスタンスをとったりできるので非常に柔軟性が高い)、glassfishのコマンドラインツールであるasadminのコマンドを発行することができるので、動的にデータソースの追加、httpコネクタの設定等ができる。すばらしい。
必要なjarはこれだけ。以下のどちらか1つ。webのほうがear扱えない軽いほう。