GAE/JでOCamlを動かそうとして挫折した
GAE/JとThe website has movedを組み合わせたら、OCamlでWebアプリが作れるんじゃね?と思ったのでチャレンジしてみたけど、うまくいかなかった。
ocaml-java(Cadnium)はThreadを使っているけど、GAE/JはThreadを作れないらしい。(参考:http://code.google.com/intl/ja/appengine/docs/java/runtime.html)
こりゃ、無理だ。
Makefile
OPTIONS=-java-package testserv \ -classpath ~/tmp/java-ocaml/ocamljava-bin-1.2/lib/ocamlrun-servlet.jar \ -I +cadmium \ -provider fr.x9c.cadmium.primitives.cadmiumservlet.Servlets OCAMLJAVA=java -jar ~/tmp/java-ocaml/ocamljava-bin-1.2/bin/ocamljava.jar compile: $(OCAMLJAVA) $(OPTIONS) -c -I +cadmium hello.ml link: $(OCAMLJAVA) $(OPTIONS) -o native.war -standalone \ -additional-jar ~/tmp/java-ocaml/ocamljava-bin-1.2/lib/ocamlrun-servlet.jar \ -servlet web.xml cadmiumLibrary.cmja cadmiumServletLibrary.cmja hello.cmj
hello.ml
open CadmiumServlet let handle_get srv req resp = let out = Response.get_output_stream resp in output_string out "<html><head><title>ERROR</title></head><body>"; output_string out "<b>UNHANDLED REQUEST</b>"; output_string out "</body></html>" let () = Servlet.register { Servlet.destroy = ignore; Servlet.init = ignore; Servlet.info = "my first servlet"; Servlet.do_delete = None; Servlet.do_get = Some handle_get; Servlet.do_head = None; Servlet.do_options = None; Servlet.do_post = None; Servlet.do_put = None; Servlet.do_trace = None; Servlet.get_last_modified = None; }
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>New Project Template</display-name> <servlet> <servlet-name>hello</servlet-name> <servlet-class>testserv.Hello</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>