【问题标题】:Maven exec plugin's %modulepath does not appear to workMaven exec 插件的 %modulepath 似乎不起作用
【发布时间】:2022-01-11 23:27:46
【问题描述】:

我正在尝试使用 maven-exec-plugin 和 exec 目标运行一个 maven 项目(java 目标不适用于我的目的)。但是,我需要做两件事,但我不知道如何同时做这两件事。

首先是它需要(显然)模块路径。当我在 pom 中设置参数时,这是可行的,并且我的程序确实运行了:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <!-- <version>3.0.0</version> is specified in parent module's <pluginManagement> -->
  <executions>
    <execution>
      <id>cli</id>
      <configuration>
        <executable>java</executable>
        <arguments>
          <argument>-p</argument>
          <modulepath/>
          <argument>-m</argument>
          <argument>dev.liambloom.checker.ui/dev.liambloom.checker.ui.cli.Main</argument>
        </arguments>
      </configuration>
    </execution>
  </executions>
</plugin>

但是,当我这样做时,无法将额外的命令行参数传递给我的程序(除非我在每次执行之前将它们设置在 pom 中,这是一个选项,但不受欢迎)。

另一个让我可以轻松添加参数的选项是手动调用 exec 或使用批处理文件,如下所示:

@echo off
mvn exec:exec@cli -pl ui -Dexec.longModulepath="false" -Dexec.args="-p %modulepath -m dev.liambloom.checker.ui/dev.liambloom.checker.ui.cli.Main %*"

但是,%modulepath 参数(记录在here)似乎不起作用。以下是详细命令输出中的几行:

[DEBUG] Executing command line: [C:\Program Files\Java\openjdk-17\bin\java.exe, -p, %modulepath, -m, dev.liambloom.checker.ui/dev.liambloom.checker.ui.cli.Main]
Error occurred during initialization of boot layer
java.lang.module.FindException: Module dev.liambloom.checker.ui not found

有谁知道如何 a.) 传递除 pom 中指定的参数之外的任意参数,或 b.) 使 %modulepath 参数起作用?

【问题讨论】:

    标签: maven maven-exec-plugin


    【解决方案1】:

    好的,所以我想出了一个解决方案。这不是最好的,但它有效。我的 pom 现在包含以下内容:

    <executions>
      <execution>
        <id>get-module-path-win</id>
        <configuration>
          <executable>cmd</executable>
          <arguments>
            <argument>/c</argument>
            <argument>echo</argument>
            <modulepath />
          </arguments>
        </configuration>
      </execution>
      <execution>
        <id>get-module-path-unix</id>
        <configuration>
          <executable>sh</executable>
          <arguments>
            <argument>-c</argument>
            <argument>echo $0</argument>
            <modulepath />
          </arguments>
        </configuration>
      </execution>
    </executions>
    

    然后我通过以下批处理文件(在 Windows 上)调用程序:

    @echo off
    for /f "tokens=*" %%F in ('mvn exec:exec@get-module-path-win -pl ui -q -DforceStdout') do set modulepath=%%F
    java -p %modulepath% -m dev.liambloom.checker.ui/dev.liambloom.checker.ui.cli.Main %*
    

    Unix 上的 bash 文件:

    #!/bin/sh
    java -p $(mvn exec:exec@get-module-path-unix -q -DforceStdout -pl ui) -m dev.liambloom.checker.ui/dev.liambloom.checker.ui.cli.Main "$@"
    

    【讨论】:

      猜你喜欢
      • 2011-11-11
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多