我有一个可执行文件(ffmpeg),我正在尝试使用Mac上的Java程序运行。我使用Java程序发送命令chmod 777 /path/to/ffmpeg
,但是当我尝试运行ffmpeg时,我收到以下错误:
java.io.IOException: Cannot run program "/Users/james/WalkTheHall/ffmpeg": error=13, Permission denied
但是当我在打开Java应用程序之前自己从Terminal运行chmod 777 /path/to/ffmpeg
时,ffmpeg的命令在Java程序中运行得很好。
在Java程序中调用chmod
并自己调用它是否有区别?为什么它不起作用?谢谢!
答案 0 :(得分:6)
我的代码中遇到了同样的问题。 我通过在exec之后添加waitFor来解决这个问题。执行下一个命令时,“chmod”进程未完成。代码可能如下所示:
p = Runtime.getRuntime.exec("chmod 777 xxx");
p.waitFor();
Runtime.getRuntime.exec("./xxx");
答案 1 :(得分:4)
是的,有区别。从终端运行命令时,您正在执行操作,因此使用您的凭据执行该操作。 Java应用程序使用Java应用程序的权限运行该命令。这是为了防止应用程序运行,然后对文件系统进行危险的,不需要的更改。也许其他人可以为此解决方法并为其提供指导。
答案 2 :(得分:4)
我猜测chmod
是一个shell命令,而不是一个可执行文件。尝试通过shell运行chmod
。在此处查看更多详细信息:Want to invoke a linux shell command from Java
答案 3 :(得分:2)
我目前正在开发一个也在OSX上使用FFMpeg的项目。我将FFMpeg存储在JAR中并提取它并在使用时设置可执行文件,就像您似乎正在做的那样。这就是我的工作,似乎有效。
public static void setExecutable(File file, boolean executable) { Process p = Runtime.getRuntime().exec(new String[] { "chmod", "u"+(executable?'+':'-')+"x", file.getAbsolutePath(), }); // do stuff to make sure p finishes & capture output }
代码是GPL,所以请随时查看。它不是最好的代码库,甚至FFMpeg的东西也许过于复杂,但它确实有效。
查看来源这两个文件特别适合您
答案 4 :(得分:1)
试试这个:
commandFile.setExecutable(true);
Process p = Runtime.getRuntime.exec(commandFile.getAbsoluteFile());
答案 5 :(得分:0)
要在OSX上启动程序,您需要这样做:
public class Booking
{
public int BookingId { get; set; }
public DateTime Arrival { get; set; }
public DateTime Departure { get; set; }
public virtual Guest MainGuest { get; set; }
}
public class Guest
{
public int GuestId { get; set; }
public string Name { get; set; }
public string FirstName { get; set; }
}
using(var context = new HotelContext())
{
var cBookings = context.Bookings.Where(b => b.MainGuest != null);
foreach (var cBooking in cBookings)
{
// Since EF 6.4.4
// MySqlException: There is already an open DataReader associated with this Connection which must be closed first.
Console.WriteLine(cBooking.MainGuest.Name);
}
}
path应该是程序摘录的路径,例如:
AppStore->应用程序/ App \ Store.app/Contents/MacOS/App \ Store