运行 一个 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 获取更多信息)。
我有一个具有以下结构的反应器项目
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