我认为这是一个重复的问题,但我找不到解决方案。我已经用Maven开发了一个JAX-RS服务。
这是我的pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.diginreportengine.jersey</groupId>
<artifactId>digin-report</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>DiginReportEngine</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0.1</version>
<scope>provided</scope>
</dependency>
<build>
<finalName>Report</finalName>
</build>
</project>
web.xml:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>DigIn Report Engine</display-name>
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>
com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.diginreportengine.jersey.main</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/rs/*</url-pattern>
</servlet-mapping>
</web-app>
和代码:
@Path("GetReport")
public class ReportService {
@GET
@Path("{reportName}/{parameters}")
@Produces(MediaType.TEXT_PLAIN)
public Response getReport(@PathParam("reportName") String reportName,@PathParam("parameters") String parameters) {
}
@GET
@Path("{reportName}")
@Produces(MediaType.TEXT_PLAIN)
public Response startEngine(@PathParam("reportName") String command) {
return Response.status(200).entity("ok").build();
}
}
日志:
INFO: Loaded APR based Apache Tomcat Native library 1.2.5 using APR version 1.5.1.
Mar 31, 2016 1:17:37 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
Mar 31, 2016 1:17:38 PM org.apache.catalina.core.AprLifecycleListener initializeSSL
INFO: OpenSSL successfully initialized (OpenSSL 1.0.2g 1 Mar 2016)
Mar 31, 2016 1:17:38 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-apr-8085"]
Mar 31, 2016 1:17:38 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-apr-8009"]
Mar 31, 2016 1:17:38 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 2121 ms
Mar 31, 2016 1:17:38 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Mar 31, 2016 1:17:38 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/8.0.32
Mar 31, 2016 1:17:41 PM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Mar 31, 2016 1:17:41 PM org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [234] milliseconds.
Mar 31, 2016 1:17:44 PM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Mar 31, 2016 1:17:44 PM org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet jersey-serlvet as unavailable
Mar 31, 2016 1:17:44 PM org.apache.catalina.core.StandardContext loadOnStartup
SEVERE: Servlet [jersey-serlvet] in web application [/DiginReport] threw load() exception
java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1308)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1142)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:518)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:499)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1102)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1038)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4997)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5289)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Mar 31, 2016 1:17:44 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-apr-8085"]
Mar 31, 2016 1:17:44 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-apr-8009"]
Mar 31, 2016 1:17:44 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 5357 ms
您的配置很混乱:您添加了JAX-RS2.0依赖项,但在web.xml
部署描述符中使用的是Jersey 1.x配置。
我认为您希望使用Jersey 2.x,它是JAX-RS2.0规范的参考实现。
快速概述
Jersey 1.x和Jersey 2.x使用不同的包名称:
- 球衣1.x:
com.sun.jersey
- 球衣2.x:
org.glassfish.jersey
Jersey 1.x和Jersey 2.x实现了JAX-RS规范的不同版本:
- Jersey 1.x:JSR 311/JJAX-RS 1.0(
jsr311-api
工件) - Jersey 2.x:JSR339/JJAX-RS2.0(
javax.ws.rs-api
工件)
修复依赖关系
将pom.xml
中的依赖项更改如下:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<!-- if your container implements Servlet API older than 3.0,
use "jersey-container-servlet-core" -->
<artifactId>jersey-container-servlet</artifactId>
<version>2.22.2</version>
</dependency>
</dependencies>
有关Jersey模块和依赖项的更多详细信息,请参阅文档。
正在修复部署描述符
您使用的是Tomcat8.x,它支持Servlet API 3.1。对于简单的部署,根本不需要web.xml
部署描述符。
如果你愿意,你可以有一个空的,如下所示:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
</web-app>
但是,您需要一个用@ApplicationPath
注释的自定义Application
/ResourceConfig
子类来定义应用程序中配置的所有Jersey资源的基本应用程序URI:
@ApplicationPath("rs")
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages("com.diginreportengine.jersey.main");
}
}
如果您没有为基于Maven的web应用程序项目提供web.xml
部署描述符,则需要通过在项目pom.xml
文件中将failOnMissingWebXml
配置属性设置为false
来配置maven-war-plugin
以忽略丢失的web.xml
文件:
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
...
</plugins>
有关Jersey部署和运行时环境的更多详细信息,请参阅文档。