Как передать аргументы для bashscript в Java?

#java #bash #apache-kafka

#java #bash #apache-kafka

Вопрос:

У меня есть следующая команда для запуска через мою Java-программу;

./kafka-topics.sh —zookeeper zk1.xx.com: 2181,zk2.xx.com: 2181,zk3.xx.com:2181 —удалить —тема testTopic

Я вызываю этот скрипт bash следующим образом;

 ProcessBuilder builder = new ProcessBuilder(CConstants.KAFKA_TOPIC_SH);
builder.command("--zookeeper","zk1.xx.com:2181,zk2.xx.com:21811,zk3.xx.com:2181",
                "--delete", "--topic", "testTopic");
        builder.start();
 

Но я получаю следующую ошибку;

 java.io.IOException: Cannot run program "--zookeeper": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048) ~[?:1.8.0_66]
    at
 

Как я могу запустить скрипт bash с параметрами?

Здесь

  • —zookeeper,—delet,e —topic являются аргументами
  • Другие являются параметрами для этих параметров

Ответ №1:

Ошибка, которую вы получаете, показывает, что ваш первый параметр интерпретируется как имя команды. Попробуйте это:

 ProcessBuilder builder = new ProcessBuilder();
builder.command(CConstants.KAFKA_TOPIC_SH,"--zookeeper","zk1.xx.com:2181,zk2.xx.com:21811,zk3.xx.com:2181",
                "--delete", "--topic", "testTopic");
        builder.start();
 

Ответ №2:

при вызове метода command вы перезаписываете команду, переданную конструктору ProcessBuilder . Существует вариант конструктора vararg, в котором вы также можете передавать аргументы команды:

 new ProcessBuilder(CConstants.KAFKA_TOPIC_SH, "--zookeeper",
   "zk1.xx.com:2181,zk2.xx.com:21811,zk3.xx.com:2181", "--delete", "--topic",   "testTopic")
   .start();
 

Ответ №3:

вы можете напрямую вызвать API Kafka вместо инкапсуляции команды Java в скрипт bash. Например,

String[] options = new String[]{
«—create»,
«—zookeeper»,
«zk_host:port»,
«—partitions»,
«1»,
«—topic»,
«test»,
«—replication-factor»,
«1» };
TopicCommand.main(параметры);

Комментарии:

1. Можете ли вы привести пример для удаления темы?

2. String[] options = новая строка[]{ «—delete», «—zookeeper», «zk-host:port», «—topic», «your_topic_name»}; TopicCommand.main(параметры);

3. Спасибо, работает отлично. Я спросил из списка пользователей kafka, они предложили использовать скрипт bash.