Maven Servlet在部署到Tomcat时无法工作,尽管它在IntelliJ IDEA中工作

Maven Servlet在部署到Tomcat时无法工作,尽管它在IntelliJ IDEA中工作,maven,tomcat,intellij-idea,jersey,jax-rs,Maven,Tomcat,Intellij Idea,Jersey,Jax Rs,两个简单的POST和GETurl,localhost:8080/mdhtrestlet,从IntellijIDEA运行时都能完美工作。另外,mdht-restlet.war放入/opt/tomcat/webapp deploys,在tomcat应用程序管理器中显示为正在运行,在catalina.out中没有错误或警告。GET和POST都生成404。无论我是从命令行,mvn包,还是从IDEA,Build->Build Artifacts…生成WAR文件,结果都是一样的 如前所述,从IDEA运行/调

两个简单的
POST
GET
url,localhost:8080/mdhtrestlet,从IntellijIDEA运行时都能完美工作。另外,mdht-restlet.war放入/opt/tomcat/webapp deploys,在tomcat应用程序管理器中显示为正在运行,在catalina.out中没有错误或警告。GET和POST都生成404。无论我是从命令行,
mvn包
,还是从IDEA,
Build->Build Artifacts…
生成WAR文件,结果都是一样的

如前所述,从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>

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


为什么IntelliJ会有这样的想法?可能是因为
运行/调试配置
是如何在
服务器
选项卡(对于Tomcat)和
部署
选项卡中的设置之间设置的。这些都没有遵循(我在第一段中提出的要点),因此给人一种成功的假象(因为它们被劫持了)。

我很快就把Tomcat配置作为真正的问题,因为其余的都很简单。事实证明,如果我将mdht-restlet.war重命名为ROOT.war并将其放到webapps中,它就会部署并工作。
  <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>
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.";
  }
}