【发布时间】:2016-06-22 04:33:48
【问题描述】:
对于一个提供web-services的普通JSP web-app,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 class-loader how-to
并欣赏有一个父树,分层类加载器和 jar 文件:
<web-app>/WEB-INF/lib
- 仅适用于该网络应用程序,即对其他网络应用程序隐藏
- 导致应用程序战争文件膨胀,因为每个网络应用程序都有自己的副本
那个jar文件在:
<tomcat-home>/lib
- 可供所有网络应用使用和共享
- 强制所有网络应用使用相同版本的库
- 库必须在网络应用程序间共享,即没有静态、线程安全等
- 通过 JNDI 资源工厂(例如 JDBC、邮件等)启用查找
- 抑制 DriverManager 例如 JDBC 的内存泄漏
当 JAX-WS 库 jar 文件位于任一位置时,Web 服务似乎都可以工作。
看着Metro JAX-WS project,
JAX-WS 库 jar 必须从那里下载,现在,我已将它们放入
作为一般规则,我尽量不要用不必要的库 jar 文件污染 web-container/app-server,因为这可能会导致必须使用特定版本的所需库的其他 web-apps 发生冲突.
感谢阅读。
【问题讨论】:
标签: web-services jax-ws tomcat8