запуск веб-службы Jetty через отражение - PullRequest
0 голосов
/ 11 декабря 2018

Привет всем, я пробовал Jetty в качестве встроенного сервера для моего остального веб-сервиса, и при использовании его в автономном режиме программа работает нормально, но когда я пытаюсь вызвать основной метод класса, который содержит логику запуска сервера 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, так как я вижу его инициализацию в журналах, это происходит только тогда, когда он пытается получить доступ к моему веб-сервису по его пути

Обновление: избавился от исключений classnotfound и всех загрузчиков классовпроблемы, но по-прежнему не удается получить доступ к веб-службе, она всегда возвращает ошибку 404 без каких-либо исключений. Обратите внимание, что это происходит только при вызове метода с помощью отражения, в противном случае код работает нормально. Нужна помощь

1 Ответ

0 голосов
/ 14 декабря 2018

Я наконец получил его на работу.Просто добавил мой urlclassloader в качестве текущего contextclassloader потока, и код начал работать.только что добавленный перед методом jettyServer.start

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

может ли теперь кто-нибудь объяснить, почему это работает, потому что я думаю, что поток, запущенный из метода jettyserver.start, не имел ссылки на мой urlclassloader?Я прав?

...