質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

4441閲覧

JDBC経由でMySQLにアクセスすると、Unable to load authentication plugin 'caching_sha2_password'が発生してしまいます。

usako

総合スコア31

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2019/09/12 01:25

編集2019/10/01 01:49

前提・実現したいこと

閲覧いただき、ありがとうございます。
Eclipse,Spring,MySQL,JDBCを使ってJAVAの勉強をしている(超)初心者です。
タイトルにある通り、JDBC経由でMySqlにアクセスしにいくと、以下のエラーが
発生してしまいます。
ググって調べたところ、ver8.0以降、認証方式が変わったとのことでしたが、アクセスしているアカウントの
認証方式もコマンドプロンプトで調べたところ、caching_sha2_passwordになっており、MySqlもドライバも
8.0になっていることから問題ないように思えるのですが、うまくいきません。
どこを直せばよいのか、どこを調べればよいのか、どなたかご教示いただけないでしょうか。

発生している問題・エラーメッセージ

Request processing failed; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'.

該当のソースコード

(sevlet-context) ・ ・ ・ <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" /> <beans:property name="url" value="jdbc:mysql://127.0.0.1:3306/unit02" /> <beans:property name="username" value="root" /> <beans:property name="password" value="xxxxxxxx" /> </beans:bean> <beans:bean class="org.springframework.jdbc.core.JdbcTemplate"> <beans:constructor-arg ref="dataSource" /> </beans:bean> </beans:beans>
(pom.xml) <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>jp.practice</groupId> <artifactId>address</artifactId> <name>unit03</name> <packaging>war</packaging> <version>1.0.0-BUILD-SNAPSHOT</version> <properties> <java-version>1.8</java-version> <org.springframework-version>4.3.7.RELEASE </org.springframework-version> <org.aspectj-version>1.6.10</org.aspectj-version> <org.slf4j-version>1.6.6</org.slf4j-version> </properties> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.1.0.Final</version> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework-version}</version> <exclusions> <!-- Exclude Commons Logging in favor of SLF4j --> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework-version}</version> </dependency> <!-- add --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.2.3.RELEASE</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.45</version> </dependency> <!-- add --> <!-- AspectJ --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>${org.aspectj-version}</version> </dependency> <!-- Logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${org.slf4j-version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${org.slf4j-version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${org.slf4j-version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.15</version> <exclusions> <exclusion> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> </exclusion> <exclusion> <groupId>javax.jms</groupId> <artifactId>jms</artifactId> </exclusion> <exclusion> <groupId>com.sun.jdmk</groupId> <artifactId>jmxtools</artifactId> </exclusion> <exclusion> <groupId>com.sun.jmx</groupId> <artifactId>jmxri</artifactId> </exclusion> </exclusions> <scope>runtime</scope> </dependency> <!-- @Inject --> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> <!-- Servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- Test --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-eclipse-plugin</artifactId> <version>2.9</version> <configuration> <additionalProjectnatures> <projectnature>org.springframework.ide.eclipse.core.springnature </projectnature> </additionalProjectnatures> <additionalBuildcommands> <buildcommand>org.springframework.ide.eclipse.core.springbuilder </buildcommand> </additionalBuildcommands> <downloadSources>true</downloadSources> <downloadJavadocs>true</downloadJavadocs> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> <compilerArgument>-Xlint:all</compilerArgument> <showWarnings>true</showWarnings> <showDeprecation>true</showDeprecation> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <mainClass>org.test.int1.Main</mainClass> </configuration> </plugin> </plugins> </build> </project>

■10月1日追記

(修正前のlog4j.xml) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- Appenders --> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p: %c - %m%n" /> </layout> </appender> <!-- Application Loggers --> <logger name="jp.practice.address"> <level value="info" /> </logger> <!-- 3rdparty Loggers --> <logger name="org.springframework.core"> <level value="info" /> </logger> <logger name="org.springframework.beans"> <level value="info" /> </logger> <logger name="org.springframework.context"> <level value="info" /> </logger> <logger name="org.springframework.web"> <level value="info" /> </logger> <!-- Root Logger --> <root> <priority value="warn" /> <appender-ref ref="console" /> </root> </log4j:configuration>

試したこと

・sevlet-contectの<beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
のvalue値を"com.mysql.cj.jdbc.Driver"にしてみた。→別のエラーが発生して挫折。
###補足情報
MySql:ver.8.0.16
(確認方法:コマンドプロンプトでmysql --versionと入力実行)
Connector/J:ver.8.0.17
(確認方法:ユーザ変数PATHにC:\Program Files\MySQL\MySQL Shell 8.0\bin;が記載されており、その配下にmysql-connector-java-8.0.17.jarが存在する)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

現在のdatasourceのurlプロパティの値を(1)~(4)の順番で試してみてください。

jdbc:mysql://127.0.0.1:3306/unit02

(1)

xml

1jdbc:mysql://localhost:3306/unit02?sslMode=disabled&amp;allowPublicKeyRetrieval=true

(2)

xml

1jdbc:mysql://localhost:3306/unit02?sslMode=disabled&amp;allowPublicKeyRetrieval=true&amp;serverTimezone=Asia/Tokyo

(3)

xml

1jdbc:mysql://localhost:3306/unit02?useSSL=false&amp;allowPublicKeyRetrieval=true

(4)

xml

1jdbc:mysql://localhost:3306/unit02?useSSL=false&amp;allowPublicKeyRetrieval=true&amp;serverTimezone=Asia/Tokyo

これで接続できない場合はJDBC以外に原因があるかもしれませんので、プロジェクト情報の詳細を質問内容に追記して頂ければ、新しい回答が付くかもしれません。

2019/09/20追記

■(1) MySQLサーバのバージョンの確認方法について

MySQLサーバのバージョンを以下のコマンドで確認されたということですが、(※あながち間違いではありません)
これはmysql.exeというコマンドラインツールのバージョンを確認していることになりますので

> mysql --version

MySQLサーバのバージョンを確認するのであれば、以下の方法で確認するのが確実です。
コマンドプロンプトからmysqlでMySQLサーバにログインし

> mysql --host=localhost --port=3306 --user=<ユーザ名> -p --database=<データベース名>

以下のコマンドを実行します

sql

1> show variables like '%version%'; 2+--------------------------+------------------------------+ 3| Variable_name | Value | 4+--------------------------+------------------------------+ 5| immediate_server_version | 999999 | 6| innodb_version | 8.0.17 | 7| original_server_version | 999999 | 8| protocol_version | 10 | 9| slave_type_conversions | | 10| tls_version | TLSv1,TLSv1.1,TLSv1.2 | 11| version | 8.0.17 | 12| version_comment | MySQL Community Server - GPL | 13| version_compile_machine | x86_64 | 14| version_compile_os | Win64 | 15| version_compile_zlib | 1.2.11 | 16+--------------------------+------------------------------+ 1711 rows in set (0.00 sec)

または

sql

1> select version(); 2+-----------+ 3| version() | 4+-----------+ 5| 8.0.17 | 6+-----------+ 71 row in set (0.00 sec)

以上のコマンドでMySQLサーバのバージョン(この例では8.0.17)を確認できます。

■(2) MySQL JDBCドライバのバージョンの確認方法について

確認方法:ユーザ変数PATHにC:\Program Files\MySQL\MySQL Shell 8.0\bin;が記載されており、その配下にmysql-connector-java-8.0.17.jarが存在する

MySQL Shellというクライアントツールをインストールされているようですが、ここにあるmysql-connector-javaはMySQL Shell自体が利用するためのものであると思います。
(MySQL Shell自体使ったことが無いので推測で記述していますのでご了承ください。)

このmysql-connector-java-8.0.17.jarを、Spring Frameworkで開発しているJavaアプリケーションのクラスパスに追加していないのであれば、このjarファイルはJavaアプリケーションとは無関係と言えます。
また、環境変数PATHとクラスパスは関係はありません。

MavenプロジェクトのJavaアプリケーションが使用するJDBC ドライバを確認するのであればpom.xmlの依存関係を見ます。
以下の通り、追記して頂いたpom.xmlからMySQL JDBCドライバのバージョンが5.1.45であることがわかります。

<!-- add --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.2.3.RELEASE</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.45</version> </dependency> <!-- add -->

バージョン8のMySQL JDBCドライバを使うのであれば以下のように設定します。
mysql-connector-javaのバージョンは接続するMySQLサーバの同じバージョンに合わせておくといいと思います。
※MySQLサーバのバージョンが8.0.16であればversionに8.0.16と指定します。

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> <scope>runtime</scope> </dependency>

ちなみにspring-jdbcのバージョンですが4.2.3.RELEASEである必要が無ければ、下記のようにspring-webmvcのバージョンと合わせておくべきだと思います。

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.7.RELEASE</version> </dependency>

以上の設定が済んだら接続確認を行ってください。JDBC URLは最初の状態からはじめ
これでエラーが出るようであれば、上記記載のパターン(1)から(4)を順に試してみてください。

jdbc:mysql://localhost:3306/unit02

以上の内容を行ってまだエラーがでる場合、spring-jdbcがMySQL JDBCドライバのバージョン8に対応していないかもしれません。
この場合は、すでに認証方式がmysql_native_passwordなアカウントで接続できているということなので、そちらの内容で自己解決としてください。

接続が成功した場合、さらにコンテキストxmlの内容から下記の行を削除して再度接続確認を行ってください。

<beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />

削除しても接続できるのであれば、この記述は不要なので削除したままにしてください。

補足 (2019/09/27)

依存関係の確認方法

成果物(warファイル)を展開する方法より、簡単に依存関係を確認する方法があります。
Eclipseでpom.xmlを開くとエディタの下部にタブが表示されていると思います。その中から図の1.の"依存関係階層"を選択してください。
ここにはアプリケーションが依存するライブラリの情報が表示されます。
図の2.の"すべて縮小表示"のアイコンをクリックすると、pom.xmlに直接記述した依存関係が確認できます。(左側が依存関係をツリー状に表示したもの、右側が依存関係をフラットに表示したものです。)
イメージ説明

さらに図の"mysql-connector-java : 8.0.16"をクリックすると、mysql-connector-javaの下に"protobuf-java : 3.6.1"が表示されますが、これはmysql-connector-java自身が依存するライブラリです。
イメージ説明

つまり、アプリケーションはmysql-connector-javaに依存し、mysql-connector-javaはさらにprotobuf-javaに依存するという依存関係がわかります。

アプリケーション ---依存---> mysqlconnector-java ---依存---> protobuf-java

pom.xml上ではprotobuf-javaを依存関係に定義していませんが、mysql-connector-javaを依存関係に追加するだけで、それ以降の依存関係はmavenが自動的に解決し成果物に組み込んでくれます。
これを推移的依存関係の解決といいます。

ログ出力のカスタマイズ

ログを出力するにはロギングライブラリを使用します。ご質問のアプリケーションではlog4jが使われているようですので、log4j.xmlという設定ファイルを用意することでログ出力をカスタマイズできます。
フレームワークやライブラリもログを出力しているので、なにか問題が起きたときはログレベルをdebugなどにすることで原因を調査することができます。

たとえばJdbcTemplateのdebugレベルのログを出力するには、下記のようなロガーを宣言します。

xml

1<logger name="org.springframework.jdbc" additivity="false"> 2 <level value="debug" /> 3 <appender-ref ref="console" /> 4</logger>

JdbcTemplateを使ったデータベースアクセスが実行されると

java

1List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from user");

下記のようなデバッグログがコンソールに出力されます。下記の例では1行目のログで"select * from user"というselect文が実行されていることが確認できます。

[DEBUG] [http-nio-8080-exec-3] JdbcTemplate - Executing SQL query [select * from user] [DEBUG] [http-nio-8080-exec-3] DataSourceUtils - Fetching JDBC Connection from DataSource [DEBUG] [http-nio-8080-exec-3] DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:mysql://127.0.1:3306/test_db] [DEBUG] [http-nio-8080-exec-3] DataSourceUtils - Returning JDBC Connection to DataSource

ただし、フレームワークやライブラリのログをdebugレベルで出力するようにすると大量のログが出力されるので通常はinfoレベルにしておくといいと思います。

log4j.xmlのサンプル

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"> 3<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true" > 4 5 <!-- Appenders --> 6 <appender name="console" class="org.apache.log4j.ConsoleAppender"> 7 <param name="Target" value="System.out" /> 8 <layout class="org.apache.log4j.PatternLayout"> 9 <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %C - %m%n" /> 10 </layout> 11 </appender> 12 13 <appender name="file" class="org.apache.log4j.DailyRollingFileAppender"> 14 <param name="File" value="C:/var/logs/app.log" /> 15 <param name="Append" value="true" /> 16 <param name="Encoding" value="UTF-8" /> 17 <param name="DatePattern" value="'.'yyyy-MM-dd" /> 18 <layout class="org.apache.log4j.PatternLayout"> 19 <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %C - %m%n" /> 20 </layout> 21 </appender> 22 23 <!-- Application Loggers --> 24 <logger name="jp.practice.address"> 25 <level value="debug" /> 26 <appender-ref ref="console" /> 27 <appender-ref ref="file" /> 28 </logger> 29 30 <!-- 3rdparty Loggers --> 31 <!-- 32 <logger name="org.springframework.core" additivity="false"> 33 <level value="info" /> 34 <appender-ref ref="console" /> 35 </logger> 36 37 <logger name="org.springframework.beans" additivity="false"> 38 <level value="info" /> 39 <appender-ref ref="console" /> 40 </logger> 41 42 <logger name="org.springframework.context" additivity="false"> 43 <level value="info" /> 44 <appender-ref ref="console" /> 45 </logger> 46 47 <logger name="org.springframework.web" additivity="false"> 48 <level value="info" /> 49 <appender-ref ref="console" /> 50 </logger> 51 --> 52 53 <logger name="org.springframework.jdbc" additivity="false"> 54 <level value="debug" /> 55 <appender-ref ref="console" /> 56 <appender-ref ref="file" /> 57 </logger> 58 59 <!-- Root Logger --> 60 <root> 61 <level value ="info" /> 62 <appender-ref ref="console" /> 63 </root> 64</log4j:configuration>

投稿2019/09/18 06:09

編集2019/10/01 03:03
rubytomato

総合スコア1752

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

usako

2019/09/19 04:51

rubytomato様、回答ありがとうございます。 ご教授いただいたように修正しようとしたのですが、接続詞(&)を入力するとeclipseでエラーとなってしまいます。単文(sslMode=disabledだけとか)だけだとエラーにならなので順番に試してみたのですが、Unable to load authentication plugin 'caching_sha2_password'エラーは消えませんでした。 >プロジェクト情報の詳細を質問内容に追記して頂ければ、 程度が低くて申し訳ないのですが、プロジェクト情報の詳細とはどのような情報を指すのでしょうか。 あと、もう一点試したこととして、userという認証方式がmysql_native_passwordなアカウントを作成してアクセスするようにしたところ、正常にMySqlにアクセスできてしまいました。MySqlもConnector/Jもver8.0以上なのになぜ接続できるのかがわかりません。MySqlはーーversionでバージョンを確認しましたし、Connector/Jもパスの通っているC:\Program Files\MySQL\MySQL Shell 8.0\binにmysql-connector-java-8.0.17.jarが存在していることを確認したのですが・・・
rubytomato

2019/09/19 12:04

> 接続詞(&)を入力するとeclipseでエラーとなってしまいます。 失礼いたしました。xmlでは&は&amp;と書かないといけないようです。回答の方、訂正しましたのでもう一度お試しください。 > プロジェクト情報の詳細とはどのような情報を指すのでしょうか。 状況をもう少し把握してから回答致しますのでお待ちください。 > MySqlはーーversionでバージョンを確認しましたし、 バージョンを確認したコマンドを質問内容に追記してください。 > Connector/Jもパスの通っているC:\Program Files\MySQL\MySQL Shell 8.0\binにmysql-connector-java-8.0.17.jarが存在していることを確認したのですが・・・ この点について教えてください。「パスが通っている」ということですが、パスとはクラスパスのことでしょうか? その場合そこにあるjarファイルをクラスパスに追加しているということでしょうか? それと差支えなければ質問内容を修正してpom.xmlの内容を追記してください。
usako

2019/09/20 05:31

rubytomato様、お返事ありがとうございます! >xmlでは&は&amp;と書かないといけないようです。 &amp;としたところ、eclipseのエラーは消えたのですが、実行するとやはりUnable to load authentication plugin 'caching_sha2_password'が発生してしまいます。(4パターンとも) >バージョンを確認したコマンドを質問内容に追記してください。 補足情報のところにコマンドプロンプトで実行したコマンドを記載しました。 >「パスが通っている」ということですが、パスとはクラスパスのことでしょうか? その場合そこにあるjarファイルをクラスパスに追加しているということでしょうか? ユーザ変数のPATHにJarファイルの存在するフォルダを指定しています。システム変数のCLASSPATHは「.」しか指定していません。 >pom.xmlの内容を追記してください。 ソースコードのほうに貼らせていただきました。 お手数を煩わせて恐縮ですが、わかることがあればご教授ください。
rubytomato

2019/09/20 10:46

追記ありがとうございます。回答の方を編集しましたのでご確認ください。
usako

2019/09/26 10:56

rubytomato様、お返事ありがとうございます! そもそものバージョンの確認方法が間違っていたんですね・・・ show variables like '%version%';およびselect version();で確認したところ、MySQLのバージョンは8.0.16でした。ただ、spring-jdbcのバージョンですが、 >追記して頂いたpom.xmlからMySQL JDBCドライバのバージョンが5.1.45であることがわかります。 とあるのですが、これは元々、ネットでJDBCを使用するサンプルより切り貼りしただけで、5.1.45のモジュールが動作しているのかは不明です(汗)基本がわかっていなくて申訳ないのですが、 >MavenプロジェクトのJavaアプリケーションが使用するJDBC ドライバを確認するのであればpom.xmlの依存関係を見ます。 とあるように、POMのmysql-connector-javaを8.0.16に記載しただけでそのバージョンで動作してくれるということなのでしょうか? さて、まずはPOMを変更して動作検証!しようとしたのですが、なぜか動作不良になってしまい、404エラーが出てしまっています・・・ソースはここ数日触っていません。 POMを元に戻して今まで動作していた環境に戻してMavenインストール、オブジェクトの更新を行ってもうまくいきません・・・404エラーでここを調べたらよい、といったアドバイスがありましたらありがたいのですが・・・別質問をあげたほうがよいでしょうか。
rubytomato

2019/09/26 13:28

> POMのmysql-connector-javaを8.0.16に記載しただけでそのバージョンで動作してくれるということなのでしょうか? そのように理解して頂いて結構ですが、厳密に表現すればそのバージョンのjarファイルを依存関係に組み込んでくれるということになります。 プロジェクトをビルドするとプロジェクトディレクトリ下のtargetディレクトリにwarファイルが生成されると思います。 warファイルは7-Zipなどの圧縮ツールで展開させることができますので、試しにwarファイルを適当なディレクトリへコピーし7-Zipなどで展開してみてください。展開して出来たディレクトリ内にあるWEB-INF/libというディレクトリにwarファイルが依存するjarファイルがあることがわかると思います。 pom.xmlの依存関係にmysql-connector-javaのバージョン8.0.16を追加していれば、ここにmysql-connector-java-8.0.16.jarがあるはずです。他にもSpring Framework関係のjarなどもあると思いますが、このようにpom.xmlの依存関係に追加したライブラリはビルドすると成果物(warファイル)へ組み込まれます。(正確には依存関係に追加したライブラリすべてがwarに含まれる訳ではありませんが、この質問の主旨とはずれるので省略します。) > さて、まずはPOMを変更して動作検証!しようとしたのですが、なぜか動作不良になってしまい、404エラーが出てしまっています 以下の点を確認させてください。 1) pom.xmlを修正した後の状態でも「Unable to load authentication plugin 'caching_sha2_password'が発生してしまいます」は、依然として発生しているのでしょうか? 2) 「動作検証しようとした」ということですが、アプリケーションの起動自体は出来たということでしょうか? 3) 404エラーが発生するということですが、コントローラで実装したすべてのURLで404エラーが起きるのでしょうか? それとも特定のURLでのみ404エラーが起きるでしょうか? 特定のURLでのみ起きる場合、そのコントローラではデータベースにアクセスする処理が含まれていますか? 4) mysql-connector-javaのバージョン5では404エラーは発生せず(期待どおりのページが表示される)、バージョン8では404エラーが発生するということであれば、両方の起動ログの内容を比較して大きな違いがないかご確認ください。 もしくはバージョン8を利用した時の起動ログの中にエラーに関係しそうなログが無いかご確認ください。
usako

