SAStrutsのプロジェクトをHerokuにデプロイする上でいくつか嵌った点を。
参考:Heroku/Cedar上でSAStruts+S2JDBCを動かす
基本的には上記URLを参考にしながら進めました。
- データベース設定変更
MySQL(ClearDB)を利用する場合
import java.net.URI;
import java.net.URISyntaxException;
public class HerokuEnvironmentHelper {
private static HerokuEnvironmentHelper instance;
public static HerokuEnvironmentHelper getInstance()
throws URISyntaxException {
if (instance == null) {
instance = new HerokuEnvironmentHelper();
}
return instance;
}
private URI DB_URI;
private static final String DB_URI_ENV_NAME = "CLEARDB_DATABASE_URL";
private HerokuEnvironmentHelper() throws URISyntaxException {
DB_URI = new URI(System.getenv(DB_URI_ENV_NAME));
}
public String getUrl() {
return "jdbc:mysql://" + DB_URI.getHost() + DB_URI.getPath();
}
public String getUsername() {
return DB_URI.getUserInfo().split(":")[0];
}
public String getPassword() {
return DB_URI.getUserInfo().split(":")[1];
}
}
これが曲者でした。
private static final String DB_URI_ENV_NAME = "CLEARDB_DATABASE_URL";
最初は例の通りDATABASE_URLにしていましたが、デプロイしてもタイムアウトでエラーを吐くのでデバッグしてみたら、デフォルトのpostgresに接続しようとしていましたw
- 依存jar pom.xmlにjettyの追加の他にmysqlの依存も追加します。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
私の環境では5.1.7を使っていますが、Mavenにないのでpush rejectされますw
仕方ないので5.1.6を使います。
- web.xml
web.xmlからrequestDumpFilter関係の2項目をコメントアウトします。
<!--
<filter>
<filter-name>requestDumpFilter</filter-name>
<filter-class>org.seasar.extension.filter.RequestDumpFilter</filter-class>
</filter>
-->
<!--
<filter-mapping>
<filter-name>requestDumpFilter</filter-name>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
-->
- Herokuへのアップロード
git init
git add .
git commit -m 'init'
git push heroku master
#プロセスが起動しているか確認
heroku ps
#起動していない場合
heroku ps:scale web=1
#ログの確認
heroku logs
- DBのリストア
heroku config --app <<アプリ名>>
#カレントディレクトリの位置を確認してからリストア
mysql --user=ユーザ名 --password=パスワード --host=サーバ名 データベース < dump.sql