当我在外部 tomcat 中重新部署 war 文件时,本机库 mssql-jdbc_auth-8.4.1.x64.dll 已经加载到另一个类加载器中

Native library mssql-jdbc_auth-8.4.1.x64.dll already loaded in another classloader when I redeploy the war file in external tomcat

我有一个使用 ms-sql 数据库的 spring 引导应用程序,它在服务器新启动时正确部署在外部 tomcat,但是当我重新部署相同的 war 文件我收到以下错误(war 文件仍在部署但无法正常运行:

当我在外部 tomcat.

中重新部署 war 文件时,本机库 mssql-jdbc_auth-8.4.1.x64.dll 已经加载到另一个类加载器中

所以我取消部署 war 文件,重新启动 tomcat 服务器,然后重新部署它,它正在正确部署和工作(功能和 CRUD)。

我正在使用 tomcat 9.0.43,并且没有其他应用程序部署到服务器实例。

编辑:我在 windows 运行 tomcat 并且在 tomcat bin 文件夹中也有 .dll 文件。我还使用 maven 进行依赖管理。

该程序对数据库身份验证使用集成安全性

您的问题来自您想要对 WAR 文件进行双重使用:

  • 一方面,每当您使用 java -jar
  • 运行 WAR 文件时,您都需要 JDBC 驱动程序
  • 另一方面,只要 WAR 文件部署在 servlet 容器中,您不希望 Web 应用程序的类加载器中有 JDBC 驱动程序。 servlet 容器应提供驱动程序。

幸运的是 spring-boot-maven-plugin 已经在 repackage 目标中提供了这样的功能:所有标记为 provided 的依赖项(例如嵌入式 Tomcat 库)都被放置在 WEB-INF/lib-provided 文件夹中,因此不会被 servlet 容器加载。

因此你只需要将JDBC驱动标记为provided并将其添加到Tomcat的公共加载器的类路径($CATALINA_BASE/lib)。