2019/09/27 07:37 編集

rubytomato様、お返事ありがとうございます! >展開して出来たディレクトリ内にあるWEB-INF/libというディレクトリにwarファイルが依存するjarファイルがあることがわかると思います。 はい。おっしゃる通りwarファイルを展開したらmysql-connector-java-8.0.16.jarが格納されていました!はじめて依存関係がどういうものなのか分かりました! >1) pom.xmlを修正した後の状態でも「Unable to load authentication plugin 'caching_sha2_password'が発生してしまいます」は、依然として発生しているのでしょうか? そこにたどり着く前に404エラーがでてしまっています。 今作っているプログラムは初期画面がまずあり、そこから一覧画面に遷移するボタンを押下すると、MySQLにアクセスしてデータを引っ張ってくる仕様です。なのでUnable to load authentication plugin 'caching_sha2_password'エラーも一覧画面に遷移する際に発生します。ただ今回は初期画面を表示するところで404エラーが発生しています。 ・・・ということだったのですが、本日(27日)もう一度「クリーン」を行ってプロジェクトを明示的にビルドしたところ、404エラーが発生しなくなりました。昨日も「クリーン」は行ったはずなのですが・・・いずれにせよ、確認不足で申訳ありませんでした。 ということで、再度、動作確認を行ったところ、(2)と(4)のパターンで正常動作することがわかりました。 sslModeかuseSSLを指定しているかの違いのようですが、設定値はどちらでも問題ないのでしょうか。 あと、後学のために教えていただけると嬉しいのですが、 >4) mysql-connector-javaのバージョン5では404エラーは発生せず(期待どおりのページが表示される)、バージョン8では404エラーが発生するということであれば、両方の起動ログの内容を比較して大きな違いがないかご確認ください。 起動ログというのは、コンソールに表示されるメッセージということでよろしいのでしょうか。エラーが発生した時にどのログを見ればいいのか分かっていません。もっぱらブラウザに表示されるログとコンソールに出力されるログにのみ頼っていますが、他にもこのログは見るべきだというのがありましたらご教授いただけないでしょうか。
rubytomato

