CentOS8でrpm実行時に「依存性の欠如」のエラーが起きた場合の対処

| [../](https://qiita.com/taconana/items/e45f19e83c825a9ba75e) |
---

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 のインストール時に、以下のような「依存性の欠如」のエラーが出た。

```bash

$ 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を追加でインストールしても、エラーは残ったままになる。

```bash
$ 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を実行すれば、依存性の欠如のエラーは出なくなった。

```bash
$ 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後に起動できなくなる現象の回避策](https://qiita.com/taconana/items/dd36e372be0cde6ab642)を参照のこと。
※実際には、私は、yum update直後に再起動してみたのだが、案の定、立ち上がらなくなった。リカバリモードでOSを再起動して、grub.cfgを修復した。そうならないように、grub.cfgの更新の有無をチェックして、必要ならバックアップで置換しておこう。

```bash
$ 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リポジトリも忘れないうちに元に戻しておくこと。

```bash
$ 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` で切り替えられるそうだ。

```bash
$ 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
```
	
以上

| [../](https://qiita.com/taconana/items/e45f19e83c825a9ba75e) |
---