T2が楽しそう

seasar connには行けなかったのですが、セッションの資料を見てると、T2が非常に面白そう。
今の時代にあった仕様のフレームワークですね

シルバーウィークを使ってT2+GAE+guice+flex+mavenでアプリを作ろうと思います。

てか前に作ってたタイピングアプリのサーバー側をこれにします。

1.プロジェクト作成

まずEclipseのプロジェクトを作成します。
プロジェクトは、T2のプロジェクトサイトにあったViliを使います。

q4e等でMavenプロジェクトとして作らないのは、
あとからGAEのプロジェクト構成にするのが意外とめんどくさかったからです。
(appengineのjarが1.2.5のものがセントラルリポジトリにまだなかったからでもあります)

Viliをウィザードに従い、「T2プロジェクト for GAE/J」を選択します。

プロジェクト名、ルートパッケージ名(T2でのpageパッケージの親に当たるところ?)、バージョンを設定します。

あとは文字エンコードを「UTF-8」にして、作成します。

すると以下のようなGAE+T2のプロジェクトが作成できます。

2.Mavenの設定

つぎはMavenの設定をするため、pom.xmlを作成します。
ただその前に個人的に今までsrcフォルダの直下に
パッケージを置いたことがなかったので何か見た目が気になります。
なのでMaven標準?のsrc/main/java、src/main/resources、
src/test/java、src/test/resourcesを作成し設定します。
このときもともとあったlog4j.properties、
META-INFはsrc/main/resourcesに移動しておきます。

で次にpom.xmlを作成します。

<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>jp.stk.gae</groupId>
	<artifactId>soundtrick</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>soundtrick</name>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.t2framework.web</groupId>
			<artifactId>t2</artifactId>
			<version>0.6.1-ga</version>
		</dependency>
		<dependency>
			<groupId>org.t2framework.web</groupId>
			<artifactId>guiceadapter</artifactId>
			<version>0.6.1-ga</version>
		</dependency>
		<dependency>
			<groupId>com.google.code.guice</groupId>
			<artifactId>guice-servlet</artifactId>
			<version>1.0</version>
		</dependency>
		<dependency>
			<groupId>taglibs</groupId>
			<artifactId>standard</artifactId>
			<version>1.1.2</version>
		</dependency>
		<!--
			<dependency>
			<groupId>org.apache.geronimo.specs</groupId>
			<artifactId>geronimo-jta_1.1_spec</artifactId>
			<version>1.0</version>
			</dependency>
			<dependency>
			<groupId>org.apache.geronimo.specs</groupId>
			<artifactId>geronimo-jpa_3.0_spec</artifactId>
			<version>1.0</version>
			</dependency>
		-->
	</dependencies>
	<build>
		<defaultGoal>install</defaultGoal>
		<outputDirectory>war/WEB-INF/classes</outputDirectory>
		<testOutputDirectory>target/test-classes</testOutputDirectory>
		<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
		<testSourceDirectory>
			${basedir}/src/test/java
		</testSourceDirectory>
		<scriptSourceDirectory>${basedir}/war</scriptSourceDirectory>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<configuration>
					<outputDirectory>war/WEB-INF/lib</outputDirectory>
					<excludeScope>provided</excludeScope>
					<includeScope>compile</includeScope>
					<excludeGroupIds>
						javax.servlet,javax.transaction
					</excludeGroupIds>
					<overWriteReleases>false</overWriteReleases>
					<overWriteSnapshots>true</overWriteSnapshots>
					<overWriteIfNewer>true</overWriteIfNewer>
				</configuration>
				<executions>
					<execution>
						<phase>process-resources</phase>
						<goals>
							<goal>copy-dependencies</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-war-plugin</artifactId>
				<configuration>
					<warSourceDirectory>war</warSourceDirectory>
				</configuration>
			</plugin>
			<plugin>
				<!-- http://www.datanucleus.org/products/accessplatform/enhancer.html#maven2 -->
				<groupId>org.datanucleus</groupId>
				<artifactId>maven-datanucleus-plugin</artifactId>
				<version>1.1.0</version>
				<configuration>
					<verbose>true</verbose>
					<mappingIncludes>**/*.class</mappingIncludes>
					<fork>false</fork>
					<enhancerName>ASM</enhancerName>
					<api>JDO</api>
					<jdkLogConfiguration>
						war/WEB-INF/logging.properties
					</jdkLogConfiguration>
				</configuration>
				<executions>
					<execution>
						<phase>compile</phase>
						<goals>
							<goal>enhance</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
		<pluginManagement>
			<plugins>
				<plugin>
					<artifactId>maven-compiler-plugin</artifactId>
					<configuration>
						<encoding>UTF-8</encoding>
						<source>1.6</source>
						<target>1.6</target>
					</configuration>
				</plugin>
				<plugin>
					<artifactId>maven-war-plugin</artifactId>
					<version>2.0</version>
					<configuration>
						<warSourceDirectory>
							${basedir}/war
						</warSourceDirectory>
						<warSourceExcludes>
							.*,.*/,target/,work/,pom.xml,war/WEB-INF/classes/**/*.class,war/WEB-INF/lib/
						</warSourceExcludes>
						<!--
							<webResources>
							<resource>
							<directory>
							${basedir}/target/generated-resources
							</directory>
							</resource>
							</webResources>
						-->
						<archive>
							<manifest>
								<mainClass>
									org.t2framework.executablewar.Main
								</mainClass>
							</manifest>
						</archive>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>
	<repositories>
		<repository>
			<id>jpox</id>
			<url>http://www.jpox.org/downloads/maven2</url>
		</repository>
		<repository>
			<id>DataNucleus</id>
			<url>http://www.datanucleus.org/downloads/maven2</url>
		</repository>
		<repository>
			<id>DataNucleus_Nightly_Repos</id>
			<url>
				http://www.datanucleus.org/downloads/maven-nightly
			</url>
			<layout>legacy</layout>
		</repository>
		<repository>
			<id>mvnsearch</id>
			<url>http://www.mvnsearch.org/maven2</url>
		</repository>
		<repository>
			<id>maven.t2framework.org</id>
			<name>The T2 Project Maven2 Repository</name>
			<url>http://maven.t2framework.org/maven2</url>
		</repository>
		<repository>
			<id>maven-snapshot.t2framework.org</id>
			<url>http://maven.t2framework.org/maven2-snapshot</url>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</repository>
	</repositories>
	<distributionManagement>
		<repository>
			<uniqueVersion>false</uniqueVersion>
			<id>maven.t2framework.org</id>
			<name>The T2 Project Maven2 Repository</name>
			<url>dav:http://maven.t2framework.org/maven2</url>
		</repository>
		<snapshotRepository>
			<uniqueVersion>true</uniqueVersion>
			<id>maven.t2framework.org</id>
			<name>The T2 Project Maven2 Snapshot Repository</name>
			<url>dav:http://maven.t2framework.org/maven2-snapshot</url>
		</snapshotRepository>
	</distributionManagement>
	<pluginRepositories>
		<pluginRepository>
			<id>DataNucleus</id>
			<url>http://www.datanucleus.org/downloads/maven2</url>
		</pluginRepository>
	</pluginRepositories>
