Запустить класс main из groovy скрипта с помощью grape

Я хотел бы запустить основной метод класса java с помощью @Grab, чтобы требования выполнялись автоматически. В частности, я хотел бы запустить пример pdfbox https://github.com/apache/pdfbox/blob/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/RemoveAllText.java

Я написал следующий отличный сценарий

#!/usr/bin/env groovy
@Grab('org.apache.pdfbox:pdfbox-examples:2.0.20')
import org.apache.pdfbox.examples.util.RemoveAllText
RemoveAllText.main(args)

Кажется, что @Grab, импорт и выполнение main работают. Но похоже, что основная функция постоянно вспоминает себя, что приводит к ошибке StackOverflowError, как показано ниже.

Caught: java.lang.StackOverflowError
java.lang.StackOverflowError
        at RemoveAllText.main(RemoveAllText.groovy)
        at RemoveAllText$main.call(Unknown Source)
        at RemoveAllText.run(RemoveAllText.groovy:5)
        at RemoveAllText.main(RemoveAllText.groovy)
        ...

Я новичок в groovy, поэтому не уверен, что делаю не так. Возможно ли то, что я пытаюсь сделать? Если возможно, как бы это сделать?

Чтобы сделать пример полностью воспроизводимым, я получаю указанную выше ошибку, когда использую pdf, найденный по адресу https://github.com/mozilla/pdf.js/raw/v2.4.456/examples/learning/helloworld.pdf. и с использованием Groovy версии 2.4.16, установленной по умолчанию репозитории в Ubuntu 18.04. Запуск команды будет

groovy RemoveAllText.groovy helloworld.pdf helloworld_out.pdf

Если я вручную загружаю необходимые файлы jar и запускаю

java -cp pdfbox-2.0.20.jar:commons-logging-1.2.jar:pdfbox-examples-2.0.20.jar org.apache.pdfbox.examples.util.RemoveAllText helloworld.pdf helloworld_out.pdf

работает без проблем.


person Mauricio Villegas    schedule 04.08.2020    source источник
comment
Мне интересно, как это вообще будет работать, потому что ваша ссылка ведет на магистраль, которая использует другой API, чем 2.0.20. Все, что вам нужно, будет здесь: svn.apache.org/viewvc/pdfbox/branches/2.0/examples/src/main/   -  person Tilman Hausherr    schedule 04.08.2020
comment
Ссылка предназначена только для того, чтобы показать, что я хочу запустить. Groovy-скрипт не использует эту ссылку, так что это не проблема. Насколько я понимаю, важным является org.apache.pdfbox.examples.util, который работает правильно, исходя из того, что я вижу.   -  person Mauricio Villegas    schedule 04.08.2020
comment
Выше код WFM. Таким образом, более вероятно, что ошибка связана с файлами PDF, указанными в качестве аргументов, или что-то еще отсутствует.   -  person cfrick    schedule 04.08.2020
comment
@cfrick Я отредактировал вопрос, включая конкретную версию pdf и groovy, чтобы сделать его полностью воспроизводимым.   -  person Mauricio Villegas    schedule 04.08.2020
comment
Еще WFM. Это с Groovy 3.0.5 и 2.4.20 и java 11, если это имеет значение.   -  person cfrick    schedule 04.08.2020
comment
Что происходит, когда args пуст. Появляется сообщение об использовании?   -  person Tilman Hausherr    schedule 04.08.2020
comment
К вашему сведению - он работал нормально и работал, как ожидалось, с использованием Groovy 2.4.7. Я пробовал использовать как RemoveAllText.main, так и new RemoveAllText (). Main - оба работали.   -  person pczeus    schedule 04.08.2020
comment
Переименуйте свой скрипт с RemoveAllText.groovy на другое, и все должно быть в порядке. Проблема в том, что ваш отличный скрипт создает то же имя класса, что и класс Apache.   -  person daggett    schedule 04.08.2020
comment
Я почти уверен, что это так - мой сценарий был назван «По-разному», и то же имя объясняет бесконечный цикл.   -  person cfrick    schedule 04.08.2020
comment
@daggett да, переименование скрипта решает проблему. Не могли бы вы добавить это в качестве ответа, чтобы я мог отметить его как решенное.   -  person Mauricio Villegas    schedule 04.08.2020


Ответы (1)


Переименуйте свой скрипт из RemoveAllText.groovy во что-нибудь еще, и все должно быть в порядке.

Проблема в том, что ваш отличный скрипт создает то же имя класса, что и класс Apache.

person daggett    schedule 04.08.2020