0

我在 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 键时,才会显示键入的文本,后跟“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>
4

1 回答 1

1

我认为这里的答案也适用于这个问题。为什么不直接执行它:

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

在用mvn package 打包之后(上面假设你的 artifactId 是 test 并且你的主类的包名是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>

另一种方法是使 jar 可执行并执行它java -jar ./target/test-0.0.1-SNAPSHOT.jar

于 2021-03-18T07:57:28.813 回答