2007/10/18

Hudson(winstone)の起動ポート(port)の変更方法

Hudsonはwinstoneのコマンドラインがそのまま使えます。

このため起動portを変えたかったら「Command-line options」にある「--httpPort」でport番号を指定すればOK
java -jar hudson.war --httpPort=1192


なのでwinstoneも同じ方法でportが変更できる。


なんかもったいないので見つけ出した過程を書いとく。

ずっと探してたけどわかんなくて結局Hudsonのコードを見て探し当てた。

winstoneの起動コマンドでportが変更できるのを知ってたので
hudsonからwinstoneの起動場所のコードをいじる方針で調査開始!

<起動Mainのクラス名の検索>
・Hudsonは起動時に%TEMP%フォルダにhudson.warを解凍するので見に行く
・META-INF\MANIFEST.MFのMain-Classを見る
・Mainというクラスが始めに起動することがわかった

<起動Mainのクラスコードの検索>
・HudsonのコードからMain.javaを検索
・4つMain.javaあったがデフォルトパッケージの「hudson/war/src/launcher/java/Main.java」を開く

<winstone起動場所の調査>
・Main.main(String[] args)を見るとjarを読み込んでる
・winstoneのMainクラス「winstone.Launcher」を呼び出してる場所を発見
・Mainクラスのコマンドライン引数に「--warfile」を追加して、
 winstone.Launcher.mainを起動しているだけと判明




ちなみに、hudsonのプラグインで「port-allocator」なるものがあった。
ヘルプを見るとHTTP_PORT, ADMIN_PORT, SHUTDOWN_PORTが指定できるそうなので、引数指定しなくてもよくなるかもしれない

2007/10/16

Hudson(winstone)で日本語が文字化けたのをむりくり直す

CIツールとして個人的に大流行のHudson!
簡易httpサーバとしても利用できるので大変重宝している。

しかし、こやつを介して静的なHTMLを表示しようとすると
日本語が文字化けるんです…

HTML側でContent-Typeで「Shift_JIS」とかにしても
強制的に「ISO-8859-1」になってしまう。

なんか優先順があるのかなーと思ったらあった

確かにfirefoxのLiveHTTPheadersで見ると強制的に指定されている…

でもどこでHTTPのContent-Typeヘッダのcharsetパラメータを変えてるのかずっと探していた

が、どうやらwinstone↓が原因…
http://blog.cles.jp/item/2173
※clesさんありがとうございます

修正方法は2種類あるようだ、しかし↓にFilter変更は目的違いなのでは?と書いてあった
http://d.hatena.ne.jp/chinpeinet/20070919
※chinpeinetさんありがとうございます


なので、doGet()/doPost()を修正する方法でチャレンジ!

したのですがうまくいかない…


ひとまず強制的に「UTF-8」にするように変更してみた。


<1.winstoneのコードを取得>
・「winstone java」あたりでググってコードを持ってくる
・適当な場所で解凍
※今回は「winstone-src-0.9.9.tar.gz」を使った

<2.winstoneのコードを変更>
・Eclipse>ファイル>インポート>既存のプロジェクトをインポートでwinstoneを指定
・mavenの依存関係があるので「ビルドパス」で関係を削除
※使用しているjreのversionが直書きなので、異なっていたら変更
・src/java/winstone.WinstoneResponse.getCharacterEncoding()の「ISO-8859-1」を「UTF-8」に変更



・保存してコンパイル
・「winstone-src-0.9.9\build-eclipse\winstone\WinstoneResponse.class」をコピー

<3.hudson.warの解凍>
・hudson.warをzip解凍

<4.winstone.jarの再生成>
・hudson直下にあるwinstone.jarをzip解凍
・「winstone\winstone」に「2」でコピったファイルを上書きペースト
・winstoneフォルダで「jar cvfm winstone.jar META-INF\MANIFEST.MF .」
・winstoneフォルダにできた「winstone.jar」を取得

<5.hudson.warにwinstone.jarの配置>
・「3」のhudsonフォルダに「4」のwinstone.jarを上書き

