嗨,有一个令人沮丧的问题:在我的Ubuntu22.04机器上,我有一些Java/Maven代码,可以从命令行手动运行:
me@UbuntuV2:~/home/me/path/to/Java/Code$
me@UbuntuV2:~/home/me/path/to/Java/Code$ mvn test
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< MyCode.java >--------------------
...code runs fine...这很好,但是我需要从shell脚本中运行相同的代码:
#!/bin/bash
echo "Running the script!"
cd /home/me/path/to/Java/Code
mvn test
echo "Script finished."奇怪的是,脚本可以启动Java代码,但是脚本运行的代码会抛出异常:
me@UbuntuV2:~/home/me$
me@UbuntuV2:~/home/me$ ./runScript.sh
Running the script!
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< MyCode.java >--------------------
2022-03-02 12:29:44,899 main ERROR Unable to access file:/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 (No such file or directory)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
at java.base/java.io.FileInputStream.(FileInputStream.java:157)
...etc...这太奇怪了,对吧?当运行shell脚本时,Java代码突然无法访问"log4j2.xml“文件。(“没有这样的文件或目录”),但是文件已经到位,当我手动运行代码时,代码没有打开它的问题。
那么,当我手动运行代码时,有什么不同呢?我绞尽脑汁想出什么是不同的。我做了以下所有的事情:
me从bash手动运行代码,就像脚本一样。me的身份运行脚本,该用户可以手动运行代码me命令,验证脚本是否以whoami形式运行pwd命令验证脚本是否从正确的目录运行代码。me将脚本的PATH变量设置为与用户export PATH=$PATH:/usr/local/sbin:...完全相同的路径me可以无限地访问Ubuntu上的所有文件me拥有脚本并具有执行权限问题还会是什么?我没有编写Java代码,所以也许代码本身是通过相对路径而不是绝对路径来引用这个log4j2.xml文件的.?但是,如果是这样的话,为什么代码在手动运行时工作呢?
我知道这是一个开放的问题,但是在运行这段代码的脚本和人工启动的版本之间还有什么不同之处。我一定是错过了什么..。
发布于 2022-03-05 02:46:58
我认为脚本中的cd路径可能有问题。
当mvn test工作时,查看命令提示符:
me@UbuntuV2:~/home/me/path/to/Java/Code$ mvn test
前面的~表示$HOME位于显示的路径之前,这意味着完整的路径实际上是/home/me/home/me/path/to/Java/Code。这与脚本中的/home/me/path/to/Java/Code不同。
https://askubuntu.com/questions/1395644
复制相似问题