gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:59:10 24 4
gpt4 key购买 nike

大家好,我一直在尝试将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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com