Điểm:1

Tại sao mã Java có thể chạy tốt theo cách thủ công, nhưng không phải từ Shell Script?

lá cờ no

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ì đó ...

guiverc avatar
lá cờ cn
Ubuntu 22.04 chưa tồn tại; hiện tại nó là bản phát hành *phát triển* của Ubuntu *jammy* và duy trì trạng thái đó cho đến khi nó đạt đến trạng thái RC, điều không được mong đợi cho đến sau ngày 14 tháng 4 năm 2022 và không nằm trong chủ đề ở đây cho đến khi bản phát hành vào ngày 21 tháng 4 năm 2022. https://discourse .ubuntu.com/t/jammy-jellyfish-release-schedule/23906 Vui lòng tham khảo https://askubuntu.com/help/on-topic. Đối với các sự cố hỗ trợ với Ubuntu *jammy*, bạn sẽ cần sử dụng trang web #ubuntu-next hoặc #ubuntu+1 (IRC, UF, v.v.)
guiverc avatar
lá cờ cn
Nếu bạn muốn báo cáo lỗi, trước hết xin cảm ơn bạn đã giúp kiểm tra bản phát hành, nhưng vui lòng xem https://help.ubuntu.com/community/ReportingBugs và sử dụng trang web #ubuntu+1 chẳng hạn như IRC, https://ubuntuforums. org/, v.v. *Trang web này không được theo dõi cho các vấn đề về ubuntu+1 hoặc #ubuntu-next* Đừng quên *jammy* vẫn ở trạng thái *alpha*
Pete avatar
lá cờ no
@guiverc Cảm ơn Guiverc! Bạn nghĩ rằng đây có thể là một lỗi? > nuốt nước bọt
guiverc avatar
lá cờ cn
Tôi không biết; Tôi chỉ lướt qua văn bản của bạn khi tôi thấy nó lạc đề; tuy nhiên, các sự cố với Ubuntu-next (Ubuntu+1) được thực hiện trên một số trang nhất định, cho phép kiểm tra các sự cố được xác nhận, các lỗi được gửi để chúng có thể được sửa - đây không phải là trang Ubuntu+1/Ubuntu-Next; tức là trang web này chỉ hỗ trợ các sản phẩm *tiêu chuẩn*. được phát hành chứ không phải ESM/EOL, cũng không phải *phát triển*.
lá cờ hr
*một* khả năng là `mvn` được đặt bí danh cho thứ gì đó trong trình bao tương tác của bạn (theo mặc định, bí danh không được mở rộng bên trong tập lệnh)
fuzzy drawings avatar
lá cờ tj
Kiểm tra đầu ra của `find "$HOME" -type f -name 'log4j2.xml'` để xem đường dẫn của bạn có đúng không.
Điểm:2
lá cờ tj

Tôi nghĩ có thể có vấn đề với đường dẫn của bạn đĩa CDtrong kịch bản.

Nhìn vào dấu nhắc lệnh của bạn khi kiểm tra mvn đã làm việc:

tôi@UbuntuV2:~/home/me/path/to/Java/Code$ mvn kiểm tra

Sự lãnh đạo ~ chỉ ra $HOME đứng trước đường dẫn được hiển thị, điều đó có nghĩa là đường dẫn đầy đủ thực sự là /home/me/home/me/path/to/Java/Code. Đây không phải là cùng một vị trí với /home/me/path/to/Java/Code trong kịch bản của bạn.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.