Azure Java Web 应用程序将库添加到类路径

Azure Java Web App adding libraries to Classpath

我需要将 sqljdbc42.jar 库添加到类路径,以便我可以连接到 Azure SQL 数据库。我如何(如果可能)在 Azure Web 服务 - Web 应用程序(Java 与 Tomcat 服务器)中做到这一点。还有其他方法可以添加 JDBC 库吗?​​

服务器错误:

    java.sql.SQLException: No suitable driver found for jdbc:sqlserver://XXXXXXX.database.windows.net:1433;database=XXXXXX;user=XXXXX@XXXXX;password=XXXXXXXX;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:270)
    at common.DBConnection.<init>(DBConnection.java:23)
    at servlets.Login.doPost(Login.java:77)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
Dec 30, 2015 3:04:48 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [servlets.Login] in context with path [/deviceweb] threw exception
java.lang.NullPointerException
    at common.DBConnection.addParameter(DBConnection.java:33)
    at servlets.Login.doPost(Login.java:78)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

网页错误:

    type: Exception report

    message:

    description: The server encountered an internal error that prevented it from fulfilling this request.

    exception:

    java.lang.NullPointerException
        common.DBConnection.addParameter(DBConnection.java:33)
        servlets.Login.doPost(Login.java:78)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

note: The full stack trace of the root cause is available in the Apache Tomcat/8.0.30 logs.

连接字符串:

String connectionString = "jdbc:sqlserver://testnabaza.database.windows.net:1433;" + "database=testnabaza;"
            + "user=butterbeast@testnabaza;" + "password=1!qQaaaaaa;" + "encrypt=true;"
            + "trustServerCertificate=false;" + "hostNameInCertificate=*.database.windows.net;" + "loginTimeout=30;";

从门户复制: jdbc:sqlserver://testnabaza.database.windows.net:1433;database=testnabaza;user=butterbeast@testnabaza;password={your_password_here};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;登录超时=30;

解决此问题的最简单方法是简单地添加 sqljdbc42.jar 文件(可能位于 C:\Program Files\Microsoft SQL Server JDBC Driver\sqljdbc_3。 X\enu) 到我本地 Java 安装的 \lib\ext 目录,然后再创建 .zip 文件。

为了获得最佳帮助,请使用给定的 link https://dzone.com/articles/java-access-sql-azure-jdbc

根据我的经验,将 sqljdbc42.jar 库(请从官方网站 https://www.microsoft.com/en-US/download/details.aspx?id=11774 下载)添加到类路径的简单方法是拖动或复制 jdbc 驱动程序文件到Eclipse中Dynamic Web Project的目录WebContent/WEB-INF/lib,如下图

当您从 Eclipse 中的项目导出 war 文件时,库文件将包含在其中。然后,您可以使用 Tomcat 将 war 文件部署到 Java 的 Azure WebApp 中,它将正常工作。


大多数情况下的异常java.sql.SQLException: No suitable driver found是由于url不正确造成的。请检查您的连接字符串并将其正确用于 Java jdbc 编程。

作为参考,这是我的简单代码。

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String jdbcUrl = "jdbc:sqlserver://<host>.database.windows.net:1433;database=<database>;user=<username>@<host>;password=<password>;encrypt=true;hostNameInCertificate=*.database.windows.net;loginTimeout=30;";
String user = "<username>@<host>";
String password = "<password>";
Connection conn = DriverManager.getConnection(jdbcUrl, user, password);
PreparedStatement statement = conn.prepareStatement("select 1 as id, 'peter' as name");
ResultSet rs = statement.executeQuery();
while(rs.next()) {
    System.out.println(rs.getLong("id")+","+rs.getString("name"));
}
rs.close();
statement.close();

我收到 Azure 团队的回复,说我不可能用 Web App 解决这个问题,但我需要创建云服务:

Unfortunately JDBC libraries fall into an area where Tomcat pretty much forces you to put them in CATALINA_HOME\lib but then you need to make sure that the driver you put in will work for all your web apps in that Tomcat.

From what I remember this is tied to Tomcat memory leak prevention which makes Tomcat only scan CATALINA_HOME\lib once at Tomcat startup for database drivers. There are good reasons to do this tied to how the drivers register themselves with the JVM and how that impacts the classloader. Even if you wanted to disable this behaviro, you'd have to edit server.xml which would again drive you to have your own Tomcat install.

So the result of my rambling narrative is that you need to install Tomcat from the gallery or upload your own version and then drop your JDBC drivers in your Tomcat\lib directory. You are trying to do more than you can with the UI enablement of Java for your app.

https://azure.microsoft.com/en-us/documentation/articles/web-sites-java-add-app/

互联网上有过时的教程,但可以帮助您弄清楚该怎么做。 subhash singh link 帮助我了解了总体思路,但该教程已过时且有点混乱。