2019/09/27 16:25

> はじめて依存関係がどういうものなのか分かりました! 依存関係の確認方法について、回答欄に補足しました。 > 本日(27日)もう一度「クリーン」を行ってプロジェクトを明示的にビルドしたところ、404エラーが発生しなくなりました。 問題は解決したということでいいでしょうか? > 再度、動作確認を行ったところ、(2)と(4)のパターンで正常動作することがわかりました。 sslModeかuseSSLを指定しているかの違いのようですが、設定値はどちらでも問題ないのでしょうか。 (2)が新しい書き方で、(4)は古い書き方です。(2)で動作したのであれば(2)のパターンを採用してください。 > 起動ログというのは、コンソールに表示されるメッセージということでよろしいのでしょうか。 はい、この質問内容ではその通りです。 なおロギングフレームワークの設定ファイルによって出力されるログの内容が変わります。また設定によってはコンソール以外にログファイルに出力されていることもあります。ログ出力のカスタマイズ方法も回答欄に補足しました。
usako

2019/09/30 05:58

rubytomato様、お返事ありがとうございます! >依存関係の確認方法について、回答欄に補足しました。 丁寧な説明、ありがとうございます。 >問題は解決したということでいいでしょうか? はい。今日も一度同じ事象が発生しましたが、クリーン+Maven Install+プロジェクトの更新を何度か行っているうちに正常動作するようになりました。何が原因だったのかまでは分かっていませんが。 >(2)で動作したのであれば(2)のパターンを採用してください。 はい。(2)に修正しました。 >ログ出力のカスタマイズ方法も回答欄に補足しました。 すみません、ここがあまり良く分かっていません。 log4j.xmlというファイルを作成して、 <logger name="org.springframework.jdbc" additivity="false"> <level value="debug" /> <appender-ref ref="console" /> </logger> を記載すればよいと思うのですが、このファイルはどこに格納すべきなのでしょうか。 また、このファイルを明示的に呼び出すことはしなくてよいのでしょうか。
rubytomato

