ゴミ箱.net

汚物は消毒

POIでシートの並べ替え→削除をすると内部データが壊れる件

JavaでExcelのデータを触れる便利なライブラリApache POI。色々なところで使われていてかなりメジャーなライブラリのはず。

そのPOIのけっこうきついバグを、ついこの間見つけてしまったようだ…

続きを読む

スポンサーサイト

PageTop

JavaMailが文字化けする件2

以前の続き。
JavaMailの原因不明の文字化けに苦しんで、ようやく原因を突き止めて解決したと思ったら再発しやがた。
いったいおれ どうな て

真の原因は、どうやら同じアプリの中で、ウェブサービスのクライアントとJavaMailを同時に使っていたのがまずかったらしい。
[#JAX_WS-643] JAX-WS RI breaks JavaMail's DataContentHandlers in the container - Java.net JIRA

このいやらしいバグが発生したアプリは、外部のウェブサービスを呼び出して一部の処理をそいつに任せるようになっている。
ウェブサービスを呼び出すため、WSDLファイルをもとにwsimportでクライアントのソースコードを生成し、生成したクライアントをアプリケーションから呼び出すようにしていたのだが、こいつが食わせ物だった。
Javaランタイムに含まれるJAX-WS RIのバージョンが2.1.6より古いと、JavaMailも参照している静的な変数領域を勝手に書き換えてしまうらしく、そのせいで一度でもウェブサービスのクライアントを呼び出してしまうとそれ以降JavaMailの文字化けが続いてしまう。
そして、使っていたJavaランタイムのJAX-WS RIのバージョンがちょうど2.1.6だったせいで謎の文字化けに悩まされたわけだ。
1バイト文化圏の野蛮人どもめ。何も考えずに糞実装作りやがって。

対策としてはJAX-WS RIを2.1.7以上にアップグレードすること。簡易インストーラがついてるから導入が楽なのが救いだ。

PageTop

JavaMailが文字化けする件

JavaMail APIを使ってメールを送信するアプリケーションをJava Service Wrapperによってサービス化したら、なぜか送るメールがことごとく文字化けしてしまう。
文字セットとしてISO-2022-JPを指定しているにもかかわらず、データを見るとUTF-8で送信されているようだ。

マルチバイト文化圏の住民にありがちな話だと思ってぐぐっても、なぜか同じ症状の話がまったく出てこない。基本的な設定ミスの話ばかり引っかかるが、そもそも設定自体はできているのだ。というのも、同じ処理をスタンドアロンで実行したら文字化けせずにメールを遅れるのに、Java Service Wrapper経由で処理を実行したときだけ文字化けするのだ。

仕方がないので、JavaMailのソースコードを追っかけていって調べる羽目になった。
その結果、どうにか原因らしきものを突き止めることはできたのだが…

続きを読む

PageTop

結局「Java プログラマであるかを見分ける 10 の質問」の正解は何なんだよ

続きを読む

PageTop

MANIFEST.MFは空白ひとつでダウンさ

Javaでツールを作るときに、以下のようなMANIFEST.MFをJarファイルに含めるようにした。
Manifest-Version: 1.0
Implementation-Title: TreeEditor
Implementation-Version : 0.1.0
Specification-Title: TreeEditor
Specification-Version: 0.1.0
Main-Class: treeeditor.Main


Jarファイルはできたのだが、なぜかそれを呼び出すことができない。

コマンドラインで
java -jar TreeEditor.jar
と入力しても(※TreeEditor.jarがJARファイルの名前)、
Exception in thread "main" java.io.IOException: invalid header field name: Implementation-Version
at java.util.jar.Attributes.read(Unknown Source)
at java.util.jar.Manifest.read(Unknown Source)
at java.util.jar.Manifest.(Unknown Source)
at java.util.jar.JarFile.getManifestFromReference(Unknown Source)
at java.util.jar.JarFile.getManifest(Unknown Source)
のようにエラーが出る。
Implementation-Versionなんて何年も前からMANIFEST.MFに使われてるじゃねーかアホ。

だがMANIFEST.MFの該当する行をよく見ると。
Implementation-Version : 0.1.0
のコロンの前に空白が。他の行にはない。
こいつが原因かと考えて空白を取り除くと、無事起動するじゃないか。

( ゚Д゚)

(゚Д゚)

(゚Д:;.:...

教訓:MANIFEST.MFのコロンの前には空白を入れるな。

PageTop