我正在创建一个Java程序,该程序将执行JAR文件以在我的计算机上本地部署数据库。为此,我需要从Shell脚本执行JAR文件(这需要自动化,而不是手动部署)。
“ java -jar some-jar-SNAPSHOT.jar”
问题是,每当我尝试访问任何类型的Shell脚本时,我都会得到error = 13,权限被拒绝。我已经使用sudo chmod 777来为所有用户以及JAR文件本身读取,写入,执行目录。即使当我尝试更改目录时,也会发生此问题。
这是我用来执行命令的代码片段:
String[] jarCommand = {"java -jar some-jar-SNAPSHOT.jar"};
Process process = Runtime.getRuntime().exec(jarCommand);
System.out.println("Jar File accessed");
编辑:当我尝试执行一个简单的命令时,就会发生此权限问题,例如:
String[] cd = {jarDirectory.getAbsolutePath(), "cd"};
Runtime.getRuntime().exec(cd);
这是在通过chmod设置文件权限之后。
我看过很多不同的类似问题,但是没有一个解决方案能够解决我的问题。任何帮助将不胜感激。
答案 0 :(得分:0)
我不知道为什么这会导致权限被拒绝,但这应该是
String[] jarCommand = {"java", "-jar", "some-jar-SNAPSHOT.jar"};
否则,exec调用将查找名为“ java -jar some-jar-SNAPSHOT.jar”的可执行文件,尽管我希望这会导致ENOENT而不是EPERM。
答案 1 :(得分:0)
这与对JAR文件的执行权限无关。实际上,JAR文件只需要可读即可。
如果您的问题的标题正确,则表示Java程序是否能够读取和执行您正在谈论的 shell脚本:
shell脚本本身必须可由试图运行它们的有效用户执行。例如,脚本本身需要设置相关的执行位。
shell脚本的路径需要从根目录一直读取(有效用户...)。 (如果使用的是相对于点的相对路径,则为当前目录。如果使用的是简单的命令名称,则为目录$ PATH...。)
奇怪的是,代码片段根本不是试图运行shell脚本的尝试。那是一个简单的java
命令。不涉及任何shell脚本。
如果失败并显示“ permission否认”错误,则说明java
命令不可执行,或者JAR文件不可读。
我认为您需要向我们提供更多信息;例如所有相关的输出,真实代码以及真实的文件/目录名称和权限。
我的程序开始时只是尝试(通过CD)导航到包含JAR文件本身的目录:
我认为您意识到自己的尝试:
String[] cd = {jarDirectory.getAbsolutePath(), "cd"};
Runtime.getRuntime().exec(cd);
不起作用。它会更改子进程的当前目录,但对运行的父进程或 next 子进程没有影响。您应该使用ProcessBuilder
,尤其是它的directory(File)
,它可以用来为子进程选择其他当前目录。
这意味着您可能在错误的目录中,这可能导致“权限被拒绝”问题。