使用 Exec Maven 插件分叉 Java,而不使用 `exec` 目标

Posted

技术标签:

【中文标题】使用 Exec Maven 插件分叉 Java,而不使用 `exec` 目标【英文标题】:Forking Java using the Exec Maven Plugin, without using the `exec` goal 【发布时间】:2013-06-06 12:07:48 【问题描述】:

来自documentation:

    exec:exec 在单独的进程中执行程序和 Java 程序。 exec:java 在同一个 VM 中执行 Java 程序。

我想 fork 一个 java 程序。我已经让它在exec:java 中工作,但这并没有分叉。所以显而易见的举动是将目标更改为exec。问题是,exec 的语法与java 的语法大不相同。它没有includeProjectDependenciesincludePluginDependencies 等标签。我可以使用一个类似于#1 的插件,在它分叉的意义上,但具有类似于#2 的方便语法? IMO,#2 应该只有一个 <fork>true</fork> 配置。

【问题讨论】:

您可以随时修改 Exec Maven 插件以分叉 Java 进程,但保留 includeProjectDependencies 和 includePluginDependencies svn.codehaus.org/mojo/tags/exec-maven-plugin-1.2.1/src/main/… @DeanToader 该链接现已失效。 您找到解决方案了吗? github.com/mojohaus/exec-maven-plugin/issues/85 【参考方案1】:

还可以使用maven-antrun-plugin 从 Maven 生成 Java 进程。这个插件exports several classpaths覆盖了compile/runtime/test范围,以及插件依赖。

因此,在具有编译和插件依赖项的单独进程中执行一个类将如下所示:

<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <goals>
    <goal>run</goal>
  </goals>
  <configuration>
    <target>
      <java classname="com.example.MainClass" fork="true">
        <classpath>
          <path refid="maven.compile.classpath"/>
          <path refid="maven.plugin.classpath"/>
        </classpath>
      </java>
    </target>
  </configuration>
</plugin>

这是使用mvn antrun:run 而不是exec:exec 执行的。

【讨论】:

【参考方案2】:

如果您想将项目类路径提供给您使用的 Java 进程,我认为您可以坚持使用 exec:exec,使用这种配置:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <configuration>
        <executable>java</executable>
        <longClasspath>true</longClasspath>
        <arguments>
            <argument>-XX:MaxPermSize=128M</argument>
            <argument>-Xmx1024M</argument>
            <argument>-Xdebug</argument>
            <argument>-Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=n</argument>
            <argument>-classpath</argument>
            <classpath/>
        </arguments>
    </configuration>
</plugin>

另见plugin Usage page

【讨论】:

你在哪里配置includeProjectDependenciesincludePluginDependencies这里? 项目依赖是通过 参数添加的。我不认为您可以添加插件依赖项,但这真的是一个问题吗? 对我来说是这样。我正在运行一个部署程序。部署者在实际应用的类路径上没有任何业务。 不适合我,我最终选择了 IntelliJ Run/Debug Configratuion > Runner > VM Options,首先为 maven 指定 vm 选项。 只需添加要运行的类作为最后一个参数。

以上是关于使用 Exec Maven 插件分叉 Java,而不使用 `exec` 目标的主要内容,如果未能解决你的问题,请参考以下文章

Exec Maven插件

运行 maven exec 插件时 java 的错误版本

具有预览功能的 Maven Exec 插件

Maven Failsafe 插件 - SurefireBooterForkException: 分叉进程中出现错误 (TypeNotPresentExceptionProxy)

Surefire Maven 插件:“通过直接写入分叉 JVM 中的本机流来破坏 STDOUT”

如何用exec-maven-plugin插件执行jar包