0

我正在尝试使用 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论点(记录在这里),似乎并没有奏效。以下是详细命令输出中的几行:

[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参数起作用?

4

1 回答 1

0

好的,所以我想出了一个解决方案。这不是最好的,但它有效。我的 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 %*

和 bash 文件在 unix 上:

#!/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 "$@"
于 2021-12-08T16:11:55.527 回答