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

2013年12月11日水曜日

Tomcat7のWeb Administrationで403エラーが出る

TomcatのWeb Administrationでtomcat-users.xmlを設定したのだが403が出る。どうやら以前と違うようだ。

<role rolename="admin"/>
<role rolename="admin-gui"/>
<role rolename="manager"/>
<role rolename="manager-gui"/>

http://stackoverflow.com/questions/11080148/403-access-denied-in-tomcat
http://tomcat.apache.org/tomcat-7.0-doc/manager-howto.html

2013年12月5日木曜日

Mavenで署名付きjarを作るにはmaven-jar-pluginとmaven-jarsigner-pluginを使う

署名付きアプレットを作るのにMavenでどうやってやればいいのかまとめてみました。まずは手順:


  1. keystoreを予め作っておく
  2. jarをおいておくフォルダを予め作っておく
  3. maven-jar-pluginでjarを作る
  4. maven-jarsigner-pluginで署名付きjarを作る

1.2.はmavenを走らせる前に予め作っておきました。3.4. はcompileのフェーズで実行。サンプルのpom.xmlは以下:

  <build>
    <plugins>
      <plugin>
      <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
      <executions>
          <execution>
          <id>make-a-jar</id>
          <phase>compile</phase>
          <goals>
            <goal>jar</goal>
          </goals>
        <configuration>
           <includes>
                  <include><!-- Include files--></include>
           </includes>
          <outputDirectory><!-- Output directory --></outputDirectory>
                  <finalName><!-- jar name --></finalName>
                </configuration>
          </execution>
      </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jarsigner-plugin</artifactId>
        <version>1.2</version>
        <configuration>
          <archive><!-- jar file --></archive>
          <keystore><!-- keystore file --></keystore>
          <storepass><!-- password--></storepass>
          <alias><!-- alias --></alias>
          <verbose>true</verbose>
        </configuration>
        <executions>
          <execution>
    <id>sign-a-jar</id>
            <phase>compile</phase>
            <goals>
              <goal>sign</goal>
            </goals>
          </execution>
        </executions>
 </plugin>
   </plugins>
  </build>

http://maven.apache.org/plugins/maven-jar-plugin/usage.html
http://stackoverflow.com/questions/3598424/jar-signing-strategy-in-maven-projects
http://stackoverflow.com/questions/4757426/maven-specify-the-outputdirectory-only-for-packaging-a-jar

2013年12月3日火曜日

Springで独自のフィルターを使いたい場合

Spring Securityを使う以前に簡単にフィルターを使いたいなと思い、Springではどうやって使うのだろうと調べてみました。

http://srlawr.blogspot.com/2011/09/creating-custom-filter-in-spring.html

ミソとしては、org.springframework.web.filter.DelegatingFilterProxyに自分でカスタマイズしたFilterをbeanとして設定してやれば良いようです。このフィルタはorg.springframework.web.filter.OncePerRequestFilterを実装した例が多かったので、これを実装したけど、、、これで良いのかな??

そしてパラメーターはinit-paramで渡せるようです。

http://stackoverflow.com/questions/5807922/how-does-spring-wire-a-onceperrequestfilter-with-its-init-param-values

javax.servlet.Filterだとダメなのだろうか??動いてはいるのですが、ブラックボックスなとこがあるのでちょっと心配です。

Spring SecurityのバージョンがSpring Frameworkと違うのでかなりハマりました。

Spring Securityを使う場合、これを書いている時点では3.1.4.RELEASEが最新だったのですが、Spring Frameworkの最新バージョン(3.2.4.RELEASE)と違うんだなと何気にpom.xmlに追加してmavenを走らせたらどえらくハマりました。。。

エラーエラーの連発で、どこの何がまずいのかメッセージを見てもサッパリ。ネットでいろいろ調べてみると、やっとの事で見つけました。

http://stackoverflow.com/questions/16801639/spring-core-3-2-2-spring-security-3-1-4-java-lang-incompatibleclasschangeerro
http://www.mkyong.com/mongodb/spring-asm-dependency-issue-in-spring-data/

要するにSpring Securityの3.1.4.RELEASEはSpringの3.0.7に依存してるので、裏で読み込まれているjarが3.0.7の物がいくつかあり、これがSpring 3.2.4と喧嘩してしまっている状態。どうやらここがハマった原因だったようです。mvn dependency:treeで確認。

解決方法としては、3.0.7でなくて3.2.4を明示的に読み込ませればOK。pom.xmlのdependencyManagementタグ内で古いjarを読み込んでるパッケージを明示的に3.2.4にしてやれば見事解決しました。

なぜSpringとSpring Securityでバージョンが違うのか?
なぜSpring Securityは最新のバージョンを読み込まないのか?

ここら辺が疑問ですが、こういう類のエラーは本当にSpringの嫌なとこですね。エラーメッセージを見ても分からないし、mvn dependency:treeなんてコマンド、今回初めて知りました。

ちょっと原因らしきことが書いてあります。異なるバージョンのjarを読み込んだ場合の優先度や明示的にpom.xmlで指定する話など。解決方法としてはいいけど、その都度mvn dependency:treeで調べないといけないのか。Spring SecurityをSpringの一部にすればいいのに。。

http://www.baeldung.com/spring-security-with-maven