如何从父 pom 部署多个对等 webapp

Posted

技术标签:

【中文标题】如何从父 pom 部署多个对等 webapp【英文标题】:How do I deploy multiple peer webapps from a parent pom 【发布时间】:2010-10-12 23:34:09 【问题描述】:

我有一组我正在管理的网络应用程序,我正试图迁移到 maven。

/pom.xml // 父 pom webapp1/pom.xml // 配置为指向父级 webapp2/pom.xml // webapp1 的对等点并指向父级。

每个 webapps 都引用父 pom,并且它们目前都有一个可以工作的 jetty maven 插件。

我的问题是如何从父 pom 挂载每个 webapp,以便 mvn jetty:run 在父目录中工作?

编辑答案:Pascal T 问题不在于我在尝试从根 pom 运行命令时遇到错误,而是我不确定如何配置它。

例如 webapp1/pom.xml 看起来像:

<project>
...
<plugins>
  <plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>maven-jetty-plugin</artifactId>
  </plugin>
</plugins>
...
</project>

切换到这个目录并输入 mvn jetty:run 效果很好,让我能够点击:http://localhost:8080/webapp1。

但是,我希望成为 webapp1 的父级,并从父目录运行所有“n”个 webapp。因此,http://localhost:8080/webapp1 和 http://localhost:8080/webapp2 可通过一个命令行参数使用。

顺便说一句,如果答案涉及 tomcat 插件,那很好。

【问题讨论】:

我更了解您想要做什么,并编辑了我的初始答案 与Possible to run two webapps at once when developing with Maven/Eclipse? 相同的问题。这个问题有很好的答案! (来自@Janning) 【参考方案1】:

编辑:我已经完全编辑了我的第一个答案,因为我对 OP 的期望有了更好的理解。

查看Cargo,一个允许您以标准方式操作 Java EE 容器的瘦包装器

实际上,Cargo 的网站上有一个 tutorial,它演示了如何使用 Cargo Maven2 插件来自动启动/停止容器(可能在容器启动时部署一些可部署的组件),这正是您要寻找的据我了解。

我只是不确定从父目录执行此操作是否可行,以及是否需要或是否可以从另一个目录执行此操作。我稍后会回来讨论这个问题。我们先来看看 Cargo Maven2 插件设置。

在您的情况下,您可以从最小配置开始(使用 Jetty 5.x,这是 Cargo 的默认容器):

[...]
<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.cargo</groupId>
      <artifactId>cargo-maven2-plugin</artifactId>
    </plugin>
  </plugins>
</build>
[...]

如果您想使用 Jetty 6.x,则必须在 &lt;container&gt; 元素中指定 &lt;containerId&gt;&lt;type&gt;

[...]
<plugin>
 <groupId>org.codehaus.cargo</groupId>
 <artifactId>cargo-maven2-plugin</artifactId>
 <configuration>
   <container>
     <containerId>jetty6x</containerId>
     <type>embedded</type>
   </container>
 </configuration>
</plugin>
[...]

然后,通过在插件配置中明确定义deployables来添加您要部署的模块(有关配置的详细信息,请参阅Maven2 Plugin Reference Guide):

<deployables>
  <deployable>
    <groupId>com.mycompany.myproject</groupId>
    <artifactId>myproject-alpha</artifactId>
    <type>war</type>
    <properties>
      <context>optional alpha root context</context>
    </properties>
  </deployable>
  <deployable>
    <groupId>com.mycompany.myproject</groupId>
    <artifactId>myproject-beta</artifactId>
    <type>war</type>
    <properties>
      <context>optional beta root context</context>
    </properties>
  </deployable>
  [...]
</deployables>

有了这个,您应该能够启动 Jetty 并通过简单的方式在其上部署您的 webapps(从包含货物插件配置的项目中运行):

$ mvn cargo:start

我只是不确定这是否可以与父 pom 一起使用(我想知道这是否会导致循环依赖问题)并且我没有对其进行测试。但就个人而言,我会将所有这些东西放在一个专门项目的 pom 中,例如在您的 webapps 的兄弟项目中,而不是在父 pom.xml 中。我认为这没什么大不了的,恕我直言,这是一个更好的设置,特别是如果您打算将货物用于integration testing。

【讨论】:

+1,但考虑一个补充:如果父项中的配置是在 pluginManagement 部分中设置的,子 webapps 只需要为配置声明插件(如在 OPs 代码中的 sn-p 中)被继承。这样可以避免任何循环问题。

以上是关于如何从父 pom 部署多个对等 webapp的主要内容,如果未能解决你的问题,请参考以下文章

一个 tomcat 下如何部署多个项目?附详细步骤

多个项目如何部署在一个tomcat

同一个Tomcat如何在centos中部署多个项目

JavaWeb项目如何部署到tomcat(手工)

maven项目部署tomcat出现未配置任何构件

java项目如何部署