Maven exec 目标不提供正确的输出

Maven exec goal does not provide correct output

我在 Eclipse EE (jdk 1.8) 中有一个 Maven 项目,我在命令行上使用 Maven 来构建和执行程序,使用以下命令:

mvn clean install exec:exec

所有依赖项都已添加到 pom.xml 文件中,我使用的是 Maven 3.6.3。 现在,假设我的主要方法如下:

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
    
        System.out.print("Enter string: ");
        String str = input.nextLine();
    }
}

现在,当我构建并 运行 这个时,它会提示在输出“Enter string:”之前提供输入。同样在向控制台输入内容后,它不会显示。只有当按下 Enter 键时,输入的文本才会显示,然后是“Enter string:”。

输出

现在如果代码如下:

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
    
        System.out.println("Enter string: ");
        String str = input.nextLine();
    }
}

首先输出“输入字符串:”,然后是提示。然而,在这里,键入的文本也只有在按下 Enter 后才会出现。

输出

但是,当在 Eclispe 中完成 Maven 构建时,输入的文本显示没有任何问题。但是,“打印语句之前的输入”是存在的。

我想解决这些问题,因为我更喜欢 Maven 命令行。

这是maven-exec-plugin的配置:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>3.0.0</version>
    <configuration>
        <executable>java</executable>
        <arguments>
            <argument>-classpath</argument>
            <classpath />
            <argument>package_name.Main</argument>
        </arguments>
    </configuration>
</plugin>

我认为answer here对这个问题也是有效的。为什么不直接用类似的东西来执行它:

java -classpath ./target/test-0.0.1-SNAPSHOT.jar com/Main

mvn package 打包后(上面假设你的 artifactId 是 test 并且你的主要 class 的包名称是 com)

编辑:正如评论中指出的那样。上面还假设,(如果你在你的项目中有你所说的依赖项),jar 包含它的依赖项,例如,遵循 pom.xml:

中的 maven shade 插件配置
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.4</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

另一种方法是make the jar executable然后用java -jar ./target/test-0.0.1-SNAPSHOT.jar

执行