对于提供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 class-loader how-to

并感谢其中有一个父树,层次结构类加载器,并且jar文件位于:

<web-app>/WEB-INF/lib



仅可用于该Web应用程序,即被其他Web应用程序隐藏
导致应用程式War文件膨胀,因为每个网络应用程式都有自己的副本


该jar文件位于:

<tomcat-home>/lib



可供所有网络应用共享
强制所有Web应用程序使用相同版本的库
库必须是可在Web应用程序之间共享的,即无静态,线程安全等
通过JNDI资源工厂启用查找,例如JDBC,邮件等
抑制DriverManager的内存泄漏,例如JDBC


当JAX-WS库jar文件位于任一位置时,Web服务似乎可以工作。

看着Metro JAX-WS project
现在必须从中下载JAX-WS库jar的位置,我将它们放入 / lib中,因为这与ant文件中的“安装”选项一致。

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

谢谢阅读。

最佳答案

尝试将Web服务部署到我的本地tomcat安装时遇到了相同的问题。我采用了添加列出的jar的方法来进行操作,但是请参阅Apache的说明:

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

...我认为这将大大减少最终保存在Tomcat的lib文件夹中的jar数量。

09-04 05:58
查看更多