使用 REST with Jersey 2 + Tomcat 8 从 URL 中删除项目名称
Remove projectName from URL with REST with Jersey2 + Tomcat 8
我正在尝试使用 IntelliJ IDEA、Jersey v2.25.1、Maven 和 Tomcat v8.0.14 在 Java (JDK 1.8.0.121) 中构建一个简单的 REST 服务.
我在包 com.example
中用 GET 方法写了一个简单的 class
package com.example.rest;
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!";
}
}
我还创建了一个扩展应用程序的主要 class:
package com.example;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/api")
public class MyApp extends Application {
public MyApp(){
System.out.println("Server Up");
}
}
我的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">
<servlet>
<servlet-name>jersey-serlvet</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.rest</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
当我 运行 本地 Tomcat 中的应用程序全部工作并且 REST 在 http://localhost:8080/api/hello 处成功响应时。
当我将 myproject-1.0-SNAPSHOP.war 放在我的 VPS 上时,如果我访问:
http://vps_public_address:8080/api/hello 我收到 404 错误
但如果我访问:
http://vps_public_address:8080/myproject-1.0-SNAPSHOP/api/hello 有效。
为什么我必须在 REST URL 中写 "myproject-1.0-SNAPSHOP"?
是否可以避免将 war 名称放入请求中 URL?
提前致谢:)
是的,只需将 war 文件重命名为 ROOT.war 即可。
另一种可能是使用 maven-tomcat-plugin 进行部署,并在插件配置中设置上下文路径:
<project>
...
<build>
...
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<path>/</path>
</configuration>
</plugin>
...
</plugins>
...
</build>
...
</project>
我正在尝试使用 IntelliJ IDEA、Jersey v2.25.1、Maven 和 Tomcat v8.0.14 在 Java (JDK 1.8.0.121) 中构建一个简单的 REST 服务.
我在包 com.example
中用 GET 方法写了一个简单的 classpackage com.example.rest;
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!";
}
}
我还创建了一个扩展应用程序的主要 class:
package com.example;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/api")
public class MyApp extends Application {
public MyApp(){
System.out.println("Server Up");
}
}
我的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">
<servlet>
<servlet-name>jersey-serlvet</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.rest</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
当我 运行 本地 Tomcat 中的应用程序全部工作并且 REST 在 http://localhost:8080/api/hello 处成功响应时。
当我将 myproject-1.0-SNAPSHOP.war 放在我的 VPS 上时,如果我访问: http://vps_public_address:8080/api/hello 我收到 404 错误
但如果我访问: http://vps_public_address:8080/myproject-1.0-SNAPSHOP/api/hello 有效。
为什么我必须在 REST URL 中写 "myproject-1.0-SNAPSHOP"?
是否可以避免将 war 名称放入请求中 URL?
提前致谢:)
是的,只需将 war 文件重命名为 ROOT.war 即可。
另一种可能是使用 maven-tomcat-plugin 进行部署,并在插件配置中设置上下文路径:
<project>
...
<build>
...
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<path>/</path>
</configuration>
</plugin>
...
</plugins>
...
</build>
...
</project>