问题在于:我们为客户构建webapps。我们还有一个“管理员”webapp,可以修改一些客户端数据结构。由于数据的性质,两个webapp都必须在同一个JVM中运行。
生产中没问题;你只需将两个webapp放在同一个应用服务器中。
我们最近转而采用Mavenish的方式来布局webapps,Maven想要每个项目使用一个webapp。在Eclipse中,这是一个问题,因为如果您独立运行不同的Web应用程序,它们将位于不同的JVM中。
我们正在尝试使用jetty-maven-plugin进行webapp测试,但如果可以解决这个问题,可以切换到别的东西。
答案 0 :(得分:5)
是的,你可以:)通过将一个WAR模块识别为主模块,将所有其他WAR复制到主目标目录,制作jetty.xml并告诉Maven Jetty插件使用jetty.xml来完成。以下是使用Maven依赖插件复制其他WAR的方法:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.foo</groupId>
<artifactId>bar</artifactId>
<version>${project.version}</version>
<type>war</type>
<overWrite>true</overWrite>
<outputDirectory>target/</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
您还需要在POM中定义com.foo:bar依赖项。这是jetty.xml的内容:
<?xml version="1.0"?>
<!-- =========================================================== -->
<!-- Set handler Collection Structure -->
<!-- =========================================================== -->
<Set name="handler">
<New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
<Set name="handlers">
<Array type="org.eclipse.jetty.server.Handler">
<Item>
<New class="org.eclipse.jetty.server.handler.ContextHandlerCollection"
id="Contexts">
<Set name="handlers">
<Array type="org.eclipse.jetty.server.Handler">
<Item>
<New id="FooWebHandler"
class="org.eclipse.jetty.webapp.WebAppContext"/>
</Item>
</Array>
</Set>
</New>
</Item>
</Array>
</Set>
</New>
</Set>
<Ref id="FooWebHandler">
<Set name="contextPath">/foo</Set>
<Set name="war">
target/bar-${project.version}.war
</Set>
</Ref>
以下是如何告诉Maven Jetty插件使用新的jetty.xml:
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty.version}</version>
<configuration>
<jettyConfig>${basedir}/jetty.xml</jettyConfig>
</configuration>
现在启动jetty:来自Eclipse的run-war目标,你应该看到所有WAR部署在一个Maven Jetty插件实例中。我从命令行运行它,它在那里工作,YMMV与Eclipse。
答案 1 :(得分:5)
您可以直接通过jetty-maven-plugin执行此操作,而无需修改jetty.xml:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<configuration>
<scanIntervalSeconds>5</scanIntervalSeconds>
<webApp>
<contextPath>/</contextPath>
</webApp>
<contextHandlers>
<contextHandler implementation="org.eclipse.jetty.maven.plugin.JettyWebAppContext">
<war>${project.basedir}/../secondProject.war</war>
<contextPath>/cc</contextPath>
</contextHandler>
</contextHandlers>
</configuration>
<executions>
...
</executions>
</plugin>
您根本无需修改jetty.xml文件即可成功使用此文件,也无需复制war文件。 (虽然您可能希望构建第二次战争作为此构建的一部分,请参阅maven-invoker-plugin)
答案 2 :(得分:3)
这是给出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的依赖:
<dependency>
<groupId>{service_group}</groupId>
<artifactId>{service_artifact_id}</artifactId>
<version>{service_version}</version>
<scope>test</scope>
</dependency>
或/和
<dependency>
<groupId>{service_group}</groupId>
<artifactId>{service_artifact_id}</artifactId>
<type>test-jar</type>
<version>{service_version}</version>
<scope>test</scope>
</dependency>
答案 3 :(得分:0)
我对Maven / Jetty没有太多经验;但我确实有Eclipse上的Tomcat经验;所以我们至少都在做Eclipse上的servlet。
无论如何,我不知道你是否已经使用Eclipse中的任何项目模板制作项目,但我使用动态Web项目模板制作了我的项目。我以前没有做过两个网络应用程序;但是如果您要创建其中两个项目,然后在Eclipse服务器选项卡中创建一个新服务器并将两个项目添加到它,您就可以实现目标。
当您执行Run As ...时,您基本上只是运行Eclipse为项目设置设置的默认运行配置。但是,如果您将两个项目部署到开发环境中的一个服务器上,然后选择该服务器并点击start,它应该只在一个JVM上启动它;与您的生产环境类似。
就像我说的那样;我没有使用Jetty,我从未在Jetty上使用过服务器设置指南,所以我不知道这是否适合你。所以我希望这会有所帮助 - 但如果不是,我不会感到非常惊讶。
答案 4 :(得分:0)
回答我自己的问题:
看来这是不可能的。我们提出的解决方法是编写一些嵌入式Jetty代码并从我们的应用程序中启动它。 Jetty允许您以编程方式添加多个Web应用程序。它还允许您创建多个资源库,即每个webapp的目录,从而启用叠加。到目前为止,它运作良好。