简体   繁体   English

如何使用 java 代码与系统 cmd 行交互

[英]how to interact with system cmd line using java code

I'm trying to create a Java code that creates a nifi customized processor !我正在尝试创建一个 Java 代码来创建一个 nifi 定制处理器! so in order to do that I need to use windows cmd windows and launch mvn archetype:generate then choose the modele nifi by typing nifi then choose the project by typing 1 the I need to write the groupeId, the artifact...所以为了做到这一点,我需要使用 windows cmd windows并启动mvn archetype:generate然后通过键入 nifi 选择nifi然后通过键入1选择项目我需要编写 groupeId,工件......

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

I need to do all that automatically by using a java code: I tryed this code:我需要使用 java 代码自动执行所有这些操作:我试过以下代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

public class CmdTest {
    public static void main(String[]args) throws IOException {
        String line;
        OutputStream stdin = null;
        InputStream stderr = null;
        InputStream stdout = null;

          // launch EXE and grab stdin/stdout and stderr
        ProcessBuilder builder = new ProcessBuilder(
                "cmd.exe", "/c", "cd \"C:\\users\\eya\\desktop\\javaprocessor\" && mvn archetype:generate");
            builder.redirectErrorStream(true);
            Process process = builder.start();
          stdin = process.getOutputStream ();
          stderr = process.getErrorStream ();
          stdout = process.getInputStream ();

          // "write" the parms into stdin
          line = "nifi" + "\n";
          stdin.write(line.getBytes() );
          stdin.flush();

          line = "1" + "\n";
          stdin.write(line.getBytes() );
          stdin.flush();

          line = "33" + "\n";
          stdin.write(line.getBytes() );
          stdin.flush();

          line = "javaproceSSor" + "\n";
          stdin.write(line.getBytes() );
          stdin.flush();

          line = "javaprocessor" + "\n";
          stdin.write(line.getBytes() );
          stdin.flush();

          line = "" + "\n";
          stdin.write(line.getBytes() );
          stdin.flush();

          line = "javapro" + "\n";
          stdin.write(line.getBytes() );
          stdin.flush();

          line = "" + "\n";
          stdin.write(line.getBytes() );
          stdin.flush();

          line = "y" + "\n";
          stdin.write(line.getBytes() );
          stdin.flush();

          stdin.close();

          // clean up if any output in stdout
          BufferedReader brCleanUp =
            new BufferedReader (new InputStreamReader (stdout));
          while ((line = brCleanUp.readLine ()) != null) {

              System.out.println ("[Stdout] " + line);
          }
          brCleanUp.close();

          // clean up if any output in stderr
          brCleanUp =
            new BufferedReader (new InputStreamReader (stderr));
          while ((line = brCleanUp.readLine ()) != null) {
            System.out.println ("[Stderr] " + line);
          }
          brCleanUp.close();
    }
}

but it only read "nifi" the others no: and here is the result :但它只读“nifi”,其他的没有:结果如下:

    [Stdout] 2679: remote -> us.fatehi:schemacrawler-archetype-plugin-command (-)
[Stdout] 2680: remote -> us.fatehi:schemacrawler-archetype-plugin-dbconnector (-)
[Stdout] 2681: remote -> us.fatehi:schemacrawler-archetype-plugin-lint (-)
[Stdout] 2682: remote -> ws.osiris:osiris-archetype (Maven Archetype for Osiris)
[Stdout] 2683: remote -> xyz.luan.generator:xyz-gae-generator (-)
[Stdout] 2684: remote -> xyz.luan.generator:xyz-generator (-)
[Stdout] 2685: remote -> za.co.absa.hyperdrive:component-archetype (-)
[Stdout] Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1589: Choose org.apache.maven.archetypes:maven-archetype-quickstart version: 
[Stdout] 1: 1.0-alpha-1
[Stdout] 2: 1.0-alpha-2
[Stdout] 3: 1.0-alpha-3
[Stdout] 4: 1.0-alpha-4
[Stdout] 5: 1.0
[Stdout] 6: 1.1
[Stdout] 7: 1.3
[Stdout] 8: 1.4
[Stdout] Choose a number: 8: Define value for property 'groupId': [INFO] ------------------------------------------------------------------------
[Stdout] [INFO] BUILD FAILURE
[Stdout] [INFO] ------------------------------------------------------------------------
[Stdout] [INFO] Total time:  12.592 s
[Stdout] [INFO] Finished at: 2020-04-12T21:13:20+01:00
[Stdout] [INFO] ------------------------------------------------------------------------
[Stdout] [ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:3.1.2:generate (default-cli) on project standalone-pom: null: MojoFailureException: NullPointerException -> [Help 1]
[Stdout] [ERROR] 
[Stdout] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[Stdout] [ERROR] Re-run Maven using the -X switch to enable full debug logging.
[Stdout] [ERROR] 
[Stdout] [ERROR] For more information about the errors and possible solutions, please read the following articles:
[Stdout] [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

if there is any way to generate mvn projects automatically then you are very welcome to help如果有任何方法可以自动生成 mvn 项目,那么非常欢迎您提供帮助

EDIT: I tried this solution but I didn't know how to configure it编辑:我试过这个解决方案,但我不知道如何配置它

Just don't do that.只是不要那样做。 The mvn command could accept all required arguments in command line so there are no interactive actions required. mvn 命令可以在命令行中接受所有必需的 arguments,因此不需要交互操作。 See the documentation on the plugin and supply parameters accordingly into single command.请参阅有关插件的文档,并相应地将参数提供给单个命令。 See http://maven.apache.org/archetype/maven-archetype-plugin/generate-mojo.html There is an example here: Specify archetype for archetype:generate on command line参见http://maven.apache.org/archetype/maven-archetype-plugin/generate-mojo.html这里有一个例子: Specify archetype for archetype:generate on command line

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM