Tomcat 10.1でJSTLを利用する

最近、JSPを利用する人も少ないためか、JSTLをTomcatで使うための情報がなさそうな雰囲気でもあるので、メモがてらにポイントを書いておく。

まずは依存関係に入れるJARファイルですが、Mavenであれば以下の感じで追加する。

    <dependency>
      <groupId>jakarta.servlet.jsp.jstl</groupId>
      <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
      <version>3.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>jakarta.servlet.jsp.jstl</artifactId>
      <version>3.0.1</version>
    </dependency>

jakarta.servlet.jsp.jstlが実装なので、これを入れないと動かない。(これでちょっとハマりました…) なので、後者の方を入れないと以下のようなエラーが出ます。

Caused by: org.apache.jasper.JasperException: /WEB-INF/view/index.jsp (line: [1], column: [1]) Unable to find taglib [c] for URI: [jakarta.tags.core]

JARファイルを依存関係に追加しておけば、あとは、taglibの宣言も

<%@taglib prefix="c" uri="jakarta.tags.core"%>

のような感じで、http://〜で指定したuriがjakarta.tags.〜に変わってます。これも書き変えておきます。

この辺を対応すれば、Tomcatの以前のバージョンからも移行できると思います。(javaxからjakartaパッケージにいろいろと変えるという大きな作業はあるとは思いますが…)

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を使って試した私の環境だと、そこそこ遅延がある感じでした…使えなくはないと思うけど)