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
执行
我在 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