Salut, am o problemă frustrantă: pe mașina mea Ubuntu 22.04, am un cod Java/Maven pe care îl pot rula manual din linia de comandă:
eu@UbuntuV2:~/home/me/path/to/Java/Code$
eu@UbuntuV2:~/home/me/path/to/Java/Code$ mvn test
[INFO] Se scanează pentru proiecte...
[INFO]
[INFO] -------------------< MyCode.java >---------------------
...codul merge bine...
Acest lucru este grozav, dar trebuie să rulez același cod dintr-un script shell:
#!/bin/bash
echo "Rulează scriptul!"
cd /home/me/path/to/Java/Code
testul mvn
echo „Scriptul terminat”.
Ceea ce este ciudat este că scriptul poate lansa codul Java, dar codul rulat de script aruncă o excepție:
eu@UbuntuV2:~/home/me$
eu@UbuntuV2:~/home/me$ ./runScript.sh
Rularea scriptului!
[INFO] Se scanează pentru proiecte...
[INFO]
[INFO] -------------------< MyCode.java >---------------------
2022-03-02 12:29:44,899 principal EROARE Nu se poate accesa fișierul:/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 (Nu există un astfel de fișier sau director)
la java.base/java.io.FileInputStream.open0(Metoda nativă)
la java.base/java.io.FileInputStream.open(FileInputStream.java:219)
la java.base/java.io.FileInputStream.(FileInputStream.java:157)
...etc...
E super ciudat, nu? Când este rulat prin scriptul shell, codul Java dintr-o dată nu poate accesa un fișier „log4j2.xml”. ("Nu există un astfel de fișier sau director"). Dar fișierul este acolo, la locul său, iar codul nu are probleme de deschidere când rulez codul manual.
Deci, ce este diferit când rulez codul manual? Mi-am zguduit creierele încercând să mă gândesc la ce ar putea fi diferit. Am făcut toate următoarele:
- A verificat acel utilizator
pe mine
rulează manual codul dintr-un shell bash, la fel cum face scriptul.
- Rulați scriptul ca utilizator
pe mine
, același utilizator care poate rula codul manual
- Verificat că scriptul rulează ca
pe mine
prin adăugarea unui cine sunt
comanda din script pentru a verifica
- Folosit a
pwd
comandă pentru a verifica dacă scriptul rulează codul din directorul corect.
- Setați variabila PATH a scriptului să fie exact aceeași cale ca și utilizatorul
pe mine
folosind comanda export PATH=$PATH:/usr/local/sbin:...
în scenariu
- Am folosit comanda visudo pentru a asigura acel utilizator
pe mine
are acces nelimitat la toate fișierele de pe Ubuntu
- S-a asigurat că utilizatorul
pe mine
deține scriptul și are drepturi de execuție
- A țipat și a înjurat mult la Ubuntu
Ce altceva ar putea fi problema? Nu am scris codul Java, așa că poate că codul în sine se referă la asta log4j2.xml
fișier după căi relative, nu căi absolute...? Dar dacă acesta este cazul, de ce funcționează codul atunci când rulează manual?
Știu că aceasta este o întrebare deschisă, dar ce altceva ar putea fi diferit între versiunile script-ului și versiunile inițiate de om ale rulării acestui cod. Trebuie să-mi lipsească ceva...