Как встроить Perl-скрипт в JAR-файл для выполнения? - PullRequest
5 голосов
/ 27 июля 2011

Я довольно новичок в Perl, но программирую на java уже несколько месяцев (из C ++).Я написал Perl-скрипт, который анализирует некоторые журналы данных, и теперь клиент, на которого я работаю, хочет получить графический интерфейс.GUI был создан как java-апплет (с использованием Netbeans), и я хотел бы «встроить» скрипт perl в его jar-файл в качестве функции безопасности по умолчанию.Позднее в будущем ожидается несколько обновлений для сценария perl, поэтому я хочу настроить его так, чтобы все, что пользователь должен делать при появлении обновления, - определять новый путь к файлу для последнего сценария perl через графический интерфейс.Я уже реализовал эту функцию в файловом браузере, и все работает отлично.

Проблема, с которой я сталкиваюсь, - это что-то очень простое, вероятно, не очень сложное для человека с большим опытом работы с Java.На всякий случай, если один из обновленных Perl-скриптов, которые они получат в будущем, не будет работать должным образом, я хочу, чтобы они могли использовать встроенный скрипт по умолчанию, если им придется прибегнуть к этому.Когда я запускаю апплет через Netbeans, все работает отлично, однако, когда я пытаюсь запустить файл jar из командной строки, программа возвращает ошибку, сообщающую, что не может найти файл.Возможно, я не использую правильную терминологию для поиска решения этой проблемы, но я бы хотел, чтобы мой jar-файл выполнял встроенный сценарий perl во время выполнения.Любые предложения приветствуются.Я попытался поместить perl-файл в тот же пакет, что и java-файлы, и вызвать скрипт только по имени файла, но это было бесполезно.

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

Вы можете получить доступ к любому файлу в jar как к ресурсу classpath, но проблема, с которой вы столкнетесь, заключается в том, что у пользователей может не быть установлен интерпретатор perl.

РЕДАКТИРОВАТЬ: так как вы упомянули, что пользователи будут иметь среду выполнения Perl, то это выполнимо. Вы можете попробовать передать содержимое файла с помощью Process.getOutputStream() или просто скопировать содержимое во временный файл с помощью File.createTempFile() и передать это имя файла в качестве аргумента интерпретатору perl.

1 голос
/ 06 февраля 2013

У меня та же проблема, вот как я решил ее, основываясь на обсуждении Джоша и Джигги выше.Сначала найдите файл в src / main / resources / perl (чтобы он работал в Eclipse).Если он не существует, скопируйте файл Perl из каталога perl внутри jar в src / main / resources / perl.Я строю с Maven , поэтому использование каталога src / main / resources / perl означает, что при сборке jar Maven автоматически включает каталог perl в jar.

Эта стратегия аналогичнатот, который используется для загрузки ресурсов из jars , таких как файлы свойств.

Я использую этот подход, потому что у меня есть многомодульный проект Maven, когда каждый подмодуль создает jar.У нас есть один, который выполняет общее извлечение информации, затем другой, который специализирует этот модуль для конкретного клиента.Код Perl живет внутри общего модуля, но он нужен в специализированном. Копировать файлы между модулями в Maven довольно неудобно, , поэтому проще просто поместить его в ресурсы, а затем позволить коду Java решить проблему.

См. Этот связанный вопрос для хорошего ответа об альтернативном подходе к встраиванию нативного кода, такого как C, в jar.

Код выглядит следующим образом (я использую Apache Commons IO):

public class PerlTableParser {

  private static final String RESOURCES_DIR = "src/main/resources";
  private static final String LIB_PATH = RESOURCES_DIR + "perl/";
  private static final String PERL_PARSER = "perl/parser.pl";
  private static final String PERL_CMD = String.format("perl -I %s %s",
        LIB_PATH, RESOURCES_DIR + PERL_PARSER);

  public PerlTableParser() {
    File perlCodeDir = new File(LIB_PATH);
    if (!perlCodeDir.exists()) {
        perlCodeDir.mkdirs();
    }
    File perlParserFile = new File(RESOURCES_DIR, PERL_PARSER);
    try {
        if (!perlParserFile.exists()) {
            FileUtils.copyInputStreamToFile(getClass().getClassLoader()
                    .getResourceAsStream(PERL_PARSER), perlParserFile);
        }
    } catch (IOException e) {
        MyLogger.logger.error(
                "Failed to copy Perl code to local directory " + e, e);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...