在反应堆项目中的单个maven构建中运行Java应用程序和Web应用程序

时间:2016-02-16 16:06:08

标签: java eclipse maven build-process

我有一个具有以下结构的反应堆项目

server
- pom.xml (parent) 
-- appserver (has a server socket)
-- webserver (connects to the socket in appserver and gets data)

appserver pom.xml有一个maven-exec-plugin,它在我的java类AppServer中运行main方法。

当我在我的最顶层(服务器)项目中运行目标验证时,我的构建卡在appserver - exec目标上,并且永远不会继续构建/运行我的web服务器。

理想情况下,我想首先运行我的appserver,然后在单个安装中运行我的网络服务器,或者在我最顶层的项目中验证运行。

这是我的appserver pom中的exec maven插件配置。

<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId> 
<executions> 
  <execution> 
    <goals> 
      <goal>java</goal> 
    </goals> 
  </execution> 
</executions> 
<configuration> 
  <mainClass>somepackage.AppServer</mainClass> 
</configuration> 

我知道许多其他类似性质的问题之前已被问过,大多数答案都围绕着使用带有antrun插件的shell脚本,而且几乎所有这些问题至少都是3/4岁,我希望有更多的新解决方案。平台独立方式现在可用。

1 个答案:

答案 0 :(得分:1)

遗憾的是,没有比使用maven-antrun-plugin更好的解决方案了。 maven-exec-plugin可用于在具有java目标的同一VM中或在具有exec目标的分叉VM中启动外部进程,但在这两种情况下,它都将阻止;意味着插件将等待执行完成。如上所述herehere启动Shell脚本的可能解决方法在Linux环境中运行良好。但是,由于您需要支持多种环境,因此它无法在您的情况下工作。

使用maven-antrun-plugin,您可以使用Exec任务并将spawn属性设置为true。这将导致Ant在后台运行任务。示例配置为:

<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <version>1.8</version>
  <executions>
    <execution>
      <phase> <!-- a lifecycle phase --> </phase>
      <configuration>
        <target>
          <property name="runtime_classpath" refid="maven.runtime.classpath" />
          <exec executable="java" spawn="true">
            <arg value="-classpath"/>
            <arg value="${runtime_classpath}"/>
            <arg value="somepackage.AppServer"/>
          </exec>  
        </target>
      </configuration>
      <goals>
        <goal>run</goal>
      </goals>
    </execution>
  </executions>
</plugin>

请注意,这使用maven.runtime.classpath来引用包含所有运行时依赖关系的Maven类路径(有关详细信息,请参阅here)。