Idea+Maven+Jersey2+Tomcat配置Web服务

来源:互联网 发布:linux查看oracle版本 编辑:程序博客网 时间:2024/06/02 06:18

Idea+Maven+Jersey2+Tomcat配置Web服务

关于在Idea中使用Maven来管理配置Jersey2服务的文章有很多,本文主要总结自己踩过的一些坑,希望对大家有所帮助。


基本环境配置

  1. 可以参考博客:
    https://www.cnblogs.com/huaxingtianxia/p/5581259.html。
    https://www.cnblogs.com/MarsCheng/p/7245292.html。
  2. 需要注意的是包的导入,缺失一些包会导致服务无法正常运行。主要的包包括:
    服务器:jersey-server.jar 、jersey-container-servlet-core.jar、jersey-container-servlet.jar、javax.ws.rs-api-2.0.jar
    客户端:jersey-client.jar
    common:jersey-common.jar
    hk2:jersey-hk2.jar
    json支持:在Jersey2.0中需要使用 Jackson1.9 才能支持json。
  3. web.xml文件中配置jersey2中的继承ResourceConfig子类的servlet。在url-pattern中设置/*即可,不用加上工程名称。因为项目在部署到tomcat服务器上时,默认是加上项目名进行访问的。(当时这个地方搞了好久)

    <servlet>   <servlet-name>JerseyServlet</servlet-name>    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>    <init-param>        <param-name>javax.ws.rs.Application</param-name>        <param-value>app.MyRregister</param-value>    </init-param>    <load-on-startup>1</load-on-startup></servlet><servlet-mapping>    <servlet-name>JerseyServlet</servlet-name>    <url-pattern>/*</url-pattern></servlet-mapping>
  4. Idea配置运行的tomcat服务器:端口和将要发布到的tomcat端口保持一致,否则无法访问。(另外一个坑)
    这里写图片描述

  5. Idea配置运行的tomcat服务器:Deployment中war exploded中的Application context加上 “/+项目名称”,这样可以你平常在idea运行tomcat测试的API和你将来发布到tomcat的api保持一致。(后来发现不设置好像加上项目名也可以访问,建议加上,养成良好的习惯)
    这里写图片描述

  6. 在Idea启动tomcat服务时,遇到类似如下问题时候:

    org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752)    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728)    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1739)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    at java.lang.reflect.Method.invoke(Method.java:498)    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:482)    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:431)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    at java.lang.reflect.Method.invoke(Method.java:498)    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)    at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)    at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)    at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)    at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)    at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    at java.lang.reflect.Method.invoke(Method.java:498)    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)    at sun.rmi.transport.Transport$1.run(Transport.java:200)    at sun.rmi.transport.Transport$1.run(Transport.java:197)    at java.security.AccessController.doPrivileged(Native Method)    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)    at java.security.AccessController.doPrivileged(Native Method)    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)    at java.lang.Thread.run(Thread.java:748)Caused by: java.lang.NoClassDefFoundError: javax/ws/rs/ProcessingException

    一般由于jersey包没有导导入完全,但是我发现maven里面都添加了。其实“project setting”->“Artifacts”->“* exploded”->“WEB-INF”->“lib”中发现没有把“javax.ws.rs-api:2.1”这个包加到tomcat的运行环境中,导入启动tomcat的过程出错,因此需要手动点击添加,随后即可正常启动tomcat服务器。(这个很坑爹,希望有大神可以更好的解决)
    这里写图片描述


总结

最近配了两天这个问题,发现还是自己需要多看看原理,这样才能更好地配置环境之类的。

原创粉丝点击