2019/09/30 11:25

> 今日も一度同じ事象が発生しましたが、クリーン+Maven Install+プロジェクトの更新を何度か行っているうちに正常動作するようになりました。何が原因だったのかまでは分かっていませんが。 同じ事象というのは何ですか? 「Unable to load authentication plugin 'caching_sha2_password'が発生してしまいます」のことでしょうか? それとも「404エラーが発生しています」のことでしょうか? いずれにしても、現状の質問内容からは判断できないので私からはこれ以上コメントできません。 回答欄にも書いていますが、mysql-connector-java バージョン8とSpring JDBCのバージョンの問題かもしれませんので、頻発するようであればバージョン5に戻すということも検討されてみてはどうでしょうか?(その場合は自己解決で解決済みしてください) > log4j.xmlというファイルを作成して pom.xmlの依存関係にlog4jがあったので、既に有効にされているとおもったのですが作成されていないのであれば用意する必要があります。 なお、回答欄にlog4j.xmlのサンプルを追記しましたので参考にしてください。(ログファイルの出力先は環境に合わせて書き直しが必要です。) > このファイルはどこに格納すべきなのでしょうか。 > また、このファイルを明示的に呼び出すことはしなくてよいのでしょうか。 このファイルはクラスパス上にあればどこにあってもいいのですが、/src/main/resourcesに置くことが多いと思います。 クラスパス上に配置することでアプリケーション起動時に自動的に読み込んでくれるので、明示的な呼び出しは不要です。
usako

