Привет, у меня неприятная проблема: на моей машине с 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
файл по относительным путям, а не по абсолютным путям...? Но если это так, то почему код работает при ручном запуске?
Я знаю, что это открытый вопрос, но что еще может отличаться между сценариями и версиями запуска этого кода, инициируемыми человеком. Я должен что-то упустить...