原因
fat JAR で起動するタイプのアプリで、fat JAR 内に暗号化ライブラリが含まれる形だと発生する
sun jdk support · Issue #5 · web-push-libs/webpush-java
BouncyCastle JAR は署名されているが、fat JAR に入るときに署名を壊して抽出されて fat JAR に入れられるため、らしい。
対応方法
- 暗号化ライブラリを
$JAVA_HOME/jre/lib/ext
に入れて fat JAR を起動する- dependencies から除外する必要があるかは未検証
- Add command-line interface · web-push-libs/webpush-java@184c34b では exclude している
- web-push-libs/webpush-java: Web Push library for Java
- “This library depends on BouncyCastle, which acts as a Java Cryptography Extension (JCE) provider. BouncyCastle’s JARs are signed, and depending on how you package your application, you may need to include BouncyCastle yourself as well.”
- “このライブラリはJava暗号化拡張(JCE)プロバイダとして機能するBouncyCastleに依存します。 BouncyCastleのJARが署名されています。アプリケーションのパッケージ方法によっては、BouncyCastleも一緒に組み込む必要があります。”
- https://stackoverflow.com/a/17400821
$JAVA_HOME/jre/lib/security/java.security
で優先順位っぽいものも更新する?
- dependencies から除外する必要があるかは未検証
要は、fat JAR 外に jar を配置して、クラスパスに含ませて、アプリケーションを実行する形になればよさげ。
課題
- 開発環境構築に特別な手順をふませたくない
- dependencies は
provided
にしておく- コンパイル通る
- sbt の
lib
に jar をいれておく- 普通に起動した場合はクラスパスに含まれるので問題なし
- fat JAR 作成では lib 内の jar は含まれない、ハズ
- ざっと確認したところ含まれなかった、skinny の package:standalone の場合
- fat JAR 起動の場合は、起動前に
lib
内の jar を$JAVA_HOME/jre/lib/ext
にコピーしてから起動させる
- dependencies は
上記の感じでうまくいったっぽい。