Tomcat 7
のローカルインストールを使用したWeb開発プロジェクトがあります。 Microsoftのjdbc用ドライバー(SQL Server 2012
)を使用してsqljdbc41.jar
に接続しようとしています。
sqljdbc41.jar
は私のアプリケーションビルドパスにあります:
そして私はそれを輸出しています。さらに、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.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
を取得しています。
コード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接続を使用しているためです。
あなたが望むように私の答えに下票しますが、私はあなたに最初にそれをテストするだけです。
方言クラスに登録する必要があると思います: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
しかし、ここではまったく覚えていないようになります
この投稿に関するすべてのコメントを見ると、提供されたほとんどすべてのオプションを試したことがあると思います。上記のスナップショットを見ると、開発にUnix/Linuxベースのシステムを使用していると思います。 WindowsおよびLinuxでCLASSPATH変数を更新する方法に変更があります。 ';'はWindowsで使用され、 ':'はLinuxで使用されます。あなたがそのような小さな詳細の世話をしたことを願っています:
あなたが直面している問題を解決するために与えられた多くの救済策があります、私はあなたが行くことをお勧めすることができる有用なリンクがあります: Link