Рейтинг:1

Почему код Java может нормально работать вручную, но не из сценария оболочки?

флаг no

Привет, у меня неприятная проблема: на моей машине с Ubuntu 22.04 у меня есть код Java/Maven, который я могу запустить вручную из командной строки:

me@UbuntuV2:~/home/me/path/to/Java/Code$
me@UbuntuV2:~/home/me/path/to/Java/Code$ mvn test
[INFO] Поиск проектов...
[ИНФОРМАЦИЯ]
[INFO] ------------------< MyCode.java >--------------------
...код работает нормально...

Это здорово, но мне нужно запустить этот же код из сценария оболочки:

#!/бин/баш

echo "Запуск скрипта!"
cd /home/me/путь/к/Java/код
мвн тест
echo "Сценарий завершен."

Странно то, что скрипт может запускать код Java, но код запуска скрипта выдает исключение:

я@UbuntuV2:~/home/me$
я@UbuntuV2:~/home/me$ ./runScript.sh
Запуск скрипта!
[INFO] Поиск проектов...
[ИНФОРМАЦИЯ]
[INFO] ------------------< MyCode.java >--------------------
2022-03-02 12:29:44,899 основная ОШИБКА Невозможно получить доступ к файлу:/home/me/path/to/Java/Code/src/test/resources/log4j2.xml java.io.FileNotFoundException: /home/me/ path/to/Java/Code/src/test/resources/log4j2.xml (Нет такого файла или каталога)
    в java.base/java.io.FileInputStream.open0 (собственный метод)
    в java.base/java.io.FileInputStream.open(FileInputStream.java:219)
    в java.base/java.io.FileInputStream.(FileInputStream.java:157)
    ...и т.д...

Это суперстранно, да? При запуске сценария оболочки код Java внезапно не может получить доступ к файлу «log4j2.xml». («Нет такого файла или каталога») Но файл есть, на месте, и у кода нет проблем с его открытием, когда я запускаю код вручную.

Так что же отличается, когда я запускаю код вручную? Я ломал голову, пытаясь придумать, что может быть по-другому. Я сделал все следующее:

  • Подтвердил, что пользователь меня вручную запускает код из оболочки bash, как это делает скрипт.
  • Запустите скрипт от имени пользователя меня, тот же пользователь, который может запускать код вручную
  • Проверено, что скрипт работает как меня добавив кто я команда в скрипте для проверки
  • Использовал pwd чтобы убедиться, что скрипт запускает код из правильного каталога.
  • Установите переменную PATH сценария так, чтобы она была точно такой же, как у пользователя. меня используя команду экспорт PATH=$PATH:/usr/local/sbin:... в сценарии
  • Использовал команду visudo, чтобы убедиться, что пользователь меня имеет неограниченный доступ ко всем файлам на Ubuntu
  • Убедился, что пользователь меня владеет скриптом и имеет права на выполнение
  • Много кричал и ругался на Ubuntu

В чем еще может быть проблема? Я не писал код Java, поэтому, возможно, сам код относится к этому log4j2.xml файл по относительным путям, а не по абсолютным путям...? Но если это так, то почему код работает при ручном запуске?

Я знаю, что это открытый вопрос, но что еще может отличаться между сценариями и версиями запуска этого кода, инициируемыми человеком. Я должен что-то упустить...

guiverc avatar
флаг cn
Ubuntu 22.04 еще не существует; в настоящее время это *разрабатываемый* выпуск Ubuntu *jammy* и остается им до тех пор, пока не достигнет состояния RC, что ожидается не ранее 14 апреля 2022 года и не будет здесь обсуждаться до выпуска 21 апреля 2022 года. https://discourse .ubuntu.com/t/jammy-jellyfish-release-schedule/23906 См. https://askubuntu.com/help/on-topic. Для проблем с поддержкой Ubuntu *jammy* вам нужно использовать сайт #ubuntu-next или #ubuntu+1 (IRC, UF и т. д.)
guiverc avatar
флаг cn
Если вы хотите сообщить об ошибках, во-первых, спасибо за помощь в тестировании выпуска, но, пожалуйста, посетите https://help.ubuntu.com/community/ReportingBugs и используйте сайт #ubuntu+1, такой как IRC, https://ubuntuforums. org/ и т. д. *Этот сайт не отслеживается на наличие ошибок ubuntu+1 или #ubuntu-next* Не забывайте, что *jammy* все еще находится в *альфе*
Pete avatar
флаг no
@guiverc Спасибо, Гиверк! Как вы думаете, это может быть ошибка? >глоток
guiverc avatar
флаг cn
Я не знаю; Я просмотрел ваш текст только после того, как увидел, что он не по теме; однако проблемы с Ubuntu-next (Ubuntu+1) выполняются на определенных сайтах, что позволяет проводить тестирование для подтверждения проблем, записывать ошибки, чтобы их можно было исправить - это не сайт Ubuntu+1/Ubuntu-Next; этот сайт поддерживает только *стандартные* продукты, т.е. выпущен, а не ESM/EOL и не *в разработке*.
флаг hr
*одна* возможность заключается в том, что `mvn` связан с чем-то в вашей интерактивной оболочке (псевдонимы не расширяются внутри скриптов по умолчанию)
fuzzy drawings avatar
флаг tj
Проверьте вывод `find "$HOME" -type f -name 'log4j2.xml'`, чтобы убедиться, что ваши пути верны.
Рейтинг:2
флаг tj

Я думаю, что может быть проблема с вашим путем CDв сценарии.

Глядя на вашу командную строку, когда мвн тест работал:

я @UbuntuV2:~/home/me/path/to/Java/Code$ mvn test

Ведущий ~ указывает $ГЛАВНАЯ предшествует отображаемому пути, что означало бы, что полный путь на самом деле /дом/я/дом/я/путь/к/Java/код. Это не то же место, что и /дом/я/путь/к/Java/код в вашем сценарии.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.