运行 一个 java 应用程序和一个 Web 应用程序在反应器项目中的单个 Maven 构建中

run a java application and a web application in a single maven build within a reactor project

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

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

应用程序服务器 pom.xml 有一个 maven-exec-plugin,它 运行 是我 java class 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> 

我知道之前已经问过许多其他类似性质的问题,大多数答案都围绕使用 shell 脚本和 ant运行 插件展开,几乎所有这些问题至少有 3 / 4 年旧的,我希望现在有新的解决方案以更独立于平台的方式可用。

不幸的是,对于您的用例,没有比使用 maven-antrun-plugin 更好的解决方案了。 maven-exec-plugin can be used to launch an external process, either in the same VM with the java goal or in a forked VM with the exec goal, but in both cases, it will be blocking; meaning that the plugin will wait for the execution to finish. The possible work-around of starting a Shell script as mentioned here and here 在 Linux 环境中运行良好。但是,它不适用于您的情况,因为您需要支持多种环境。

使用 maven-antrun-plugin, you can use the 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 to refer to the Maven classpath containing all runtime dependencies (see 获取更多信息)。