maven - 尽管 Servlet 在 IntelliJ IDEA 中工作,但在部署到 Tomcat 时无法工作

标签 maven tomcat intellij-idea jersey jax-rs

两个简单的 POSTGET URL,localhost:8080/mdht-reSTLet,在从 IntelliJ IDEA 运行时都能完美运行。另外,mdht-reSTLet.war 放入 /opt/tomcat/webapp 部署,在 Tomcat Application Manager 中显示为正在运行,catalina 中没有错误或警告。出。 GET 和 POST 都产生 404。无论我是从命令行生成 WAR 文件,mvn package,还是从 IDEA,Build->Build Artifacts...,结果是一样的。

如前所述,它在 IDEA 运行/调试中完美运行。我不确定要看什么。以下是一些相关细节:

web.xml 内容:

  <servlet>
    <servlet-name>mdht-restlet</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.windofkeltia.servlet</param-value>
    </init-param>    
  </servlet>

  <servlet-mapping>
    <servlet-name>mdht-restlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

pom.xml 为 WAR 构建插件:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>${maven-war-plugin.version}</version>
    <configuration>
      <webResources>
        <resource>
          <!-- this is relative to the project parent directory -->
          <directory>web</directory>
        </resource>
      </webResources>
    </configuration>
  </plugin>

MdhtReSTLet.java:

package com.windofkeltia.servlet;
...
@Path( "/mdht-restlet" )
public class MdhtRestlet
{
  @POST
  @Consumes( MediaType.TEXT_PLAIN )
  @Produces( MediaType.TEXT_XML )
  public Response postPatientData( @Context HttpServletRequest request, @Context HttpHeaders header )
  {
    ...
  }

  @GET
  @Produces( MediaType.TEXT_PLAIN )
  public String getStatusInPlainText()
  {
    return "The MDHT restlet is up.";
  }
}

最佳答案

答案是 Tomcat 将 WAR 文件的名称(在本例中为 mdht-reSTLet.war)视为根(除非您将 WAR 文件重命名为 Tomcat部署到ROOT的ROOT.war),所以URL以 http://localhost:8080/mdht-restlet开头。除此之外,servlet Java 代码在类级别使用 @PATH 注释来添加到 URL。这将其扩充为 http://localhost:8080/mdht-restlet/mdht-restlet ,所以除了 404,较短的 URL 永远不会做其他事情。

为什么IntelliJ IDEA会得到这个?可能是因为 Run/Debug Configuration 是如何在 Server 选项卡(对于 Tomcat)和 Deployment 选项卡中设置的。这些并没有遵循(我第一段中提出的要点),因此给人一种成功的错误印象(因为他们被劫持了)。

关于maven - 尽管 Servlet 在 IntelliJ IDEA 中工作,但在部署到 Tomcat 时无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50879989/

相关文章:

java - 使用 Java 14 的 IntelliJ 2020.1 中的 "Records"预览功能在 Maven `install` 期间因编译器错误而失败,但以其他方式运行

jsf - 使用 JSF 应用程序下载日志文件?

java - 减少 IntelliJ IDEA 内存使用的方法?

java - JUnit getMethodName 返回 null

java - Maven + Eclipse : Adding exclusions

java - servlet 真的可以访问 Tomcat 的 lib 目录中的 jar 吗?

java - 为intelliJ设置JAVA_HOME?

java - 配置 IntelliJ 以使用反编译 jar 源代码的正确方法

maven - 如何从不知道要卸载的 Artifact 的名称或组 ID 的脚本执行 mvn install 的相反操作?

tomcat - AWS Elasticbeanstalk 上的 ALLOW_ENCODED_SLASH