2019/10/01 01:41

rubytomato様、ご返信ありがとうございます! >同じ事象というのは何ですか? >「Unable to load authentication plugin 'caching_sha2_password'が発生してしまいます」 >のことでしょうか?それとも「404エラーが発生しています」のことでしょうか? 説明が足りず申訳ありません。404エラーのことでした。環境ファイルをいじっていると急に404エラーとなってしまうことが数回ありましたが、クリーンを行ったり再ビルドを行っているうちに収束します。 「Unable to load authentication plugin 'caching_sha2_password'が発生してしまいます」については、(2)の方法を実装して以降、発生しておりませんので、この対応でいこうと思っています。 >pom.xmlの依存関係にlog4jがあったので、既に有効にされているとおもったのですが作成されて >いないのであれば用意する必要があります。 ここらへんの記述は自動生成および他所からコピペした記述をそのまま流用しているだけなので、 私自身よくわかっていませんでした。 >このファイルはクラスパス上にあればどこにあってもいいのですが、/src/main/resourcesに >置くことが多いと思います。 よくよく確認したら/src/main/resourcesにlog4j.xmlがありました(確認不足で申訳ありません・・・) ですが、ログファイルの出力先などの記述がなく、このままで動作するのか?です。(上のソースのところに修正前のlog4j.xmlを貼りました) そこで、rubytomato様にご教授いただいたサンプルに中身を置き換え、<level value ="debug" />にして動作確認したのですが、指定していた出力先およびファイルC:/var/logs/app.logにファイルが作榮されません。まだ何か修正する必要があるのでしょうか?
rubytomato

