java - 使用 Maven、Jersey 和 Tomcat 8 从 Intellij 运行 REST 服务

标签 java rest maven tomcat intellij-idea

我正在尝试使用 Ubuntu 16.04、Oracle Java 8、Intellij 和 Maven、Jersey 和 Tomcat 8 运行 REST 服务示例。我正在遵循可在此处找到的教程 https://medium.com/@jamsesso/starting-out-with-jersey-apache-tomcat-using-intellij-6338d93ffd40#.heb2u4ros 。该示例使用 Tomcat 7,而我使用 Tomcat 8。当我运行将我发送到 http://localhost:8080/ 的代码时(但我认为它应该是 http://localhost:8080/hello 我已经尝试过了,它也给了我一个 404 )我没有收到来自 Intellij 的任何警告,但我得到了 HTTP Status 404 -type 状态报告消息描述 请求的资源不可用。 Web 浏览器中的 Apache Tomcat/8.0.32 (Ubuntu)。从命令行启动 Tomcat 服务器工作正常,并显示欢迎消息。我已经在 stackoverflow 上找到了所有类似的问题,但我无法解决问题。如果您对我的代码有什么问题提出任何建议,我将非常高兴。

我的代码如下。

web.xml
<!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>

<servlet>
    <servlet-name>Example API</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.example.jersey</param-value>
    </init-param>

    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>Example API</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>

_

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.example.jersey</groupId>
<artifactId>RESTServer</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-bundle</artifactId>
        <version>1.18.3</version>
    </dependency>
</dependencies>
</project>

_

package com.example.jersey;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class HelloWorld {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getMessage() {
        return "Hello world!";
    }
}

Intellij 的输出

/usr/share/tomcat8/bin/catalina.sh run
[2016-07-10 08:17:15,670] Artifact RESTServer:war exploded: Server is not connected. Deploy is not available.
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version:        Apache Tomcat/8.0.32 (Ubuntu)
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built:          Jul 6 2016 11:49:29 UTC
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server number:         8.0.32.0
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Name:               Linux
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Version:            4.4.0-28-generic
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture:          amd64
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Java Home:             /usr/lib/jvm/java-8-oracle/jre
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Version:           1.8.0_91-b14
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Vendor:            Oracle Corporation
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_BASE:         /home/mikael/.IntelliJIdea2016.1/system/tomcat/Unnamed_RESTServer_2
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_HOME:         /usr/share/tomcat8
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.util.logging.config.file=/home/mikael/.IntelliJIdea2016.1/system/tomcat/Unnamed_RESTServer_2/conf/logging.properties
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcom.sun.management.jmxremote=
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcom.sun.management.jmxremote.port=1099
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcom.sun.management.jmxremote.ssl=false
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcom.sun.management.jmxremote.authenticate=false
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.rmi.server.hostname=127.0.0.1
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.endorsed.dirs=/usr/share/tomcat8/endorsed
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.base=/home/mikael/.IntelliJIdea2016.1/system/tomcat/Unnamed_RESTServer_2
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.home=/usr/share/tomcat8
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.io.tmpdir=/home/mikael/.IntelliJIdea2016.1/system/tomcat/Unnamed_RESTServer_2/temp
Jul 10, 2016 8:17:17 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
Jul 10, 2016 8:17:17 AM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Jul 10, 2016 8:17:17 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1586 ms
Jul 10, 2016 8:17:18 AM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Jul 10, 2016 8:17:18 AM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/8.0.32 (Ubuntu)
Jul 10, 2016 8:17:18 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
Jul 10, 2016 8:17:18 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 188 ms
Connected to server
[2016-07-10 08:17:18,307] Artifact RESTServer:war exploded: Artifact is being deployed, please wait...
Jul 10, 2016 8:17:19 AM 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.
[2016-07-10 08:17:19,467] Artifact RESTServer:war exploded: Artifact is deployed successfully
[2016-07-10 08:17:19,468] Artifact RESTServer:war exploded: Deploy took 1,161 milliseconds

最佳答案

我设法让它工作。主要问题是示例使用的 Servlet 版本和 Jersey 版本以及我能够使用的版本之间的差异。该示例使用 Servlet 3.0,而我使用 3.1。我在这里可能是错的,但我认为 Servlet 3.1 迫使我使用 Jersey 2。这两个差异意味着 web.xmlpom.xml 文件需要反射(reflect)这些变化。我在下面发布了更新的 web.xmlpom.xml

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">

    <display-name>Archetype Created Web Application</display-name>

    <servlet>
        <servlet-name>Example API</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.example.jersey</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Example API</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

-

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.example.jersey</groupId>
    <artifactId>stack</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <version>2.13</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.13</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>stack</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.5</version>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <name>Stack</name>
</project>

关于java - 使用 Maven、Jersey 和 Tomcat 8 从 Intellij 运行 REST 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38289537/

相关文章:

jquery - 通过Rest服务器登录Drupal

maven - 为什么 Maven 无法从 azure Artifact 存储库下载 "SNAPSHOT" Artifact ? (快照到时间戳的转换出现故障)

java - Spring MVC - 如何将继承类型从jsp传递到 Controller

java - 无法使用 @Component 属性传递可运行类的参数

java - 嵌套异常是 java.lang.ClassNotFoundException : org. springframework.web.servlet.view.json.JsonView

api - API 的基准测试/性能测试 - REST/SOAP

javascript - ExtJS RESTful服务无法处理json数据

java - Maven - 编译主模块时未检测到

java - 如何跟踪 Eclipse 中编译错误的错误?

java - Java中的字符串到未知数字类型