| ../ |
VPSサーバー(CentOS8.2)にTomcat9とMySQL8.0をインストールしている。Tomcat9で受け付けたリクエストはJava11で処理し、データはMySQL8.0で永続化したい。MySQLへのアクセスには、JDBC(mysql-connector-java)を使用する。mysql-connector-javaをインストールする際に、若干ハマったのでメモしておく。その際に、yum updateを行ったら、CentOS8.3に上がっていた。
現象:java-headless依存性の欠如のエラー
mysql-connector-java-8.0.22-1.el8.noarch.rpm のインストール時に、以下のような「依存性の欠如」のエラーが出た。
$ rpm -ivh mysql-connector-java-8.0.22-1.el8.noarch.rpm
警告: mysql-connector-java-8.0.22-1.el8.noarch.rpm:
ヘッダー V3 DSA/SHA1 Signature、鍵 ID xxx: NOKEY
エラー: 依存性の欠如:
java-headless >= 1:1.8.0 は mysql-connector-java-1:8.0.22-1.el8.noarch
に必要とされています
ちなみに、上段の警告は、--nosignatureオプションを添えれば、問題ない。その次の「エラー: 依存性の欠如」が問題である。java-headlessをインストールしていなかったこと、またyumリポジトリからkarnel* grub2*
を除外していたため、おそらく適切なupdateができていなかったことが原因と思われる。
単純にjava-headlessを追加でインストールしても、エラーは残ったままになる。
$ yum install java-headless
$ rpm -ivh --nosignature mysql-connector-java-8.0.22-1.el8.noarch.rpm
エラー: 依存性の欠如:
java-headless >= 1:1.8.0 は mysql-connector-java-1:8.0.22-1.el8.noarch に必要とされています
解決手順:karnelのupdate後に再実行
yumリポジトリからkarnel* grub2*
を除外していたため、それ以降のいくつかのインストールやアップデートで依存性の問題が生じていたようだ。karnel* grub2*
を除外しないようにしてから、yum updateを実行し、その後でrpmを実行すれば、依存性の欠如のエラーは出なくなった。
$ vi /etc/yum.conf
# exclude=kernel* grub2* # 一旦、コメントアウトして除外しないようにする
$ yum update # kernelを含めていくつかのパッケージが更新された
$ cat /etc/redhat-release # またまた、CentOS8.3に上がった!
CentOS Linux release 8.3.2011
$ rpm -ivh --nosignature mysql-connector-java-8.0.22-1.el8.noarch.rpm
$ find -name mysql-connector-java
./usr/share/java/mysql-connector-java.jar
./usr/share/doc/mysql-connector-java
$ cp /usr/share/java/mysql-connector-java.jar ${CATALINA_HOME}/webapps/xxx/WEB-INF/lib/
インストールは成功し、mysql-connector-java.jarは、/usr/share/java/ に配置されていた。私の環境では、このjarファイルを適宜、所定の場所にコピーして利用する。
grub.cfgの回復
yum updateを実行したら、/boot/grub2/grub.cfg が更新されていないかチェックすること。私の場合、またしてもgrub.cfgが更新されていた。この状態でOSを再起動すると立ち上がらなくなる可能性がある。バックアップしておいたgrub.cfg.original(または grub.cfg.prmsave)で置換してrebootすること。この辺りの手順は、yum update後に起動できなくなる現象の回避策を参照のこと。
※実際には、私は、yum update直後に再起動してみたのだが、案の定、立ち上がらなくなった。リカバリモードでOSを再起動して、grub.cfgを修復した。そうならないように、grub.cfgの更新の有無をチェックして、必要ならバックアップで置換しておこう。
$ cd /boot/grub2/
$ ls -l
-rw-r--r-- 1 root root 6355 2020-12-09 18:23 grub.cfg
-rw-r--r-- 1 root root 4293 2020-11-20 15:14 grub.cfg.original
-rw------- 1 root root 1024 2020-12-10 10:02 grubegrub.cfgnv
-rw------- 1 root root 1024 2020-11-21 10:34 grubenv.original
$ mv grub.cfg grub.cfg.1209
$ cp -p grub.cfg.original grub.cfg
$ reboot
再起動できたら、改めてgrub2-mkconfigを実行して、grub.cfgを再作成し、再度、再起動する。yumリポジトリも忘れないうちに元に戻しておくこと。
$ grub2-mkconfig -o /boot/grub2/grub.cfg
$ vi /etc/yum.conf
exclude=kernel* grub2*
$ reboot
Javaバージョンの切り替え
新たな問題として、yum update を実行したら、なぜか java -version
が 1.8.0 に戻っていた。特に明示的な操作は記憶にないので、yum update 中に行われたと思われる。以下のエラーで気づいた。
java.lang.UnsupportedClassVersionError:
xxx has been compiled by a more recent version of the Java Runtime (class file version 55.0),
this version of the Java Runtime only recognizes class file versions up to 52.0 (クラス[xxx]をロードできません)
これはJava11でコンパイルしたものを、Java1.8のJRE環境で実行しようとしている。Java11に回復しておく必要がある。手作業でリンクを変更するのかと思ったが、alternatives --config java
で切り替えられるそうだ。
$ java -version
openjdk version "1.8.0_272"
OpenJDK Runtime Environment (build 1.8.0_272-b10)
OpenJDK 64-Bit Server VM (build 25.272-b10, mixed mode)
$ alternatives --config java
2 プログラムがあり 'java' を提供します。
選択 コマンド
-----------------------------------------------
1 java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.9.11-2.el8_3.x86_64/bin/java)
*+ 2 java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-3.el8_3.x86_64/jre/bin/java)
Enter を押して現在の選択 [+] を保持するか、選択番号を入力します: 1
$ java -version
openjdk version "11.0.9" 2020-10-20 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.9+11-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.9+11-LTS, mixed mode, sharing)
$ ls -l /usr/lib/jvm/
lrwxrwxrwx 1 root root 29 2020-12-10 15:09 java -> /etc/alternatives/java_sdk_11
lrwxrwxrwx 1 root root 37 2020-12-10 15:12 java-openjdk -> /etc/alternatives/java_sdk_11_openjdk
lrwxrwxrwx 1 root root 21 2020-12-10 15:16 jre -> /etc/alternatives/jre
以上