使用Maven / Eclipse进行开发时,可以一次运行两个webapp?

问题在于:我们为客户构建webapps。 我们还有一个“管理员”webapp,可以修改一些客户端数据结构。 由于数据的性质,两个webapp都必须在同一个JVM中运行。

这在生产中没有问题; 您只需将两个webapp放在同一个应用服务器中。

我们最近改用Mavenish的方式来布局webapps,Maven想要每个项目使用一个webapp。 在Eclipse中,这是一个问题,因为如果您独立运行不同的Web应用程序,它们将位于不同的JVM中。

我们正在尝试使用jetty-maven-plugin进行webapp测试,但如果可以解决这个问题,可以切换到别的东西。

是的,你可以:)通过将一个WAR模块识别为主模块,将所有其他WAR复制到主目标目录,制作jetty.xml并告诉Maven Jetty插件使用jetty.xml来完成。 以下是使用Maven依赖插件复制其他WAR的方法:

 org.apache.maven.plugins maven-dependency-plugin   copy package  copy     com.foo bar ${project.version} war true target/      

您还需要在POM中定义com.foo:bar依赖项。 这是jetty.xml的内容:

  

                        /foo  target/bar-${project.version}.war   

以下是如何告诉Maven Jetty插件使用新的jetty.xml:

  org.mortbay.jetty jetty-maven-plugin ${jetty.version}  ${basedir}/jetty.xml  

现在启动jetty:来自Eclipse的run-war目标,你应该看到所有WAR部署在一个Maven Jetty插件实例中。 我从命令行运行它,它在那里工作,YMMV与Eclipse。

您可以直接通过jetty-maven-plugin执行此操作,而无需修改jetty.xml:

  org.eclipse.jetty jetty-maven-plugin  5  /    ${project.basedir}/../secondProject.war /cc     ...   

您根本不必修改jetty.xml文件即可成功使用它,也不需要复制war文件。 (虽然您可能希望构建第二次战争作为此构建的一部分,请参阅maven-invoker-plugin)

文档: http : //www.eclipse.org/jetty/documentation/9.2.2.v20140723/jetty-maven-plugin.html#running-more-than-one-webapp

这是给出ccleve答案的一个例子。

 import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.HandlerCollection; import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.xml.XmlConfiguration; ... public static void main(String[] args) throws Exception { ... Server server = new Server(port); HandlerCollection handlers = new HandlerCollection(); WebAppContext frontEndWebappContext = new WebAppContext( "src/main/webapp", "/test" ); handlers.addHandler(frontEndWebappContext); String serviceWebappBasePath = {absolute_path_to_other_webapp}; WebAppContext serviceWebappContext = new WebAppContext( serviceWebappBasePath + "/main/webapp", "/" ); handlers.addHandler(serviceWebappContext); XmlConfiguration conf = new XmlConfiguration(new File( serviceWebappBasePath + "test/webapp/WEB-INF/jetty-web.xml") .toURI().toURL().openStream()); conf.configure(serviceWebappContext); server.setHandler(handlers); server.start(); ... 

在这种情况下,有一个安装在“/ test”的前端webapp和一个安装在“/”上的服务webapp。 我们还包括服务应用程序的jetty-web.xml。

在您的情况下,您要创建的启动器应该位于“src / test”文件夹中,因为它不应该包含在您的战争中,因为您只想将其用于测试目的。

您可能还必须在前端webapp的pom文件中的范围测试中添加对服务webapp的依赖性:

  {service_group} {service_artifact_id} {service_version} test  

和/或

  {service_group} {service_artifact_id} test-jar {service_version} test  

我对Maven / Jetty没有那么多经验; 但我确实在Eclipse上有Tomcat的经验; 所以我们至少都在使用Eclipse上的servlet。

无论如何,我不知道你是否已经使用Eclipse中的任何项目模板制作项目,但我使用动态Web项目模板制作了我的项目。 我之前没有做过两个网络应用程序; 但是如果您要创建其中两个项目,然后在Eclipse服务器选项卡中创建一个新服务器并将两个项目添加到它,那么您可能能够实现目标。

当您执行Run As …时,您基本上只是运行Eclipse为项目设置设置的默认运行配置。 但是,如果您将两个项目部署到开发环境中的一个服务器上,然后选择该服务器并点击start,它应该只在一个JVM上启动它; 类似于您的生产环境。

就像我说的那样; 我没有使用Jetty,我从来没有在Jetty上使用过服务器设置指南,所以我不知道这是否适合你。 所以我希望这会有所帮助 – 但如果不是,我不会感到非常惊讶。

回答我自己的问题:

看起来这是不可能的。 我们提出的解决方法是编写一些嵌入式Jetty代码并从我们的应用程序中启动它。 Jetty允许您以编程方式添加多个Web应用程序。 它还允许您创建多个资源库,即每个webapp的目录,从而启用叠加。 到目前为止,它的效果很好。