java - 通过反射运行码头网络服务
问题描述
大家好,我一直在尝试将码头作为我的休息网络服务的嵌入式服务器,并且在独立使用它时,程序运行良好,但是当我尝试使用反射调用包含码头服务器启动逻辑的类的主要方法时,我无法得到它工作。此外,当我从代码中删除 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();
}
需要帮助或关于我做错了什么的指示,这种情况甚至可以通过来自另一个代码的反射来启动一个休息 Web 服务来实现。
我理解为什么 java 中会出现 classnotfond 错误,但是类加载器引用了所有需要的 jars,并且 iam 在码头服务器启动时没有收到错误,因为我可以看到它在日志中被初始化,这只发生在尝试访问我的 web 服务时
更新:摆脱了 classnotfound 异常和所有类加载器问题,但仍然无法访问 Web 服务,它总是返回 404 错误,没有任何异常。请注意,这只发生在通过反射调用该方法时,否则代码工作正常。需要帮助
解决方案
我终于让它工作了。刚刚将我的 urlclassloader 添加为线程的当前 contextclassloader 并且代码开始工作。刚刚在 jettyServer.start 方法之前添加
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
有人现在可以解释为什么这行得通,因为我认为从 jettyserver.start 方法开始的线程没有引用我的 urlclassloader 吗?我对吗?
推荐阅读
- reactjs - 使用 Redux 和 React Hooks 设置状态的最佳方式
- r - 如何在 R 中对数据框中的值求和?
- javascript - 如果输入文件类型有值(Bootstrap4),则在关闭模式之前显示确认消息
- javascript - 动态地将 css 赋予数组中的元素
- r - 在需要列规范的函数上使用 purrr::map
- jquery - ASP.net MVC 中的选项卡控件
- python - 使用 python 将 JSON 转换为 CSV 文件
- python-3.x - 如何打印字典列表python
- php - laravel 雄辩复杂的 select inside where 语句
- database - 线性数据库设计