2019/10/01 03:17 編集

> (2)の方法を実装して以降、発生しておりませんので、この対応でいこうと思っています。 わかりました。 > 指定していた出力先およびファイルC:/var/logs/app.logにファイルが作榮されません。まだ何か修正する必要があるのでしょうか? ログをファイルへ出力するにはロガーにファイル出力するアペンダーを追加する必要があります。 ロガーにはアペンダーを複数追加することができ、たとえば以下のような設定を行うとログがコンソールとファイルの両方へ出力されるようになります。ちなみにrefにはアペンダーの名前を指定します。 <logger name="org.springframework.jdbc" additivity="false"> <level value="debug" /> <appender-ref ref="console" /> <appender-ref ref="file" /> </logger> 回答欄のlog4j.xmlのサンプルを更新しましたので参考にしてください。なおルートロガーと同じログレベルのロガーをコメントアウトしていますが、コメントを外しても動作には変わりはないのでお好みで設定してください。 以前のコメントでも触れていたと思いますがフレームワーク系のログをデバッグレベルで出力すると大量のログが出力される可能性があります。なので必要が無いときはinfoレベルにしておくといいとおもいます。 ログ出力の設定で分からないことがあれば下記のサイトなどで調べるといいと思います。 Log4J の基本 https://www.techscore.com/tech/Java/ApacheJakarta/Log4J/1/ log4j.xml書き方メモ https://qiita.com/opengl-8080/items/f7e1f1b7e2b928427cb5
rubytomato

