【问题标题】:Start Jersey application with Jetty使用 Jetty 启动 Jersey 应用程序
【发布时间】:2014-10-06 14:38:56
【问题描述】:

我在我的 Ubuntu 服务器 VCS 中安装了 jetty 9 服务器。 java rest项目结构:

/opt/jetty/webapps/后端/

  • 构建
  • 配置
  • 日志
  • src/com/example/package/backend
    • 资源
      • CategoryResource.java
    • BackendServer.java
  • 网络
    • WEB-INF
      • web.xml

BackendServer.java

import com.sun.jersey.api.container.httpserver.HttpServerFactory;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.net.httpserver.HttpServer;

public class BackendServer {

    public static void main(String[] args) throws IOException {
        HttpServer server = HttpServerFactory.create("http://localhost:" + "8080" + "/" + "backend/rest", new PackagesResourceConfig("com.droidbrew.androcommerce.backend.resources"));
        DbManager.getInstance();
        server.start();

        System.out.println("Server running");
        System.out.println("Hit return to stop...");
        System.in.read();
        System.out.println("Stopping server");
        server.stop(0);
        System.out.println("Server stopped");
    }
}

CategoryResource.java

Path("/category")
public class CategoryResource {

    @GET
    @Path("/get_all_categories")
    @Produces({MediaType.APPLICATION_JSON})
    public String getAllCategories() throws SQLException {
        List<Category> categoryList = DbManager.getInstance().getBackendCategoryManager().getAllCategories();
        Gson gson = new Gson();
        return gson.toJson(categoryList);
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Jersey</display-name>
  <welcome-file-list>
      <welcome-file>index.html</welcome-file>
  </welcome-file-list>

  <servlet>
      <servlet-name>Jersey REST Service</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.droidbrew.androcommerce.backend.resources</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
      <servlet-name>Jersey REST Service</servlet-name>
      <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

/opt/jetty/webapps/backend.xml

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
    <Set name="configurationClasses">
            <Array type="java.lang.String">
              <Item>org.mortbay.jetty.webapp.WebInfConfiguration</Item>
              <Item>org.mortbay.jetty.plus.webapp.EnvConfiguration</Item>
              <Item>org.mortbay.jetty.plus.webapp.Configuration</Item>
              <Item>org.mortbay.jetty.webapp.JettyWebXmlConfiguration</Item>
              <Item>org.mortbay.jetty.webapp.TagLibConfiguration</Item>
            </Array>
    </Set>
    <Set name="contextPath">/</Set>
    <Set name="resourceBase"><SystemProperty name="jetty.home" default="."/>/webapps/backend</Set>

    <New id="development" class="org.mortbay.jetty.plus.naming.Resource">
            <Arg>jdbc/development</Arg>
            <Arg>
                    <New class="org.postgresql.ds.PGConnectionPoolDataSource">
                            <Set name="User">user</Set>
                            <Set name="Password">1111</Set>
                            <Set name="DatabaseName">development</Set>
                            <Set name="ServerName">localhost</Set>
                            <Set name="PortNumber">5432</Set>
                    </New>
            </Arg>
    </New>
</Configure>

但是在我启动service jetty start 并尝试连接ip:8085/backend/rest/category/get_all_categories 之后,我得到:

HTTP 错误:404

访问问题 /backend/rest/category/get_all_categories。 原因

未找到

更新 java -DDEBUG -jar start.jar之后的日志

sudo java -DDEBUG -jar start.jar
System Property [DEBUG] has been deprecated! (Use org.eclipse.jetty.LEVEL=DEBUG instead)
2014-10-06 13:09:09.522:INFO::main: Logging initialized @1090ms
ShutdownMonitor not in use (port < 0): -1
2014-10-06 13:09:10.047:INFO:oejs.Server:main: jetty-9.2.3.v20140905
2014-10-06 13:09:10.073:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:/opt/jetty/webapps/] at interval 1
2014-10-06 13:09:10.096:WARN:oejd.DeploymentManager:main: Unable to reach node goal: started
java.lang.ClassNotFoundException: org.mortbay.jetty.webapp.WebAppContext
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at org.eclipse.jetty.util.Loader.loadClass(Loader.java:86)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.nodeClass(XmlConfiguration.java:364)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:304)
    at org.eclipse.jetty.xml.XmlConfiguration.configure(XmlConfiguration.java:262)
    at org.eclipse.jetty.deploy.providers.WebAppProvider.createContextHandler(WebAppProvider.java:291)
    at org.eclipse.jetty.deploy.App.getContextHandler(App.java:101)
    at org.eclipse.jetty.deploy.bindings.StandardDeployer.processBinding(StandardDeployer.java:36)
    at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:186)
    at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:498)
    at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:146)
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:180)
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:64)
    at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:609)
    at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:528)
    at org.eclipse.jetty.util.Scanner.scan(Scanner.java:391)
    at org.eclipse.jetty.util.Scanner.doStart(Scanner.java:313)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.deploy.providers.ScanningAppProvider.doStart(ScanningAppProvider.java:150)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.deploy.DeploymentManager.startAppProvider(DeploymentManager.java:560)
    at org.eclipse.jetty.deploy.DeploymentManager.doStart(DeploymentManager.java:235)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
    at org.eclipse.jetty.server.Server.start(Server.java:387)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
    at org.eclipse.jetty.server.Server.doStart(Server.java:354)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1255)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1174)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.eclipse.jetty.start.Main.invokeMain(Main.java:310)
    at org.eclipse.jetty.start.Main.start(Main.java:786)
    at org.eclipse.jetty.start.Main.main(Main.java:111)
