运行 通过反射的码头网络服务
running jetty web service via reflection
大家好我一直在尝试将 jetty 作为我的 rest web 服务的嵌入式服务器,并且在独立使用它时程序工作正常但是当我尝试调用包含 jetty 的 class 的主要方法时使用反射的服务器启动逻辑 当我从我的代码中删除 jettyServer.join 行时,我无法将其设置为 work.Also 然后我收到错误 java.lang.NoClassDefFoundError: org/eclipse/jetty/io/ManagedSelector$Accept 如果我取消注释它,那么我不会收到任何错误,但是当我尝试访问我的 Web 服务时,我会收到 404 错误。
这是在名为 App
的 class 中用于服务器启动的代码
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();
}
需要关于我做错了什么的帮助或指示,这种情况是否可以实现,即通过从另一个代码反射启动休息网络服务。
我明白为什么 classnotfond 错误发生在 java 但 classloader 正在引用所有需要的 jar 并且我在码头服务器启动时没有收到错误,正如我所看到的在日志中初始化这只发生在它尝试访问我的网络服务路径时
更新:摆脱了 classnotfound 异常和所有 classloader 问题,但仍然无法访问网络服务它总是 returns 404 错误没有任何 exception.Note这仅在通过反射调用方法时发生,否则代码有效 fine.Need 帮助
我终于让它工作了。刚刚将我的 urlclassloader 添加为线程的当前 contextclassloader,代码开始工作。刚刚在 jettyServer.start 方法之前添加
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
现在有人可以解释为什么这有效吗,因为我认为从 jettyserver.start 方法开始的线程没有引用我的 urlclassloader?我说的对吗?
大家好我一直在尝试将 jetty 作为我的 rest web 服务的嵌入式服务器,并且在独立使用它时程序工作正常但是当我尝试调用包含 jetty 的 class 的主要方法时使用反射的服务器启动逻辑 当我从我的代码中删除 jettyServer.join 行时,我无法将其设置为 work.Also 然后我收到错误 java.lang.NoClassDefFoundError: org/eclipse/jetty/io/ManagedSelector$Accept 如果我取消注释它,那么我不会收到任何错误,但是当我尝试访问我的 Web 服务时,我会收到 404 错误。
这是在名为 App
的 class 中用于服务器启动的代码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();
}
需要关于我做错了什么的帮助或指示,这种情况是否可以实现,即通过从另一个代码反射启动休息网络服务。
我明白为什么 classnotfond 错误发生在 java 但 classloader 正在引用所有需要的 jar 并且我在码头服务器启动时没有收到错误,正如我所看到的在日志中初始化这只发生在它尝试访问我的网络服务路径时
更新:摆脱了 classnotfound 异常和所有 classloader 问题,但仍然无法访问网络服务它总是 returns 404 错误没有任何 exception.Note这仅在通过反射调用方法时发生,否则代码有效 fine.Need 帮助
我终于让它工作了。刚刚将我的 urlclassloader 添加为线程的当前 contextclassloader,代码开始工作。刚刚在 jettyServer.start 方法之前添加
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
现在有人可以解释为什么这有效吗,因为我认为从 jettyserver.start 方法开始的线程没有引用我的 urlclassloader?我说的对吗?