2019/10/01 03:32

それから、質問内容と直接関係ないのですがコメントのやり取りの中で気になった点があったので触れておきます。 > これは元々、ネットでJDBCを使用するサンプルより切り貼りしただけで、5.1.45のモジュールが動作しているのかは不明です > ここらへんの記述は自動生成および他所からコピペした記述をそのまま流用しているだけなので、 私自身よくわかっていませんでした。 分からないことをネットで調べるのは良いことだとおもいますし、私も分からないことはネットで調べています。 ただ、わからないままコピペすると問題解決から遠のくこともあると思いますのでご注意ください。 とくに古い記事や書かれている内容が曖昧だったりする場合は、少し時間をかけて複数の情報を集めて比較検討してみるという進め方も良いとおもいます。 最後に、質問欄に掲載のpom.xmlで、maven-eclipse-pluginとorg.codehaus.mojoを使われていますが、これらは必要なプラグインなのでしょうか? もしコピペでよくわからず定義しているのであれば、一旦コメントアウトしてみてはどうでしょうか? プロジェクトの状態をきれいに保つには不要な要素(プラグインやライブラリ)を常に排除するという姿勢が必要です。これはプログラマに求められる素養でもあると思っています。
usako

2019/10/02 08:29 編集

rubytomato様、返信ありがとうございます! >ログ出力の設定で分からないことがあれば下記のサイトなどで調べるといいと思います。 ありがとうございます!これでlog4j.xmlが何を記載しているのかが少しわかりました。 ただあまりよく分からなかったのが、logger name="org.springframework.core"・・・の個所のnameは何と紐づいているのでしょうか。パッケージ名という理解でよいのでしょうか。 無事、ログもコンソールおよびファイルに出力されるようになりました! >ただ、わからないままコピペすると問題解決から遠のくこともあると思いますのでご注意ください。 はい。肝に銘じます。 >もしコピペでよくわからず定義しているのであれば、一旦コメントアウトしてみてはどうでしょうか? >プロジェクトの状態をきれいに保つには不要な要素(プラグインやライブラリ)を常に排除するという >姿勢が必要です。これはプログラマに求められる素養でもあると思っています。 はい、ご教授ありがとうございます。調べてみたところ、プロジェクト自動生成時に作りこまれたもののようでした。ですが、試しにコメントアウトしてみたところ正常に動作してしまったので、コメントアウトのままでいこうと思います。 ちなみにmaven-eclipse-pluginはmavenプロジェクトをeclipseにインポートする際に必要なプラグインだと分かったのですが、org.codehaus.mojoはMaven絡みとまでは分かったものの、具体的には何をするプラグインなのか分かりませんでした。
rubytomato

