对于提供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数量。