<6.hudson.warの再生性>
・hudsonのソースを取得&解凍、直下にある「dummy.keystoreファイル」を取得して「3」に配置
ここからでも取得可
※今回は「hudson-1.146-src.zip」を使った
・以下のようなantスクリプト(build.xml)を作成して「3」に配置
<project name="hudson" default="war" basedir=".">
<target name="war">
<war destfile="hudson.war" webxml="WEB-INF/web.xml" manifest="META-INF/MANIFEST.MF">
<fileset dir="." excludes="META-INF/**,WEB-INF/**,build.xml,dummy.keystore,hudson.war" />
<metainf dir="META-INF" includes="maven/**"/>
<webinf dir="WEB-INF" includes="*" excludes="web.xml"/>
<lib dir="WEB-INF/lib" includes="*.jar"/>
</war>
<signjar jar="hudson.war" alias="hudson" keystore="dummy.keystore" storepass="hudson"/>
</target>
</project>

・コマンドラインから「ant」を実行

<7.hudson.warの起動>
・いつもと同じように「java -jar hudson.war」で起動


この方法だとfirefoxはうまく表示できたが、IE6では表示できなかった。

「2」の処理の時に「強制的にContent-Typeを指定しない」ように
修正をしたら、IE6でも文字化けしなかった。
(WinstoneResponse.validateHeaders():L242~253をコメントアウト)

表示方法をブラウザ側に委ねるので危険そうだ…

もうちょいよい修正方法はないものか…

2007/10/15

StatSVN(StatCVS)の文字化け(charset)をソースを変更して直す

StatCVSはCVSのCommit履歴を表示してくれるだけでなく
いつ、誰が、どれだけ開発しているかをまとめてくれる優れもの!

なんですが…

生成されるHTMLの「charset」が「ISO-8859-1」になってて
Commitログが文字化けてしまいます…

今までは生成されたHTMLのcharsetを「Shift_JIS」に変換するスクリプトで
対応していたのですが、生成するHTMLの数も多く変換処理が重くなってきたので
「最初っからShift_JISで出せよ!」と思い、オプション指定を探すためコードを見てたら


めちゃ直書きだ!!

「charset」はオプション変更で変えられないみたい…

なのでコードを直修正!!


<statCVSのソースを取得>
http://sourceforge.net/project/showfiles.php?group_id=57558
※現時点ではstatcvs-0.3のソースを利用

<Eclipseでプロジェクトをインポート>
Eclipse>ファイル>インポート>既存のプロジェクトをインポート

<コードの修正>
statcvs-0.3/src/net.sf.statcvs.pages.MarkupHTML.java
33行目の「ISO-8859-1」を「Shift_JIS」に変更



<statcvs.jarの展開>
statcvs.jarを取得して、zip展開する

<MarkupHTML.classの配置>
statcvs-0.3/classes/net.sf.statcvs.pages.MarkupHTML.classを取得
zip展開したstatcvsのstatcvs/net.sf.statcvs.pages.MarkupHTML.classに上書き

<JARの生成>
cd statcvs
jar cvfm statcvs.jar META-INF\MANIFEST.MF .


同じ方法でstatSVNも変更できます。
※statSVNのほとんどはstatCVSを使ってる

2007/10/12

maven2でソース(sourceDirectory)フォルダを複数指定

mavenでコンパイルする対象のソースフォルダ(sourceDirectory)を追加するには
maven1では「maven.xml」ファイルに「maven.compile.src.set」でパスを追加すればよかったけど、
maven2では「build-helper-maven-plugin」というプラグインで指定するようになった。



<project>
...
<build>
<sourceDirectory>src</sourceDirectory>
...
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>src2</source>
<source>src3</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
...
</build>
...
</project>



ちなみにテストフォルダ(testSourceDirectory)を追加するには
maven1では「maven.xml」ファイルに「maven.test.compile.src.set」でパスを追加すればよかったけど、
maven2では同じように「build-helper-maven-plugin」で指定できる。



<project>
...
<build>
<testSourceDirectory>test</testSourceDirectory>
...
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>add-test-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-test-source</goal>
</goals>
<configuration>
<sources>
<source>test2</source>
<source>test3</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
...
</build>
...
</project>

2007/10/01

JavaPathFinderがコード提供なのでJarを作った

JavaPathFinderがコード提供なのでEclipseからコンパイルしてJarを作ってみた。
※やっぱNASAだから特殊なJDKつかってんのかなぁ…

「jpf release\build\lib」に「env_jpf.jar」「env_jvm.jar」「open-jpf.jar」を
作るために「ant」の「jar」ターゲットを実行しないと「jpf.bat」が動かない









これはEclipseと連動させたいなぁ