Xin chào, tôi có một vấn đề khó chịu: Trên máy Ubuntu 22.04 của tôi, tôi có một số mã Java/Maven mà tôi có thể chạy thủ công từ dòng lệnh:
me@UbuntuV2:~/home/me/path/to/Java/Code$
me@UbuntuV2:~/home/me/path/to/Java/Code$ mvn test
[INFO] Đang quét dự án...
[THÔNG TIN]
[INFO] --------------------< MyCode.java >------------------
... mã chạy tốt ...
Điều này thật tuyệt, nhưng tôi cần chạy cùng mã này từ tập lệnh Shell:
#!/bin/bash
echo "Đang chạy tập lệnh!"
cd/nhà/tôi/đường dẫn/đến/Java/Mã
kiểm tra mvn
echo "Kịch bản đã hoàn thành."
Điều kỳ lạ là tập lệnh có thể khởi chạy mã Java, nhưng mã chạy tập lệnh lại đưa ra một ngoại lệ:
tôi@UbuntuV2:~/home/me$
me@UbuntuV2:~/home/me$ ./runScript.sh
Chạy kịch bản!
[INFO] Đang quét dự án...
[THÔNG TIN]
[INFO] --------------------< MyCode.java >------------------
2022-03-02 12:29:44,899 LỖI chính Không thể truy cập tệp:/home/me/path/to/Java/Code/src/test/resources/log4j2.xml java.io.FileNotFoundException: /home/me/ đường dẫn/đến/Java/Mã/src/test/resource/log4j2.xml (Không có tệp hoặc thư mục như vậy)
tại java.base/java.io.FileInputStream.open0(Phương thức gốc)
tại java.base/java.io.FileInputStream.open(FileInputStream.java:219)
tại java.base/java.io.FileInputStream.(FileInputStream.java:157)
...vân vân...
Điều này là siêu lạ, phải không? Khi chạy qua tập lệnh shell, mã Java đột nhiên không thể truy cập tệp "log4j2.xml". ("Không có tệp hoặc thư mục như vậy") Nhưng tệp ở đó, tại chỗ và mã không gặp sự cố khi mở tệp khi tôi chạy mã theo cách thủ công.
Vậy có gì khác biệt khi tôi chạy mã thủ công? Tôi đã vắt óc suy nghĩ xem điều gì có thể khác đi. Tôi đã thực hiện tất cả những điều sau đây:
- Đã xác minh người dùng đó
tôi
chạy mã theo cách thủ công từ trình bao bash, giống như tập lệnh.
- Chạy tập lệnh với tư cách người dùng
tôi
, cùng một người dùng có thể chạy mã theo cách thủ công
- Đã xác minh rằng tập lệnh chạy dưới dạng
tôi
bằng cách thêm một tôi là ai
lệnh trong tập lệnh để kiểm tra
- Đã sử dụng một
pwd
lệnh để xác minh rằng tập lệnh chạy mã từ đúng thư mục.
- Đặt biến PATH của tập lệnh thành Đường dẫn chính xác giống như người dùng
tôi
sử dụng lệnh xuất PATH=$PATH:/usr/local/sbin:...
trong kịch bản
- Đã sử dụng lệnh visudo để đảm bảo rằng người dùng
tôi
có quyền truy cập không giới hạn vào tất cả các tệp trên Ubuntu
- Đảm bảo người dùng
tôi
sở hữu tập lệnh và có quyền thực thi
- La hét và chửi bới Ubuntu rất nhiều
Vấn đề có thể là gì khác? Tôi đã không viết mã Java, vì vậy có thể bản thân mã đề cập đến điều này log4j2.xml
tệp theo đường dẫn tương đối, không phải đường dẫn tuyệt đối...? Nhưng nếu đúng như vậy, tại sao mã hoạt động khi chạy thủ công?
Tôi biết đây là một câu hỏi mở, nhưng còn điều gì khác có thể khác nhau giữa tập lệnh và phiên bản do con người khởi xướng khi chạy mã này. Tôi phải thiếu một cái gì đó ...