2014年1月29日水曜日

Mavenでテストのフェーズを無視して実行するには

Mavenでテストのフェーズは完了してるので、ここをスキップしてパッケージしたwarファイルをサーバーにインストールしたい場合などには、便利なオプションがあったのでメモしておきます。

% mvn install -Dmaven.skip.test=true
% mvn package -Dmaven.skip.test=true

結構単純なフラグを指定してやるだけで、テストフォーズをとばしてくれます。便利。

http://www.mkyong.com/maven/how-to-skip-maven-unit-test/

2013年12月18日水曜日

tomcat-maven-pluginでTomcatのmanagerアプリにアクセスする際の認証情報の設定について

MavenでwarファイルをTomcatにインストールして、サーバーを再起動したりするにはtomcat-maven-pluginとTomcatのmanagerアプリの設定で可能です。そして、Tomcatのmanagerアプリにアクセスするには認証情報が必要になるのですが、これをpom.xmlファイルに書いてしまうと、Gitなどのバージョンコントロールシステムで管理するには内容が丸見えなので問題あり。そこで、どこに認証情報を書くのかというと、Mavenにはsettings.xmlとファイルがあるので、ここにサーバー情報を記述。

settings.xml

<servers>
  <server>
    <id></id>
    <username></username>
    <password></password>
  </server>
</servers>

このsettings.xmlのサーバーIDはpom.xmlのtomcat-maven-pluginのサーバー情報と紐付いてる。

2013年12月17日火曜日

Tomcatのmanagerアプリが404でアクセスできない場合

Tomcatの管理ページにアクセスしたら404が出たので、あれっ、tomcat-users.xmlを設定し忘れたかな?と思ったらそういうわけでもない。。。

いろいろ調べていたら、どうやらUbuntuはapt-get install tomcat6-adminでインストールしてあげないといけないらしい。知らんがな、、、

https://help.ubuntu.com/lts/serverguide/tomcat.html

org.hibernate.ObjectNotFoundExceptionがエンティティの@OneToOneの関連性で出てしまう場合の対処方法

Hibernateで1対1の関係にあるエンティティ(@OneToOne)がorg.hibernate.ObjectNotFoundException出てしまう場合、つまりユニークキーに紐付けられたレコードが無いよって場合の対処方法。またもやHibernateのブラックボックス、、、

@OneToOne(fetch=FetchType.EAGER)
@JoinColumn(name="A_ID")
@NotFound(action=NotFoundAction.IGNORE)

@NotFoundでIGNOREを使ってやると例外無くnullを設定してくれる。

2013年12月13日金曜日

Mavenのmaven-war-pluginのfilterとprofileで変数を設定してやれば、環境毎にwarパッケージを作成できる。

Mavenのmaven-war-pluginとprofileで変数を設定してやれば、環境毎にwarパッケージを作成できます。物凄い便利。

ポイントは、

  1. maven-war-pluginのwebResourceで環境毎に設定したい設定ファイルを列挙
  2. webResourceで列挙したファイルにfilterを使ってやる
  3. profileで環境毎のproperties変数を定義してやる
実行する時は、mvn package -P dev, mvn package -P productionみたいな感じでwarを作成できる。


http://maven.apache.org/plugins/maven-war-plugin/examples/adding-filtering-webresources.html
http://www.manydesigns.com/en/portofino/portofino3/tutorials/using-maven-profiles-and-resource-filtering
http://erhan.me/2011/10/20/property-substitution-for-web-xml-with-using-profile-properties-maven-pom-xml/

MavenでJavascriptやStylesheetのファイルはYUI compressor Maven MOJOを使う

MavenでJavascriptやStylesheetのファイルはYUI compressor Maven MOJOを使うと便利です。JSやCSSファイルをデフォルトで-minという名前で圧縮してくれるし、aggregationタグでは圧縮したファイルを一括してくれる。

http://alchim.sourceforge.net/yuicompressor-maven-plugin/index.html

ハマったところと言えば、Mavenのライフサイクルのフェーズがprepare-packageじゃないと思った順序でpom.xmlの内容が動作してくれなかった点。

2013年12月12日木曜日

HibernateのMySQL/JDBCコネクションが途切れる問題

HibernateでMySQLへの接続が1日経つと例外が発生したので、なんでかなとちょっと調べてみました。どうやらこれはMySQLのJDBCの仕様のようで、8時間経つとコネクションが途切れるようです。

http://stackoverflow.com/questions/270800/why-does-hibernate-jdbc-mysql-drop-connections-after-a-day-or-so

ただ、JDBC側でautoReconnect=trueとして自動接続をするような対処方法を取ると、コネクションを自動接続してくれるものの、例外が発生したクエリをもう1度実行してくれる訳では無いので、面倒くさい副作用が発生します。

ということで、Hibernate側でselect 1などのテストクエリを出すような対処方法を取る解決方法があるようです。hibernate.cfg.xmlでのデフォルト設定では出てこないようなプロパティなので、どこを見ればいいのか戸惑いますが、以下の通り設定できるようです。

<!--connection pool--> 
<property name="hibernate.dbcp.maxActive">10</property> 
<property name="hibernate.dbcp.whenExhaustedAction">1</property> 
<property name="hibernate.dbcp.maxWait">20000</property> 
<property name="hibernate.dbcp.maxIdle">10</property> 

<!-- prepared statement cache--> 
<property name="hibernate.dbcp.ps.maxActive">10</property> 
<property name="hibernate.dbcp.ps.whenExhaustedAction">1</property> 
<property name="hibernate.dbcp.ps.maxWait">20000</property> 
<property name="hibernate.dbcp.ps.maxIdle">10</property> 

<!-- optional query to validate pooled connections:--> 
<property name="hibernate.dbcp.validationQuery">select 1</property> 
<property name="hibernate.dbcp.testOnBorrow">true</property> 
<property name="hibernate.dbcp.testOnReturn">true</property> 

http://stackoverflow.com/questions/7766023/hibernate-failed-to-execute-query-afte-1-day
http://my.safaribooksonline.com/book/programming/java/0321268199/performance/ch10lev1sec4