2014-10-06 13:09:10.111:WARN:oejuc.AbstractLifeCycle:main: FAILED ServerConnector@1d402894{HTTP/1.1}{0.0.0.0:8080}: java.net.BindException: Address already in use
java.net.BindException: Address already in use
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Net.java:444)
    at sun.nio.ch.Net.bind(Net.java:436)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
    at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:320)
    at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
    at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.server.Server.doStart(Server.java:366)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1255)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1174)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.eclipse.jetty.start.Main.invokeMain(Main.java:310)
    at org.eclipse.jetty.start.Main.start(Main.java:786)
    at org.eclipse.jetty.start.Main.main(Main.java:111)
2014-10-06 13:09:10.114:WARN:oejuc.AbstractLifeCycle:main: FAILED org.eclipse.jetty.server.Server@5f281b8c: java.net.BindException: Address already in use
java.net.BindException: Address already in use
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Net.java:444)
    at sun.nio.ch.Net.bind(Net.java:436)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
    at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:320)
    at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
    at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.server.Server.doStart(Server.java:366)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1255)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1174)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.eclipse.jetty.start.Main.invokeMain(Main.java:310)
    at org.eclipse.jetty.start.Main.start(Main.java:786)
    at org.eclipse.jetty.start.Main.main(Main.java:111)
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.eclipse.jetty.start.Main.invokeMain(Main.java:310)
    at org.eclipse.jetty.start.Main.start(Main.java:786)
    at org.eclipse.jetty.start.Main.main(Main.java:111)
Caused by: java.net.BindException: Address already in use
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Net.java:444)
    at sun.nio.ch.Net.bind(Net.java:436)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
    at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:320)
    at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
    at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.server.Server.doStart(Server.java:366)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1255)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1174)
    ... 7 more

【问题讨论】:

    标签: java jersey jetty ubuntu-12.04


    【解决方案1】:

    您的 XML 文件引用了旧版本的 Jetty。

    <Configure class="org.mortbay.jetty.webapp.WebAppContext">
    

    org.mortbay.jetty 命名空间适用于 Jetty 6 或更早版本的 Jetty(所有这些都已停产多年)。

    对于 Jetty 9,从 DOCTYPE 到类引用,甚至到结构,整个 XML 文档都是错误的。

    &lt;SystemProperty&gt; 元素引用了一个 "jetty.home" 变量,该变量未在 jetty 嵌入中使用(它仅用于 jetty 分发,即 start.jar)。 jetty-http-spi.jar 甚至没有设置或使用这个属性。

    使用 Jetty Context XML Deployable 是 jetty-deploy.jar 提供的一项功能,但是,com.sun.net.httpserver.HttpServer 概念不支持这种可部署,无论是作为独立部署,还是作为内部 WEB-INF/jetty-web.xml 配置。

    您尝试设置的整个后端服务器战争不能在您开始的com.sun.net.httpserver.HttpServer 上(该概念在基本层面上不支持)

    不幸的是,当您使用com.sun.net.httpserver.HttpServer 技术时,几乎没有可用的故障排除方法。几乎仅限于记录输出。

    日志输出显示什么?

    更新:2014 年 10 月 7 日:

    关于日志输出,让我们看看。

    您正在使用 Jetty 9.2.3 发行版通过命令行启动 jetty。

    该行为与您的BackendServer 使用com.sun.net.httpserver.HttpServer 完全无关。

    这将导致 2 个不同的服务器。

    1. 独立的 Jetty 9.2.3 分发服务器
    2. com.sun.net.httpserver.HttpServer 服务器

    这些日志中基本上显示了 2 个错误。

    首先是...

    java.lang.ClassNotFoundException: org.mortbay.jetty.webapp.WebAppContext
    

    那是因为您在 Jetty 9 中使用了 Jetty 6 技术。Jetty 9 中不存在该类(实际上是包命名空间)。

    该类(在 Jetty 9 中)将被称为 org.eclipse.jetty.webapp.WebAppContext,有关详细信息,请参阅 Eclipse Jetty 文档网站中的 Configuring a Specific Web App Deployment

    您必须分析和调整示例 XML 文件中的大部分内容,以适应自 Jetty 6 和 Jetty 9 以来近 200 个版本的实际情况。Jetty 6 和 Jetty 9 之间的时间过长,无法列出发生了什么变化.这相当于列出福特 Model 18 和特斯拉 Model S 之间的区别(这将是一个巨大的列表,本质上意味着“一切”,而且对工作毫无用处)

    另一个错误...

    FAILED ServerConnector@1d402894{HTTP/1.1}{0.0.0.0:8080}: 
    java.net.BindException: Address already in use    
    

    表示此服务器无法绑定到 8080 端口,因为其他服务器已经存在。

    这是有道理的,因为您的 BackendServer 也在端口 8080 上(根据您的示例代码)。

    不要试图将 Embedded-jetty 和 com.sun.net.httpserver.HttpServer 混为一谈,你只会试图强迫 com.sun.net.httpserver.HttpServer 做你想做的事。

    考虑使用直接的嵌入式码头 + jersey servlet。

    在线和 StackOverflow 中有很多这种技术的示例。

    这是我发现的第一个示例代码,其中显示了如何为球衣 ServletContainer 设置 ServletHolder 以及一些相关的初始化参数来配置它。 Configuring Jersey + Jetty + JSP

    【讨论】:

    • 我添加日志。据我了解,我做错了一切。你能给我jetty 9易懂教程的链接吗?
    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 2023-03-07
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多