Jersey Servlet 在 Tomcat 上运行?

YH.*_*ang 1 java rest tomcat servlets maven

目前,我的 jax-rs 服务似乎与 Jersey ServletContainer 一起使用,但在 Tomcat 上运行。这让我很困惑,因为根据我的理解,Jersey 是一个比 Tomcat 功能更多的服务器,并且不包含 Tomcat,但是现在,我的项目使用 Jersey 的库,但运行在 Tomcat 上,怎么会发生这种情况?

下面是我的 web.xml

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
</welcome-file-list>

<!-- Jersey Servlet -->
<servlet>
    <servlet-name>jersey-servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>main.java</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>jersey-servlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

下面是我的pom.xml(我使用Maven):

<modelVersion>4.0.0</modelVersion>

<packaging>war</packaging>

<build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <warSourceDirectory>web</warSourceDirectory>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>asm</groupId>
        <artifactId>asm</artifactId>
        <version>3.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20140107</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.40</version>
    </dependency>
    <!-- servlet dependencies -->
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.19</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.19</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>2.19</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>2.19</version>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

Luk*_*fer 5

Tomcat是一个 Java Web 服务器,它实现了多个(但不是全部)Java EE规范。另一个 Java Web 服务器是Jetty它们与GlassfishJBoss / WildFly等完整应用程序服务器的不同之处在于它们实现的Java EE规范的数量。相当小的Tomcat实现了JavaServer PagesJava Servlet,这对于很多应用程序来说已经足够了。

Jersey是一个 Java 库,用于服务和调用 REST(或主要是 HTTP,因为并非所有内容都是 REST)API。它建立在Java EE规范之上,因此可以在任何实现这些规范的服务器上使用,例如Tomcat

在您的web.xml文件中,您可以定义多个 servlet。servlet 的作用由<servlet-class>元素定义。您可以在HttpServlet. 在您的例子中,您使用的是Jersey servlet,然后它管理对其映射到的 URL ( <servlet-mapping>) 的所有请求。您现在可以学习如何使用Jersey、实现您所需的 API 行为并构建 Web 存档 ( .war)。然后可以将该 Web 存档部署到任何实现所需规范的 Web 服务器,例如Tomcat。如果您开始使用其他Java EE技术(例如Enterprise JavaBeans ),您需要检查哪个服务器实现实现了该技术。您可以使用Glassfish ,对于Jersey来说没有什么区别。

编辑:我忘了说Jersey是JAX-RS规范的一种可能(参考)实现,就像Tomcat是一种可能的Java Servlet(和其他)实现一样。然而,一个是 Web 服务器,另一个是 Web 服务库,因此不可能对它们进行比较或说其中一个比另一个具有“更多的功能”。