Tomcat 8 上的 JAX-WS Web Services – JAX-WS 库文件位置



对于提供 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 必须从中下载,现在,我已经将它们放入 /lib 中,因为这与 ant 文件中的"安装"选项一致。

作为一般规则,我尽量不要用不必要的库jar文件污染Web容器/应用程序服务器,因为这可能会导致必须使用所需库的特定版本的其他Web应用程序发生冲突。

感谢您的阅读。

尝试将 Web 服务部署到我的本地 tomcat 安装时遇到同样的问题。我按照添加您列出的罐子来启动它的路线,但请参阅Apache需要的说明:

https://tomcat.apache.org/tomcat-8.0-doc/extras.html#Web_Services_support_(JSR_109)

。我认为这将大大有助于最大限度地减少最终出现在 Tomcat lib 文件夹中的罐子数量。

最新更新