JAX-WS Web Services on Tomcat 8 – JAX-WS Library Files Location?

Viewed 6330

For a normal JSP web-app that provides web-services, where should the JAX-WS library jar files be placed?

<tomcat-home>/lib

or

<web-app>/WEB-INF/lib

and why?

In general, when are library files considered part of the container infrastructure or part of the web application?

DETAILS

I have implemented various JAX-WS web services following, among others, these guides:

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

Whilst the above guides were useful, there are differences in terms of both the required JAX-WS library jar files and where the JAX-WS library jar files should reside.

By trial and error, for JDK 1.8, Tomcat 8.0.30 & JAS-WS 2.2.10, this is the list of JAX-WS library jars that seem to be required:

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

I am aware that the JDK contains some of the JAX-WS classes but these seem to be meant for standalone Java apps ie all of the above jar files seem to be needed to avoid a ClassNotFoundException etc.

I have read the Tomcat 8 class-loader how-to

and appreciate that there is a parent-tree, hierarchal class loader and that jar files in:

<web-app>/WEB-INF/lib
  • are only available to that web app ie are hidden from other web apps
  • causes the app war file(s) to be bloated as each web app has it’s own copy

and that jar files in:

<tomcat-home>/lib
  • are available to and shared by all web apps
  • forces all web apps to use the same version of the library
  • libraries must be inter web-app shareable ie no statics, thread-safe etc
  • enables lookup via a JNDI Resource Factory eg JDBC, mail etc
  • suppresses memory leaks for DriverManager eg JDBC

The web services seem to work when the JAX-WS library jar files are in either location.

Looking at the Metro JAX-WS project, where the JAX-WS library jars must be downloaded from, for now, I have put these into <tomcat-home>/lib as that is consistent with the ‘install’ option in the ant file.

As a general rule, I try not to pollute the web-container / app-server with unnecessary library jar files where possible as this can lead to conflicts for other web-apps that have to use a specific version of a required library.

Thanks for reading.

1 Answers
Related