当前位置: 首页 > 知识库问答 >
问题:

用Jetty启动Jersey应用程序

顾梓
2023-03-14

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

/opt/jetty/webapps/backend/

  • 构建
  • conf
  • lib
  • 日志
  • s rc/com/example/pack/backend
    • 资源
      • CategoryResource.java
      • 网络
        • 网.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");
            }
        }
        

        类别资源.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);
            }
        }
        

        网.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>
        

        但是在我开始服务码头启动并尝试连接ip:8085/后端/rest/category/get_all_categories后,我得到:

        HTTP错误:404

        访问/back end/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
        

共有1个答案

东门仲卿
2023-03-14

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

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

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

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

使用Jetty上下文XML可部署文件是< code>jetty-deploy.jar提供的一项功能,但是,无论是作为独立的可部署文件,还是作为内部< code > we b-INF/Jetty-WEB . XML 配置,这种可部署文件都不受< code > com . sun . net . http server . http server 概念的支持。

您试图设置的整个后端服务器war不能在com.sun.net.httpserver上。HttpServer是您开始的(在基础级别上不受该概念的支持)

不幸的是,当您使用com.sun.net.httpserver.HttpServer技术时,几乎没有可用的故障排除。

日志记录输出显示什么?

更新日期: 2014, 10月 7:

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

您通过命令行启动jetty,使用jetty 9.2.3发行版。

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

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

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

这些日志中显示了两个错误。

首先是。。。

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

这是因为您正在为Jetty 9使用Jetty 6技术。这个类(实际上是包名称空间)在Jetty 9中并不存在。

该类(在Jetty 9中)将被称为< code > org . Eclipse . Jetty . webapp . Web App context ,有关详细信息,请参见Eclipse Jetty文档网站中的配置特定的Web App部署。

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

另一个错误...

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

意味着此服务器无法绑定到端口 8080,因为其他一些服务器已经存在。

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

不要试图将嵌入式码头和com.sun.net.httpserver.HttpServer混为一谈,你只会试图强迫com.sun.net.httpserver.HttpServer做你想做的事情。

考虑使用直接嵌入式jetty jersey servlet代替。

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

这是我找到的第一个例子,它有示例代码,显示了如何为jersey < code > servlet container 设置< code>ServletHolder以及一些相关的init参数来配置它。配置泽西岛码头JSP

 类似资料:
  • 问题内容: 我有一个Java应用程序。 该应用程序具有一个设置,该设置决定该应用程序是否在启动时启动。 目前,我可以通过在“启动项目”文件夹中放置/删除快捷方式来实现此目的。 但是,我想知道是否有更好的方法来处理此行为。 编辑 是的,它是Windows。抱歉,之前没有清除该内容。 该应用程序具有一个用户可以在其中触发动作的UI,并且该应用程序在运行时会定期在后台运行一些任务。 @Peter,如何在

  • 我有一份Java申请。 应用程序有一个决定应用程序是否在启动时启动的设置。 目前,我通过在StartUp items文件夹中放置/删除快捷方式实现了这一点。 然而,我想知道是否有更好的方法来处理这种行为。 编辑 是的,是视窗。抱歉之前没有清除。 应用程序有一个UI,用户可以在其中触发操作,并且应用程序在运行时定期在后台运行一些任务。 @Peter,如何使用应用程序中的代码更改注册表?这种方法是否与

  • 问题内容: 尝试在Tomcat上启动Jersey应用程序时,出现了一个非常奇怪的错误。相同的代码可在其他计算机上使用。我尝试重新安装tomcat,我所有的maven依赖项,甚至包括Eclipse和Java本身,都没有运气。我觉得好像加载了不良的Jersey版本吗? 朝正确方向的任何指针将不胜感激。 这是有效的pom:http : //pastebin.com/NacsWTjz 和实际的pom:ht

  • 我在intellij上启动spring boot应用程序时遇到问题,它失败了,并显示以下消息:与目标VM断开连接,地址:'127.0.0.1:49784',传输:'socket' 过程结束,退出代码为255。以前有人遇到过这种情况吗?

  • 问题内容: 我正在寻找一种从Matlab中启动应用程序的方法。问题是,我的Matlab脚本将一些结果保存到文件中,然后应在关联的应用程序中打开(在这种情况下为Blender)。 我熟悉类似的命令 要么 以及其他一些方法,但实际上,该应用程序是从Matlab PATH启动的,因此它在Matlab目录中查找所需的各种库。例如: 是否有某种方法可以启动使用全局(系统)PATH的应用程序? 不久前,我以为

  • 启动 1. 轻触主画面上您想启动的应用程序图标。 显示LiveArea™。 2. 轻触[开始]。 中断/继续 按下PS键即可返回LiveArea™。若要继续,请轻触[继续]。 关闭 1. 按下PS键。 返回LiveArea™。 2. 请由画面右上角将LiveArea™撕下。