我有一个具有以下结构的反应堆项目
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岁,我希望有更多的新解决方案。平台独立方式现在可用。
答案 0 :(得分:1)
遗憾的是,没有比使用maven-antrun-plugin
更好的解决方案了。 maven-exec-plugin
可用于在具有java
目标的同一VM中或在具有exec
目标的分叉VM中启动外部进程,但在这两种情况下,它都将阻止;意味着插件将等待执行完成。如上所述here和here启动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)。