当我在外部 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
)。
我有一个使用 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
)。