对于提供 Web 服务的普通 JSP Web 应用程序,JAX-WS 库 jar 文件应该放在哪里?
<tomcat-home>/lib
或
<web-app>/WEB-INF/lib
为什么呢?
通常,库文件何时被视为容器基础结构的一部分或 Web 应用程序的一部分?
详
我已经实现了各种 JAX-WS Web 服务,其中包括以下指南:
https://jax-ws.java.net/2.2.10/docs
https://jaxenter.com/creating-soap-web-services-using-jax-ws-117689.html
http://www.mkyong.com/webservices/jax-ws/deploy-jax-ws-web-services-on-tomcat/
http://examples.javacodegeeks.com/enterprise-java/jws/jax-ws-web-services-on-tomcat/
http://www.java2blog.com/2013/03/jaxws-webservice-deployement-on-tomcat.html
虽然上述指南很有用,但在所需的 JAX-WS 库 jar 文件和 JAX-WS 库 jar 文件应驻留的位置方面存在差异。
通过反复试验,对于 JDK 1.8、Tomcat 8.0.30 和 JAS-WS 2.2.10,以下是似乎是必需的 JAX-WS 库 jar 列表:
gmbal-api-only.jar
ha-api.jar
jaxb-core.jar
jaxb-impl.jar
jaxws-api.jar
jaxws-rt.jar
management-api.jar
policy.jar
stax-ex.jar
streambuffer.jar
我知道JDK包含一些JAX-WS类,但这些类似乎是为独立的Java应用程序准备的。即上述所有jar文件似乎都需要避免ClassNotFoundException等。
我已经阅读了 Tomcat 8 类加载器操作指南
并赞赏有一个父树,分层类加载器和jar文件:
<web-app>/WEB-INF/lib
- 仅适用于该 Web 应用程序,
- 即对其他 Web 应用程序隐藏
- 导致应用程序战争文件膨胀,因为每个 Web 应用程序都有自己的副本
并且该 jar 文件在:
<tomcat-home>/lib
- 可供所有 Web 应用使用并由其共享
- 强制所有 Web 应用使用相同版本的库
- 库必须是可共享的 Web 应用程序,即没有静态、线程安全等
- 通过 JNDI 资源工厂(例如 JDBC、邮件等)启用查找
- 抑制驱动程序管理器的内存泄漏,例如 JDBC
当 JAX-WS 库 jar 文件位于任一位置时,Web 服务似乎可以工作。
看看地铁JAX-WS项目,JAX-WS 库 jar 必须从中下载,现在,我已经将它们放入
作为一般规则,我尽量不要用不必要的库jar文件污染Web容器/应用程序服务器,因为这可能会导致必须使用所需库的特定版本的其他Web应用程序发生冲突。
感谢您的阅读。
尝试将 Web 服务部署到我的本地 tomcat 安装时遇到同样的问题。我按照添加您列出的罐子来启动它的路线,但请参阅Apache需要的说明:
https://tomcat.apache.org/tomcat-8.0-doc/extras.html#Web_Services_support_(JSR_109)
。我认为这将大大有助于最大限度地减少最终出现在 Tomcat lib 文件夹中的罐子数量。