この度、個人ブログを閉鎖することなり、一定のアクセスがあった記事を記録として遺すことにしました。
以下は、2020年4月14日に投稿した記事の写しです。この記事がこの世の誰かの助けとなることを願います。
JavaでWebというと、warファイルをAPサーバに搭載してみたいな運用が多いと思いますが、
Java SEアプリケーションにHTTP Serverとしての機能を組み込みたい、といった要件を提示されることも多々あります。
GrizzlyはJava EEアプリサーバのGlassFishで採用されているHTTPサーバの実装ライブラリで、Java SEアプリケーションに単体で組み込むこともできます。
公式サイト
https://javaee.github.io/grizzly/
公式のサンプルほぼそのままですが、Mavenプロジェクトでの実装例を記載します。
まずは、pom.xmlに以下の通り追記して保存します。
<dependencies>
<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>grizzly-http-server</artifactId>
<version>2.4.4</version>
</dependency>
</dependencies>
Grizzlyを使用するために必要なライブラリが自動的ダウンロードされプロジェクトに取り込まれます。
うまくいかない場合は、おおよそWebプロキシが原因なのでsettings.xmlに然るべき設定をしてリトライしましょう。
次に新規クラスを作成してmainメソッドを以下の通り記載します。
package net.xamarinian.examples;
import java.nio.charset.StandardCharsets;
import org.glassfish.grizzly.http.server.HttpHandler;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.grizzly.http.server.Request;
import org.glassfish.grizzly.http.server.Response;
import org.glassfish.grizzly.http.util.ContentType;
public class GrizzlyMain {
/**
* Java SEアプリケーションにHTTP Serverを組み込むサンプル(Grizzly版)
* @param args
*/
public static void main(String[] args) {
// リッスンポート8080でサーバインスタンスを生成
final HttpServer server = HttpServer.createSimpleServer();
// サーバにハンドラを登録
server.getServerConfiguration().addHttpHandler(
new HttpHandler() {
@Override
public void service(Request request, Response response) throws Exception {
String data = "Hello Grizzly!!";
response.setContentType(ContentType.newContentType("text/plain", "UTF-8"));
response.setContentLength(data.getBytes(StandardCharsets.UTF_8).length);
response.getWriter().write(data);
}
}, "/grizzly");
try {
// HTTP Server開始
server.start();
System.out.println("Press any key to stop the server...");
System.in.read();
} catch (Exception e) {
e.printStackTrace();
} finally {
server.shutdownNow();
}
}
}
mainメソッドの実装が終わったらさっそくアプリケーションを実行してみます。
サンプルのHttpServerへはhttp://localhost:8080/grizzly からアクセスすることが可能です。
Webブラウザからも当然アクセス可能ですが、PowerShellのInvoke-WebRequestコマンドレット(curl)を使うとヘッダ情報まで確認できて便利です。
PS C:\Windows\system32> curl http://localhost:8080/grizzly
StatusCode : 200
StatusDescription : OK
Content : Hello Grizzly!!
RawContent : HTTP/1.1 200 OK
Content-Length: 15
Content-Type: text/plain;charset=UTF-8
Hello Grizzly!!
Forms : {}
Headers : {[Content-Length, 15], [Content-Type, text/plain;charset=UTF-8]}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 15