web-dev-qa-db-ja.com

ClassNotFoundException-com.Microsoft.jdbc.sqlserver.SQLServerDriver

Tomcat 7のローカルインストールを使用したWeb開発プロジェクトがあります。 Microsoftのjdbc用ドライバー(SQL Server 2012)を使用してsqljdbc41.jarに接続しようとしています。

sqljdbc41.jarは私のアプリケーションビルドパスにあります:

enter image description here

そして私はそれを輸出しています。さらに、Tomcatアプリケーションディレクトリlibフォルダーには、sqljdbc41.jarのコピーも配置しました。

コンパイルエラーはありませんが、実行時にSQL Serverドライバーをロードしようとすると、次のエラーが発生します。

ClassNotFoundException - com.Microsoft.jdbc.sqlserver.SQLServerDriver

例外は、次のコードブロックでスローされます。

Class.forName("com.Microsoft.sqlserver.jdbc.SQLServerDriver");
String connectionUrl = "jdbc:sqlserver://"+server+":1433;databaseName="+database+";user=sa;password="+password+";";
con = (Connection) DriverManager.getConnection(connectionUrl);

このトピックに関する多くの投稿を解決せずに見ました。

  1. Java.lang.ClassNotFoundException:com.Microsoft.jdbc.sqlserver.SQLServerDriver:適切なドライバーをロードしていますか?
  2. https://social.msdn.Microsoft.com/Forums/sqlserver/en-US/b425c201-9882-4a48-b049-4004f202b0c6/javalangclassnotfoundexception-commicrosoftsqlserverjdbcsqlserverdriver?forum=sqldataaccess
  3. コードでClassNotFoundExceptionを取得: "Class.forName(" com.Microsoft.sqlserver.jdbc.SqlServerDriver ");"

などなど。

コンパイラレベル1.7および1.7のJRE- ドキュメント によると、正しいドライバーを使用していると思われます。これは、CLASSPATHを設定する必要があることも示しています。

echo $CLASSPATH
/var/common/sqljdbc41.jar

どっちだ。さらに:

Java -version
Java version "1.7.0_75"
Java(TM) SE Runtime Environment (build 1.7.0_75-b13)
Java HotSpot(TM)
64-Bit Server VM (build 24.75-b04, mixed mode)

だから、なぜ私はまだこれに遭遇していますか?

更新

Microsoftからsqljdbc41.jarを再度ダウンロードしました-どういうわけか最初のjarファイルが破損していないことを確認するためです。

Mick Mnemonicのリンクに従って、Java Build path)からjarを削除し、新しくダウンロードしたjarをWebアプリケーションのWEB-INF/libフォルダーに配置し、EclipseとTomcatサーバーを再起動しました。 Tomcatサーバーとプロジェクトをクリーンアップしました。

まだClassNotFoundExceptionを取得しています。

また、Eclipse IDEはドライバーを見ることができます: enter image description here

11
Roy Hinkley

コードClass.forName("com.Microsoft.sqlserver.jdbc.SQLServerDriver")

ClassNotFoundException - com.Microsoft.jdbc.sqlserver.SQLServerDriverをスローできません

名前が異なるため。コードで正しく設定されていない可能性はありますか?

Webサイトからsqljdbc41.jarをダウンロードしたところ、クラスの正しい名前がcom.Microsoft.sqlserver.jdbc.SQLServerDriverであることがわかりました。

$ jar tf sqljdbc41.jar | grep SQLServerDriver.class
com/Microsoft/sqlserver/jdbc/SQLServerDriver.class

MicrosoftのWebドキュメントで両方の名前を見つけたので、ある時点でこのクラスの名前を変更した(パッケージを変更した)か、ドキュメントの一部にエラーがあります。

あなたがする必要があるのは、その.jarをTomcatのlibディレクトリ(例えば、Apache-Tomcat-7.0.67\lib)にドロップし、Tomcatを再起動することだけです。

正しいクラス名があり、libディレクトリに正しいjarがあり、まだそのエラーが表示される場合、Eclipseセットアップに何らかのタイプミスがあるのではないかと思います。壊れたクラス名。 (私はEclipseを使用していません。そこからデプロイすることも知りません)。

非常に単純なアプリケーションを作成してみてください(EclipseにMSドライバークラスを伝えないでください)。

@WebServlet("/")
public class SimpleServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // Set response content type
        resp.setContentType("text/html");
        PrintWriter out = resp.getWriter();
        out.println("<h1>" + "Welcome to the servlet!" + "</h1>");
        try {
            String server = "localhost";
            String database = "testDB";
            String password = "sapassword";

            Class.forName("com.Microsoft.sqlserver.jdbc.SQLServerDriver");
            String connectionUrl = "jdbc:sqlserver://"+server+":1433;databaseName="+database+";user=sa;password="+password+";";
            Connection con = (Connection) DriverManager.getConnection(connectionUrl);
        } catch (ClassNotFoundException e) {
            out.println("<h2>" + e.getClass().getSimpleName() + "_" + e.getMessage() + "</h2>");
        } catch (SQLException e){
            out.println("<h2>" + e.getClass().getSimpleName() + "_" + e.getMessage() + "</h2>");
        } finally {
            out.println("<h1>" + "That's the end of the servlet!" + "</h1>");
        }
    }
}

そしてそれを実行します。次のような出力が表示される場合:

Welcome to the servlet!

SQLServerException_The TCP/IP connection to the Host localhost, port 1433 has failed. Error: "Connection refused: connect. Verify the connection properties. Make sure that an instance of SQL Server is running on the Host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".

That's the end of the servlet!

これは、ドライバーが適切にロードされたことを意味します。接続に失敗しましたb/cテスト対象のSQLServerインスタンスが現在実行されていません。

ライブラリをcatalina.propertiesに追加する必要があるのは、コンテナ内の子アプリケーションの1つとしてだけでなく、コンテナのコア機能のコンテキスト内でDB接続を使用しているためです。

あなたが望むように私の答えに下票しますが、私はあなたに最初にそれをテストするだけです。

2
Robert-Ryan.

方言クラスに登録する必要があると思います:org.hibernate.dialect.SQLServer2012Dialect

それが春のプロジェクトだった場合、application.propertiesファイルに接続されます:

spring.datasource.driver-class-name=com.Microsoft.sqlserver.jdbc.SQLServerDriver
    spring.jpa.database-platform=org.hibernate.dialect.SQLServer2012Dialect
    spring.datasource.url=jdbc:sqlserver:database;user=sa;password=password;
    spring.datasource.username=sa
    spring.datasource.password=password

しかし、ここではまったく覚えていないようになります

1
Saahon

この投稿に関するすべてのコメントを見ると、提供されたほとんどすべてのオプションを試したことがあると思います。上記のスナップショットを見ると、開発にUnix/Linuxベースのシステムを使用していると思います。 WindowsおよびLinuxでCLASSPATH変数を更新する方法に変更があります。 ';'はWindowsで使用され、 ':'はLinuxで使用されます。あなたがそのような小さな詳細の世話をしたことを願っています:

あなたが直面している問題を解決するために与えられた多くの救済策があります、私はあなたが行くことをお勧めすることができる有用なリンクがあります: Link

1
N00b Pr0grammer