我使用嵌入式jetty服务器来部署我的应用程序。我想使用相同的jetty实例在不同的连接器上部署2个不同的战争(一个在http上,另一个在https上)。我的代码如下:
private static void startServer() throws Exception
{
Server= new Server();
ServerConnector https_connector = null;
ServerConnector httpConnector = new ServerConnector(server);
httpConnector.setPort(18081);
httpConnector.setName("Http_connector");
httpConnector = new ServerConnector(server);
HttpConfiguration https = new HttpConfiguration();
https.addCustomizer(new SecureRequestCustomizer());
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStorePath(serviceConfig.getSecurityCertificatePath());
sslContextFactory.setKeyStorePassword(KEY_STORE_PD);
sslContextFactory.setKeyManagerPassword(KEY_MANAGER_PD);
https_connector = new ServerConnector(server, new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()), new HttpConnectionFactory(https));
https_connector.setName("Https_connector");
if(https_connector != null)
{
https_connector.setPort(18080);
server.setConnectors(new Connector[] {https_connector, httpConnector});
}
WebAppContext webapp = new WebAppContext();
webapp.getInitParams().put("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");
webapp.setContextPath("/hello1");
File warFile = new File("../HelloWorld/webapps/hello1.war");
webapp.setVirtualHosts(new String[]{"Https_connector"});
if(!warFile.exists())
{
throw new IllegalArgumentException( "Unable to find WAR File: " + warFile.getAbsolutePath());
}
webapp.setWar(warFile.getAbsolutePath());
Configuration.ClassList classlist = Configuration.ClassList.setServerDefault( server );
classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
"org.eclipse.jetty.annotations.AnnotationConfiguration" );
webapp.setAttribute(
"org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/[^/]*taglibs.*\\.jar$" );
webapp.setCopyWebDir(true);
webapp.setCopyWebInf(true);
webapp.setParentLoaderPriority(true);
webapp.setPersistTempDirectory(false);
HandlerCollection contexts = new ContextHandlerCollection();
contexts.addHandler(webapp);
ContextHandler contextHandler = new ContextHandler();
contextHandler.setContextPath("/hello1resources");
ResourceHandler resourceHandler= new ResourceHandler();
File resourceBase = new File("../HelloWorld/webapps/hello1resources");
if(!resourceBase.exists())
{
new File("../HelloWorld/webapps/hello1resources").mkdir();
}
resourceHandler.setResourceBase(resourceBase.getAbsolutePath());
resourceHandler.setDirectoriesListed(false);
contextHandler.setHandler(resourceHandler);
contexts.addHandler(contextHandler);
//************************************
WebAppContext webapp1 = new WebAppContext();
webapp1.getInitParams().put("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");
webapp1.setContextPath("/hello2"");
File warFile1 = new File("../HelloWorld/webapps/hello2.war");
if(!warFile1.exists())
{
throw new IllegalArgumentException( "Unable to find WAR File: " + warFile1.getAbsolutePath());
}
webapp1.setWar(warFile1.getAbsolutePath());
webapp1.setAttribute(
"org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/[^/]*taglibs.*\\.jar$" );
webapp1.setVirtualHosts(new String[]{"Http_connector"});
webapp1.setCopyWebDir(true);
webapp1.setCopyWebInf(true);
webapp1.setParentLoaderPriority(true);
webapp1.setPersistTempDirectory(false);
contexts.addHandler(webapp1);
ServletContextHandler contextHandler1 = new ServletContextHandler();
contextHandler1.setContextPath("/hello2resources");
ResourceHandler resourceHandler1= new ResourceHandler();
File resourceBase1 = new File("../HelloWorld/webapps/hello2resources");
if(!resourceBase1.exists())
{
new File(serviceConfig.resourceBase1).mkdir();
}
resourceHandler1.setResourceBase(resourceBase1.getAbsolutePath());
resourceHandler1.setDirectoriesListed(false);
contextHandler1.setHandler(resourceHandler1);
contexts.addHandler(contextHandler1);
//*********************************
contextHandler = new ContextHandler();
contextHandler.setContextPath(serviceConfig.getServiceResourceContextPath());
resourceHandler= new ResourceHandler();
resourceBase = new File(serviceConfig.getServiceResourceBase());
if(!resourceBase.exists())
{
new File(serviceConfig.getServiceResourceBase()).mkdir();
}
resourceHandler.setResourceBase(resourceBase.getAbsolutePath());
resourceHandler.setDirectoriesListed(false);
contextHandler.setHandler(resourceHandler);
contexts.addHandler(contextHandler);
server.setHandler(contexts);
LOGGER.info("just before starting server...");
server.start();
}
代码详情: 我创建了2个连接器:http_connector和https_connector 并为应用程序webapp和webapp1创建了两个不同的webAppContext。还为两个webAppContexts分配了虚拟主机。 我已将两个war文件保存在同一个webapps文件夹中。
现在,当服务器启动时,我无法从浏览器连接到任何应用程序: 网址: 申请1:https://localhost:18080/hello1/ 申请1:http://localhost:18081/hello2
在这两种情况下,跟踪错误都是遗传的 HTTP错误:404 访问/ clearinsight时出现问题。原因:未找到
到目前为止尝试的解决方案不起作用: 我为应用程序和单个服务器创建了两个单独的webAppContexts,并且只创建了一个http连接器。
我不想为应用程序启动2个独立的jetty服务器实例。
有人可以建议是否可以在嵌入模式下在一个jetty服务器实例中部署2个webAppContexts?
如果是,提供的代码有什么问题?
提前致谢。