WeldとJava SEとGradleとIDEAと
Weldを使ってみようと思いました。普段DIはSpring一本槍なのですが、それもどうかと思ったので。
opengl-8080さんやKazuhiraさんのようないつもの方々が既にやられていることだし、すぐできるだろうと思ってました。
やるまでは。甘かったです。すぐできなかった。でも、あーだこーだとやってたら一応解決したので書いておきます。
結論からいうと、*.class
があるディレクトリにbeans.xml
さんがいる必要があります。Gradleとかでclassesとresourcesとかディレクトリが分かれてると、resourcesにbeans.xml
さんが行っちゃうので、動かない。
気づいてみればよくある話なんだけど、だいたいそんなもんだよね(´・ω・`)
やったこと
- とりあえずドキュメントの通りにやってみる
- なんか動かない
- CDIわかってないせいだと思ってJSR読んでみる
- 特に解決しない
- ざっくりWeldのソース読んでみる
- 特に解決しない
- ログ入れる
- jclの警告は出てたけどdebugも出すよーにした
- build/resources/main しか読んでないことに気づく
- Gradleでコピる
- 動いた
- けどIDEAでrebuildしたら動かなくなる
beans.xml
無しで読むようにWeldいじる- 動きはした
- けどまともな形にはならなかったし、やりすぎ感もある
- やりたいのはCDIを一通り触ってみることであって、Weld本体をいじることではないんですよ!!!←
- てかそのうち本体で対応するだろうし。。。
- 実行時にコピるようにする
- いまここ
ログは偉大だなとおもいました。まる。
まじめなことはGitHubに
ブログに雑なこと書いて、GitHubのREADMEに真面目なことを書くというのはどうだろう。
と思ってREADMEみたけど、真面目でもなかった。棲み分け……。
jBatchをgradle使ってSE環境で動かしてみる
- JSR352-Batch Applicationを試してみた(Batchlet編) - しおしお(´・ω・`)
- jBatch(JSR-352) on Java SE 環境 | 寺田 佳央 - Yoshio Terada
しおしおさんの書いたブログを見て、jBatch触ってみるかーという気になりました。
おれもそろそろjbatchかな
— いろふ@楽と雑を追い求めて (@irof) 2015, 6月 5
適当に書いてデプロイしたら動くとは思うんですが、EEサーバーどれにしようかとか面倒になったので、もうSEでやろうとなったわけです。 でまぁclasspathにjar突っ込むとかは面倒なので、gradleで出来んだろと。
てことで軽くやってみた。
たぶんミニマム構成。Batchlet
です。とりあえず動く感じ。
javax.inject
入れてないのでフィールド書いた瞬間落ちたりするけど、この辺はおいおい見ていこうと思います。
TimeUnitという物体
小ネタ。
java.util.concurrent.TimeUnit
というクラスはご存知だろうか。ご存知?なら回れ右してください。お疲れさまでした。またの機会によろしくお願いします。
...
さて、読み進めているならばご存知でないはずなので、まずJavadocのリンクをば。
J2SE 5.0 からいらっしゃるので、別段目新しくないどころか古参とも言えるクラスです。 クラスというかenumです。定義されている列挙はナノ秒、マイクロ秒、ミリ秒、秒、分、時、日の7種類。名前の通りTimeのUnitです。できることはその時間に応じた何かしら。
TimeUnit
を使えば、3日が何時間かとかすぐに出せます。忘れがちな「1日が何秒か?」とかにも答えてくれます。
long 三日の時間数 = TimeUnit.DAYS.toHours(3); long 一日の秒数 = TimeUnit.DAYS.toSeconds(1);
便利ですね!こんな使い方をしたことはありませんが。
...
なんで今回こんな記事を書いているか?それはこんなコードをなるべく見たくないからです。
// 3分スリープする Thread.sleep(3 * 60 * 1000);
3分とかコメントに書いてしまうと、コードを変更する時にコメントも変更しなきゃいけないです。二重メンテですね。で、コメントは変更しなくても動くので忘れられがちですし、変更忘れに気づいても対応は後回しにされがちです。なので書く必要がないならば書かないほうがいい。(このあたりは過去の記事を参照くださいませ。)
に対して、それっぽく書けるのがTimeUnit
さんです。
TimeUnit.MINUTES.sleep(3);
これならコメントも要らないですし、定型的な掛け算をしなくてもいいです。1000や60の意味を気にしなくて良くもなります。
掛け算せずに計算後の数字を180000
とか書いて0の数を間違えたりして、「そこで数値リテラルのアンダースコアだ!180_000
と書くんだ!」とか無理にProjectCoinを使おうとせずにTimeUnit
を使ったほうがいいと思うんです。
そんな事態に遭遇したことはないですけど。