JAFの依存関係問題

Fessは依存しているJarファイルに含まれているクラスが重複しているかどうかをチェックしているだけど、JavaBeans Activation Framework(JAF)の依存関係が混沌としており、困っている。

ここに差分とかはまとめたけど、JAFは現状だと以下のものがある。
1) activation-1.1.1.jar
2) javax.activation-api-1.2.0.jar
3) jakarta.activation-api-1.2.2.jar
4) jakarta.activation-api-2.0.1.jar

今の世の中だと、jakartaのものがここでメンテされているので、これを使うべきなのだが、昔からあるライブラリなどは、activationを使っていたり、そんな簡単な話ではない…。

問題になるのは、依存しているライブラリがそれらのどれかに依存しているケースである。

2と3はほぼ同じと考えて良さそうなので、どちらもある場合は、2を依存関係から除外すれば良い。1と2を見ると、1にはcom.sunパッケージがあるので、これらを期待する場合は1を残す必要がある。3と4はパッケージ名が異なるので、3と4にそれぞれ依存関係が必要なライブラリがある場合は、2を追加しておくとか…。あまりにも混沌としている。

わかりにくすぎる感じがあるが、1〜4まですべてが必要な場合は、1と4だけがあれば、多くの場合で問題ないかなという感じがする。まぁ、できれば1でなく、3を使いたい気もするのが、4に打ち消されたりもするので…。

追記:jakarta.activationという-apiでなく、1のcom.sunパッケージが含んだものもあり、これを使えば、3とcom.sun.activationのjakarta.activation-2.0.1.jarを利用するパターンもあるらしい。なので、1と4より、このパターンのほうが良いかもしれない…。

JavaでAirPlayサーバ

ZOOMやGoogle Hangoutsでのミーティングが増える今日この頃だけど、今までのようにホワイトボードでささっと書いて済ませたいときも多い。さて、どうするかと思ったときに思いつくのが、iPadとかで書いてそれを画面共有とかできればなという感じかと思う。Macを使っていれば、AirPlayで送れば良いので話が早いのだが、WindowsやLinuxのときにはどうしたものかとなる。ググって調べると、古い情報が多く、試しても動かないものも多いし…。

ということで、今回試したのはjava-airplay-serverというもの。ただ、これだと、自分で実装しないといけないので、試すのはjava-airplay-server-examplesの方です。動かすには、Gradle 6くらいが必要らしい(Gralde 4だとコンパイルできなかった…) いくつかサンプルがあるけど、tcp-forwarderを動かします。

$ git clone https://github.com/serezhka/java-airplay-server-examples.git
$ cd java-airplay-server-examples/tcp-forwarder/
$ gradle bootRun

として、別なターミナルを開いて、

$ ffplay -f h264 -codec:v h264 -i tcp://localhost:5002

とすれば、準備完了です。あとは、iPadから画面ミラーリングを選択するとsrzhkaと表示されるので、それを選択すれば表示される。(一応表示されるけど、iPad Proを使って試した私の環境だと、そこそこ遅延がある感じでした…使えなくはないと思うけど)

JUL->Log4J2でログを出す

FessではLog4J2を利用しているが、Java標準のロギングのjava.util.loggingのログをLog4J2経由で出せていなかった…。なので、メモがてらに。

やらなきゃならないこととしては、依存関係にorg.apache.logging.log4j:log4j-julをまずは追加する。

あとは、起動時のシステムプロパティに以下を追加する。

-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager

とすれば、Log4J2で指定したものでログが出てくる。詳しいことはここを参照。

AdoptOpenJDKをパッケージで入れる

ここの情報によると、AdoptOpenJDKでようやくオフィシャルなRPMとDEBファイルが提供されるようになったらしい。というわけで、Ubuntu 18.04に入れてみる。

# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# echo deb https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ bionic main > /etc/apt/sources.list.d/adoptopenjdk.list
# apt-get update
# apt-get install adoptopenjdk-11-hotspot

という感じで簡単にインストールできる。

$ java -version
 openjdk version "11.0.3" 2019-04-16
 OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.3+7)
 OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.3+7, mixed mode)

デフォルトが変わらないようであれば

# update-alternatives --config java

をして切り替える。

Java9で日付のフォーマット変更

Java 11を真面目に使い始めて遭遇したのだが、Java 8まではDateFormat#getDateTimeInstanceで”M/d/yy h:mm a”のDateFormatが返ってきたけど、Java 9からは”M/d/yy, h:mm a”という感じで微妙にカンマが入る。ということで、今までどおりにパースはできない…。

JDK-8152154を見ると、-Djava.locale.providers=COMPAT,CLDR JI9032375 というオプションで前のも使えるらしい。