java - 通过反射运行 jetty Web 服务

标签 java web-services reflection jetty

大家好,我一直在尝试将jetty作为我的其余Web服务的嵌入式服务器,在独立使用它时,程序工作正常,但是当我尝试使用反射调用包含jetty服务器启动逻辑的类的主要方法时,我无法让它工作。此外,当我从代码中删除jettyServer.join行时,我收到错误java.lang.NoClassDefFoundError:org/eclipse/jetty/io/ManagedSelector$Accept,如果我取消注释,我会得到没有错误,但当我尝试访问我的网络服务时,出现 404 错误。

这是在名为 App 的类中启动服务器的代码

public static void main(String[] args) {
        // TODO Auto-generated method stub

        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
          context.setContextPath("/JettyService/Servlet1");
          StartupListener sup=new StartupListener();
          context.addEventListener(sup);

          Server jettyServer = new Server(8080);
          jettyServer.setHandler(context);

          ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*");
          jerseyServlet.setInitOrder(0);

          jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", JettyServiceApp.class.getCanonicalName());

          try {
           jettyServer.start();
         // jettyServer.join();
           //stopServer(jettyServer);
          // jettyServer.stop();
          } catch (Exception e) {
           e.printStackTrace();
          } 
          finally{
          // jettyServer.destroy();
          }

    }

这是通过反射调用此方法的代码

try {
            List<URL> urlsR=new ArrayList<URL>();
//contains source classes
            File file = new File("C:\\Users\\DemonKing\\Documents\\eclipseprojects\\JettyDemo\\bin\\");
//contains the depenedencies jars of jetty
            File file2 = new File("F:\\JettyJarsComplete");
            for(File child:file2.listFiles())
            {
                File resFile=new File(file2+"\\"+child.getName());
                System.out.println(resFile);
                URL url2 = resFile.toURI().toURL();
                urlsR.add(url2);
            }

            // convert the file to URL format
            URL url = file.toURI().toURL();
            urlsR.add(url); 
            //URL url2 = file2.toURI().toURL();
            //URL[] urls = new URL[] { url,url2 };
            URL[] urls = urlsR.toArray(new URL[urlsR.size()]);
            //url

            // load this folder into Class loader
            ClassLoader cl = new URLClassLoader(urls);
            Class<?> cls = cl.loadClass("org.demonking.App");
            System.out.println("web class loaders:" + cls.getClassLoader());
            Method m = cls.getDeclaredMethod("main", String[].class);
            m.invoke(null, (Object) null);

            // code added by to avoid the resource leak class loader is
            // never closed warning
            URLClassLoader urlCl = (URLClassLoader) cl;
            urlCl.close();

        } catch (Exception ex) {
            ex.printStackTrace();
        }

需要帮助或指示我做错了什么,这种情况是否可以实现,即通过另一个代码的反射启动休息网络服务。

我明白为什么 java 中会出现 classnotfond 错误,但类加载器正在引用所需的所有 jar,并且我在 jetty 服务器启动时没有收到错误,因为我可以看到它在日志中初始化,这只在尝试在其路径访问我的 Web 服务时才会发生

更新:摆脱了 classnotfound 异常和所有类加载器问题,但仍然无法访问 Web 服务,它总是返回 404 错误,没有任何异常。注意,这只在通过反射调用方法时发生,否则代码工作正常。需要帮助

最佳答案

我终于让它工作了。刚刚添加我的 urlclassloader 作为线程的当前 contextclassloader,代码开始工作。刚刚添加在jettyServer.start方法之前

Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());

现在有人可以解释一下为什么会这样吗?因为我认为从 jettyserver.start 方法启动的线程没有引用我的 urlclassloader?我说得对吗?

关于java - 通过反射运行 jetty Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53719251/

相关文章:

java - 在 Eclipse 中创建 Web 服务客户端

c# - Attribute.GetCustomAttributes 和 MemberInfo.GetCustomAttributes 可以互换吗?

Array.SetValue 在运行时的 C# 类型转换

java - 如何通过 Java API 使用 AWS Cognito 对用户进行身份验证

java - 单击 EditText 时键盘不显示

java - LinkedHashMap 中带有 JTextField 的 JLabels

java - 重要的 Java EE Web 服务实现示例?

java - Alfresco 工作流触发器通过 Java 代码

Java反射,改变父类(super class)中声明的字段的值

java - Java 中是否有相当于 PHP 中 bin2hex 和 hex2bin 的函数?