</project>

もともと現在リリースされているViliだとT2のVer0.6対応なので
その辺のバージョンもあげておきます。
細かいところが間違っていたらすいません。
大事なのは、maven-dependency-pluginの
outputDirectoryがwar/WEB-INF/libになっているらへんです。
こうしないとGAEのローカルサーバが見てくれません。
あとはmvn clean eclipse:eclipse dependency:copy-dependenciesコマンドで
ライブラリを落としてくればOKです。
ちなみにcleanゴールで実行すると、appengine周りのライブラリが消えるので、
プロジェクトを選択し、「プロパティ」→「Google」→「App Engine」から
「Use Google App Engine」を一度外し、再度つけてください。

3.Guiceの設定

次にGuiceの設定です。
Viliでプロジェクトを作成すると、web.xmlも自動で作成してくれるので、
これにGuiceの設定を入れていきます。

<?xml version="1.0"?>
<web-app id="t2-test" version="2.4"
	xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<context-param>
		<param-name>t2.encoding</param-name>
		<param-value>UTF-8</param-value>
	</context-param>
	<filter>
		<filter-name>Guice Servlet Filter</filter-name>
		<filter-class>
			com.google.inject.servlet.GuiceFilter
		</filter-class>
	</filter>
	<filter>
		<filter-name>t2</filter-name>
		<filter-class>org.t2framework.t2.filter.T2Filter</filter-class>
		<init-param>
			<param-name>t2.rootpackage</param-name>
			<param-value>jp.stk.gae.page</param-value>
		</init-param>
		<init-param>
			<param-name>t2.container.adapter</param-name>
			<param-value>
				org.t2framework.t2.adapter.GuiceAdapter
			</param-value>
		</init-param>
		<init-param>
			<param-name>t2.exclude-resources</param-name>
			<param-value>css, js, png, gif, jpg</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>Guice Servlet Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>t2</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
		<!--
			<dispatcher>INCLUDE</dispatcher>
			<dispatcher>ERROR</dispatcher>
		-->
	</filter-mapping>

	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>

	<jsp-config>
		<jsp-property-group>
			<url-pattern>*.jsp</url-pattern>
			<el-ignored>false</el-ignored>
			<page-encoding>UTF-8</page-encoding>
			<scripting-invalid>false</scripting-invalid>
			<!-- <include-prelude>/WEB-INF/pages/common.jsp</include-prelude> -->
			<!-- trim white spaces (JSP 2.1 or higher)
				<trim-directive-whitespaces>true</trim-directive-whitespaces>
			-->
		</jsp-property-group>
	</jsp-config>

</web-app>

T2Filterのt2.container.adapterにorg.t2framework.t2.adapter.GuiceAdapterを設定し、
T2Filterの前にGuiceFilterを設定します。

4.GuiceModuleの設定

META-INFにservices/com.google.inject.Moduleを作成し、
読み込むModuleを作成します。
ここではT2のGuiceサンプルにあった、ApplicationModule.javaを作成します。

package jp.stk.gae.module;


import jp.stk.gae.plugin.PagePluginImpl;

import org.t2framework.t2.plugin.Plugin;

import com.google.inject.AbstractModule;
import com.google.inject.servlet.ServletModule;

public class ApplicationModule extends AbstractModule {

	@Override
	protected void configure() {
		install(new ServletModule());
	}
}

そしてこのModuleを読み込んでもらうために、
com.google.inject.ModuleにこのModuleのフル
クラスパスを書きます。(jp.stk.gae.module.ApplicationModule )

とりあえず今日はここまでです。
あとはT2Pluginを設定したり、AOP設定したり、いろいろやってみます。