Невозможно запустить JAR с execl ()

Мне дали decrypt.jar а также encrypt.jar файл, который используется для подготовки файлов перед передачей.

Когда я запускаю терминал и набираю:

/usr/bin/java -jar /path/to/jar/decrypt.jar

Я получаю вывод:

No input file specified

Что в порядке! Баночка работает. Теперь в моем коде, когда я запускаю jar с execl (), я получаю это как вывод:

Error: Could not find or load main class util.decrypt.jar
Decryptor exited with 0

Обратите внимание, что проблема здесь в том, что java пытался запустить класс, который на самом деле является путем к jar (путь — util / decrypt.jar, и он выполнил его как класс util.decrypt.jar)

Мой код:

bool decrypt_file(const std::string& file) {
int result;
int pipefd[2];
FILE *cmd_output;
char buf[1024];
int status;

result = pipe(pipefd);
if (result < 0) {
throw "pipe error!";
}

pid_t pid = fork(); /* Create a child process */
const std::string decryptJar = "util/decrypt.jar";
int ex;
if ( !fileExists(decryptJar) ) throw "File decryptor does not exist!";

switch (pid) {
case -1: /* Error */
#ifdef _DEBUG
std::cout<<"fork() failed!\n";
#endif
return false;
case 0: /* Child process */
dup2(pipefd[1], STDOUT_FILENO); /* Duplicate writing end to stdout */
close(pipefd[0]);
close(pipefd[1]);

//getJava() returns "/usr/bin/java"ex = execl(Config::getInstance().getJava().c_str(), "-jar", decryptJar.c_str(), file.c_str(), NULL); /* Execute the program */
#ifdef _DEBUG
std::cout << "execl() failed! returned "<<ex<<", errno = "<<errno<<"\n"; /* execl doesn't return unless there's an error */
//todo if errno is 2, java was not found on the system, let the user know!
#endif
return false;
default: /* Parent process */
int status;
close(pipefd[1]); /* Close writing end of pipe */
cmd_output = fdopen(pipefd[0], "r");
#ifdef _DEBUG
if (fgets(buf, sizeof buf, cmd_output)) {
std::string str(buf);
std::cout<<"OUTPUT: "<<str<<"\n";
}
#endif
while (!WIFEXITED(status)) {
waitpid(pid, &status, 0); /* Wait for the process to complete */
}

#ifdef _DEBUG
std::cout << "Decryptor exited with " << WEXITSTATUS(status) << "\n";
#endif
return true;
}
}

Манифест внутри банки правильный (он был сгенерирован затмением)

Manifest-Version: 1.0
Class-Path: .
Main-Class: com.{...}.Decryptor

Добавлять:

Попытка изменить путь к абсолютному пути кувшина не устранила проблему.

const std::string decryptJar = workingDir() + "/util/decrypt.jar";

1

Решение

решаемая

Глупая ошибка с моей стороны, первым аргументом, по соглашению, всегда должен быть путь к исполняемому файлу.

Так

ex = execl(Config::getInstance().getJava().c_str(), "-jar", decryptJar.c_str(), file.c_str(), NULL); /* Execute the program */

Должно быть

ex = execl(Config::getInstance().getJava().c_str(), decryptJar.c_str(), "-jar", decryptJar.c_str(), file.c_str(), NULL); /* Execute the program */

Случилось так, что Java выбрал «-jar» в качестве пути, поэтому моя команда была на самом деле

java pathToJar input

вместо

java -jar pathToJar input

Изменить: исправленный фрагмент кода:

bool decrypt_file(const std::string& javaPath, const std::string& file) {
int result, status;
int pipefd[2];
FILE *cmd_output;
char buf[1024];
int ex;
const std::string decryptJar = workingDir() + "/util/decrypt.jar";

result = pipe(pipefd);
if (result < 0) {
throw "pipe error!";
}

pid_t pid = fork(); /* Create a child process */
if ( !fileExists(decryptJar) ) throw "File decryptor does not exist!";

switch (pid) {
case -1: /* Error */
#ifdef _DEBUG
std::cout<<"fork() failed!\n";
#endif
return false;
case 0: /* Child process */
dup2(pipefd[1], STDOUT_FILENO); /* Duplicate writing end to stdout */
close(pipefd[0]);
close(pipefd[1]);

ex = execl(javaPath.c_str(), decryptJar.c_str(), "-jar", decryptJar.c_str(), file.c_str(), NULL); /* Execute the program */
#ifdef _DEBUG
std::cout << "execl() failed! returned "<<ex<<", errno = "<<errno<<"\n"; /* execl doesn't return unless there's an error */
#endif
if ( errno == 2 ) {
std::cout<<"JAVA NOT FOUND! Check if java is installed and/or if the path in the config file points to a correct java installation!\n\n";
}
return false;
default: /* Parent process */
close(pipefd[1]); /* Close writing end of pipe */
cmd_output = fdopen(pipefd[0], "r");
#ifdef _DEBUG
if (fgets(buf, sizeof buf, cmd_output)) {
std::string str(buf);
if ( str != "OK" )
std::cout<<"---DECRYPT OUTPUT: "<<str<<"\n";
}
#endif
while (!WIFEXITED(status)) {
waitpid(pid, &status, 0); /* Wait for the process to complete */
}

#ifdef _DEBUG
std::cout << "Decryptor exited with " << WEXITSTATUS(status) << "\n";
#endif
return true;
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector