連載の最後となる今回は、
WebSocketのセキュリティ
WebSocketは、
Jetty7はそのままでは、
最新の仕様
第3回
この変更された仕様をJettyが実装した場合、
第3回
アイコンの準備
アプリケーション化を行なう前に、
「src/
メニューの作成
ここまでに作成してきたWebSocketChatは、
そこで、
package webSocketChat;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
public class WebSocketChat {
public static void main(String[] args) throws Exception {
new WebSocketChat();
}
public WebSocketChat() throws Exception {
MenuItem quitMenuItem = new MenuItem("Quit");
quitMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
PopupMenu popupMenu = new PopupMenu();
popupMenu.add(quitMenuItem);
URL imageUrl = this.getClass().getClassLoader().getResource("images/icon.png");
TrayIcon trayIcon = new TrayIcon(Toolkit.getDefaultToolkit().createImage(imageUrl));
trayIcon.setImageAutoSize(true);
trayIcon.setToolTip("WebSocketChat");
trayIcon.setPopupMenu(popupMenu);
SystemTray systemTray = java.awt.SystemTray.getSystemTray();
systemTray.add(trayIcon);
Server server = new Server(8040);
ResourceHandler rh = new ResourceHandler();
rh.setResourceBase(this.getClass().getClassLoader().getResource("html").toExternalForm());
MyWebSocketServlet wss = new MyWebSocketServlet();
ServletHolder sh = new ServletHolder(wss);
ServletContextHandler sch = new ServletContextHandler();
sch.addServlet(sh, "/ws/*");
HandlerList hl = new HandlerList();
hl.setHandlers(new Handler[] {rh, sch});
server.setHandler(hl);
server.start();
}
}
修正内容を順に解説します。
MenuItem quitMenuItem = new MenuItem("Quit");
quitMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
「Quit」
PopupMenu popupMenu = new PopupMenu();
popupMenu.add(quitMenuItem);
メニューのアイコンをクリックした時に表示するポップアップメニューを作成し、
URL imageUrl = this.getClass().getClassLoader().getResource("images/icon.png");
TrayIcon trayIcon = new TrayIcon(Toolkit.getDefaultToolkit().createImage(imageUrl));
trayIcon.setImageAutoSize(true);
trayIcon.setToolTip("WebSocketChat");
trayIcon.setPopupMenu(popupMenu);
メニューアイコンの画像を、
SystemTray systemTray = java.awt.SystemTray.getSystemTray();
systemTray.add(trayIcon);
システムトレイは、
それでは、
![図1 メニューが表示された様子(Windowsの場合) 図1 メニューが表示された様子(Windowsの場合)](/assets/images/dev/feature/01/websocket/0006/thumb/TH400_01.png)
![図2 メニューが表示された様子(Mac OS Xの場合) 図2 メニューが表示された様子(Mac OS Xの場合)](/assets/images/dev/feature/01/websocket/0006/thumb/TH400_02.png)
![図3 メニューが表示された様子(Ubuntuの場合) 図3 メニューが表示された様子(Ubuntuの場合)](/assets/images/dev/feature/01/websocket/0006/thumb/TH400_03.png)
それぞれのOSで、
アプリケーション化
次に、
まず、
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>WebSocketChat</groupId>
<artifactId>WebSocketChat</artifactId>
<name>WebSocketChat</name>
<version>0.0.1-SNAPSHOT</version>
<properties>
<package.package-name>webSocketChat</package.package-name>
<package.main-class>${package.package-name}.${name}</package.main-class>
<package.base-name>${name}-${version}</package.base-name>
<package.jar-name>${package.base-name}.jar</package.jar-name>
<package.exe-name>${package.base-name}.exe</package.exe-name>
<package.app-name>${package.base-name}.app</package.app-name>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
<debug>true</debug>
<optimize>false</optimize>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>${package.main-class}</mainClass>
<packageName>${package.package-name}</packageName>
<addClasspath>true</addClasspath>
<classpathPrefix>lib</classpathPrefix>
</manifest>
<manifestEntries>
<Built-By></Built-By>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>osxappbundle-maven-plugin</artifactId>
<version>1.0-alpha-2</version>
<configuration>
<mainClass>${package.main-class}</mainClass>
<jvmVersion>1.6+</jvmVersion>
<iconFile>target/classes/images/mac.icns</iconFile>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals><goal>bundle</goal></goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.bluestemsoftware.open.maven.plugin</groupId>
<artifactId>launch4j-plugin</artifactId>
<version>1.5.0.0</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>launch4j</goal></goals>
<configuration>
<headerType>GUI</headerType>
<jar>target/${package.jar-name}</jar>
<outfile>target/${package.exe-name}</outfile>
<customProcName>${name}</customProcName>
<errTitle>${name}</errTitle>
<icon>target/classes/images/win.ico</icon>
<jre>
<minVersion>1.6.0</minVersion>
</jre>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals><goal>attached</goal></goals>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>7.1.4.v20100610</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-websocket</artifactId>
<version>7.1.4.v20100610</version>
</dependency>
</dependencies>
</project>
それでは、
<name>WebSocketChat</name>
「name」
<properties>
<package.package-name>webSocketChat</package.package-name>
<package.main-class>${package.package-name}.${name}</package.main-class>
<package.base-name>${name}-${version}</package.base-name>
<package.jar-name>${package.base-name}.jar</package.jar-name>
<package.exe-name>${package.base-name}.exe</package.exe-name>
<package.app-name>${package.base-name}.app</package.app-name>
</properties>
プロパティの設定です。要素名がプロパティ名になります。プロパティの値を参照するには
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>${package.main-class}</mainClass>
<packageName>${package.package-name}</packageName>
<addClasspath>true</addClasspath>
<classpathPrefix>lib</classpathPrefix>
</manifest>
<manifestEntries>
<Built-By></Built-By>
</manifestEntries>
</archive>
</configuration>
</plugin>
「jar」
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Build-Jdk: 1.6.0_20
Package: webSocketChat
Main-Class: webSocketChat.WebSocketChat
Built-By:
Class-Path: lib/jetty-webapp-7.1.4.v20100610.jar lib/jetty-xml-7.1.4.v
20100610.jar lib/jetty-util-7.1.4.v20100610.jar lib/jetty-servlet-7.1
.4.v20100610.jar lib/jetty-security-7.1.4.v20100610.jar lib/jetty-ser
ver-7.1.4.v20100610.jar lib/servlet-api-2.5.jar lib/jetty-continuatio
n-7.1.4.v20100610.jar lib/jetty-http-7.1.4.v20100610.jar lib/jetty-io
-7.1.4.v20100610.jar lib/jetty-websocket-7.1.4.v20100610.jar
マニフェストファイルの内容をみれば、
唯一わかりにくいのが
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>osxappbundle-maven-plugin</artifactId>
<version>1.0-alpha-2</version>
<configuration>
<mainClass>${package.main-class}</mainClass>
<jvmVersion>1.6+</jvmVersion>
<iconFile>target/classes/images/mac.icns</iconFile>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals><goal>bundle</goal></goals>
</execution>
</executions>
</plugin>
Mac OS X用にアプリケーションを出力するための設定です。
「src/
その他に、
<plugin>
<groupId>org.bluestemsoftware.open.maven.plugin</groupId>
<artifactId>launch4j-plugin</artifactId>
<version>1.5.0.0</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>launch4j</goal></goals>
<configuration>
<headerType>GUI</headerType>
<jar>target/${package.jar-name}</jar>
<outfile>target/${package.exe-name}</outfile>
<customProcName>${name}</customProcName>
<errTitle>${name}</errTitle>
<icon>target/classes/images/win.ico</icon>
<jre>
<minVersion>1.6.0</minVersion>
</jre>
</configuration>
</execution>
</executions>
</plugin>
Windows用にアプリケーションを出力するための設定です。jarファイルをWindowsアプリケーションにする
設定項目は
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals><goal>attached</goal></goals>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
「assembly」
配布物の作成
どのようなアーカイブファイルを作成するかを指定するための
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>bin</id>
<formats>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>target</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.jar</include>
<include>*.exe</include>
<include>*.dmg</include>
</includes>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
「id」
「fileSets」
使用しているMavenのライブラリを添付する設定は、
最後にコンパイルとパッケージ化を一度に行ないます。
このアーカイブファイルには、
おわりに
当初、
連載中も何度も言及しましたが、
今回解説したサンプルファイルがダウンロードできます。
「src/