2019/10/02 08:47

> logger name="org.springframework.core"・・・の個所のnameは何と紐づいているのでしょうか。パッケージ名という理解でよいのでしょうか。 この場合はその理解であっています。(必ずしもパッケージ名とは限らないという意味です) ロギングも時間ができたら調べてみることをお勧めします。なおlog4jは古く現在はlog4j2やlogbackなどが一般的です。 > 試しにコメントアウトしてみたところ正常に動作してしまったので、コメントアウトのままでいこうと思います。 それが良いと思います。
usako

2019/10/04 03:18

rubytomato様、いつもお返事ありがとうございます! >ロギングも時間ができたら調べてみることをお勧めします。なおlog4jは古く現在はlog4j2やlogback >などが一般的です。 了解しました。調べてみます! 色々とご教示いただいて、本当にありがとうございました。
rubytomato

2019/10/04 04:21

解決できたようでなによりです。 最後に、こちらまだ回答していなかったので回答致します。 >> プロジェクト情報の詳細とはどのような情報を指すのでしょうか。 > 状況をもう少し把握してから回答致しますのでお待ちください。 プロジェクト情報とは、今回の件でいえば下記のようなものになります。(プログラミング言語やフレームワーク、ライブラリによっては変わります) ・pom.xml ・web.xml ・Spring設定ファイル(コンテキストファイル) ・ソースコード(質問に関係のある or ありそうなコード) ・開発環境、つまりJavaのバージョン、IDEの種類とそのバージョン、IDE上のビルド設定(ビルド・パスの設定内容)、ビルドツール(例えばMaven)のバージョンの情報もあればいいと思います。 さらに、今回のご質問はJDBCだったのでDBサーバの情報は必要だと思います。 回答者によって必要とする情報は違うと思いますので一概には言えませんが、私はこれらの情報が提供されていると答えやすいと思っています。 プロジェクトの情報を全部出すと、かえってノイズになるので嫌がる回答者もいるかもしれませんが、その場合は要点を質問内容に掲載し、プロジェクトのソースコードはGitHubなどのコードホスティングサービスを利用して登録しておき、そのURLを質問内容に記載しておくといいかもしれません。
usako

2019/10/08 05:16

rubytomato様、最後までご配慮いただき、ただただ感謝です。 >プロジェクト情報とは、今回の件でいえば下記のようなものになります。 なるほど。これが分かっただけでも、少し質問がしやすくなりました。 >プロジェクトのソースコードはGitHubなどのコードホスティングサービスを利用して登録しておき、 >そのURLを質問内容に記載しておくといいかもしれません。 必ずしも質問欄にソースを貼らなくてもよいのですね。 今回も色々、ご教授いただきとてもためになりました。本当に最後まで面倒みていただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問