2012-05-04 82 views
1

我想在服务器上运行Xuggle 5.4,并且有一个异常我不知道该如何处理。相同的代码可以在另外两个服务器上正常工作,也可以在另一个应用程序(Playframework)下的同一台服务器上工作。它在另一个应用程序下运行的事实使我认为这可能是错误。java.io.IOException:权限被Xuggle拒绝

错误的根源似乎是Xuggle试图创建临时文件并且访问被拒绝。我怎么弄清楚这是哪里?如前所述,可能这是其他安装已经使用的位置,并且正在另一个用户帐户下运行。

这是堆栈跟踪:

2012-05-04 08:49:01,985 ERROR ~ could not create temp file: {} 
java.io.IOException: Permission denied 
    at java.io.UnixFileSystem.createFileExclusively(Native Method) ~[na:1.6.0_26] 
    at java.io.File.checkAndCreate(File.java:1704) ~[na:1.6.0_26] 
    at java.io.File.createTempFile(File.java:1792) ~[na:1.6.0_26] 
    at com.xuggle.ferry.JNILibrary.unpackLibrary(JNILibrary.java:274) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.JNILibrary.loadFromClasspath(JNILibrary.java:195) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.JNILibrary.load(JNILibrary.java:176) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.JNILibrary.load(JNILibrary.java:158) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.FerryJNI.<clinit>(FerryJNI.java:16) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.Ferry.<clinit>(Ferry.java:25) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.xuggler.XugglerJNI.<clinit>(XugglerJNI.java:19) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.xuggler.IContainer.<clinit>(IContainer.java:1622) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.mediatool.MediaReader.<init>(MediaReader.java:137) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.mediatool.ToolFactory.makeReader(ToolFactory.java:77) [xuggle-xuggler-5.4.jar:5.4.0] 
    at logic.server.MediaCoder.createEncodingJobs(MediaCoder.java:39) [idoms-server:na] 
    at controllers.FileCopyJob$ProgressListener.actionPerformed(FileCopyJob.java:127) [idoms-server:na] 
    at controllers.FileCopyJob$DownloadCountingOutputStream.afterWrite(FileCopyJob.java:84) [idoms-server:na] 
    at org.apache.commons.io.output.ProxyOutputStream.write(ProxyOutputStream.java:92) [commons-io-2.0.1.jar:2.0.1] 
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1263) [commons-io-2.0.1.jar:2.0.1] 
    at org.apache.commons.io.IOUtils.copy(IOUtils.java:1236) [commons-io-2.0.1.jar:2.0.1] 
    at controllers.FileCopyJob.doJob(FileCopyJob.java:58) [idoms-server:na] 
    at play.jobs.Job.doJobWithResult(Job.java:50) [play-1.2.4.jar:na] 
    at play.jobs.Job.call(Job.java:146) [play-1.2.4.jar:na] 
    at play.jobs.Job$1.call(Job.java:66) [play-1.2.4.jar:na] 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) [na:1.6.0_26] 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) [na:1.6.0_26] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) [na:1.6.0_26] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206) [na:1.6.0_26] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [na:1.6.0_26] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [na:1.6.0_26] 
    at java.lang.Thread.run(Thread.java:662) [na:1.6.0_26] 
2012-05-04 08:49:02,003 ERROR ~ could not create temp file: {} 
java.io.IOException: Permission denied 
    at java.io.UnixFileSystem.createFileExclusively(Native Method) ~[na:1.6.0_26] 
    at java.io.File.checkAndCreate(File.java:1704) ~[na:1.6.0_26] 
    at java.io.File.createTempFile(File.java:1792) ~[na:1.6.0_26] 
    at com.xuggle.ferry.JNILibrary.unpackLibrary(JNILibrary.java:274) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.JNILibrary.loadFromClasspath(JNILibrary.java:195) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.JNILibrary.load(JNILibrary.java:176) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.JNILibrary.load(JNILibrary.java:158) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.FerryJNI.<clinit>(FerryJNI.java:16) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.Ferry.<clinit>(Ferry.java:25) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.xuggler.XugglerJNI.<clinit>(XugglerJNI.java:19) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.xuggler.IContainer.<clinit>(IContainer.java:1622) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.mediatool.MediaReader.<init>(MediaReader.java:137) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.mediatool.ToolFactory.makeReader(ToolFactory.java:77) [xuggle-xuggler-5.4.jar:5.4.0] 
    at logic.server.MediaCoder.createEncodingJobs(MediaCoder.java:39) [idoms-server:na] 
    at controllers.FileCopyJob$ProgressListener.actionPerformed(FileCopyJob.java:127) [idoms-server:na] 
    at controllers.FileCopyJob$DownloadCountingOutputStream.afterWrite(FileCopyJob.java:84) [idoms-server:na] 
    at org.apache.commons.io.output.ProxyOutputStream.write(ProxyOutputStream.java:92) [commons-io-2.0.1.jar:2.0.1] 
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1263) [commons-io-2.0.1.jar:2.0.1] 
    at org.apache.commons.io.IOUtils.copy(IOUtils.java:1236) [commons-io-2.0.1.jar:2.0.1] 
    at controllers.FileCopyJob.doJob(FileCopyJob.java:58) [idoms-server:na] 
    at play.jobs.Job.doJobWithResult(Job.java:50) [play-1.2.4.jar:na] 
    at play.jobs.Job.call(Job.java:146) [play-1.2.4.jar:na] 
    at play.jobs.Job$1.call(Job.java:66) [play-1.2.4.jar:na] 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) [na:1.6.0_26] 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) [na:1.6.0_26] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) [na:1.6.0_26] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206) [na:1.6.0_26] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [na:1.6.0_26] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [na:1.6.0_26] 
    at java.lang.Thread.run(Thread.java:662) [na:1.6.0_26] 
2012-05-04 08:49:02,015 ERROR ~ Could not load library: xuggle; version: 5; Visit http://www.xuggle.com/xuggler/faq/ to find common solutions to this problem 
08:49:02,115 ERROR ~ 

@6a91glkdf 
Error during job execution (controllers.FileCopyJob) 

Oops: UnsatisfiedLinkError 
An unexpected error occured caused by exception UnsatisfiedLinkError: no xuggle in java.library.path 

play.exceptions.UnexpectedException: Unexpected Error 
    at play.Invoker$Invocation.onException(Invoker.java:244) 
    at play.jobs.Job.onException(Job.java:124) 
    at play.jobs.Job.call(Job.java:163) 
    at play.jobs.Job$1.call(Job.java:66) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: java.lang.UnsatisfiedLinkError: no xuggle in java.library.path 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:823) 
    at java.lang.System.loadLibrary(System.java:1028) 
    at com.xuggle.ferry.JNILibraryLoader.loadLibrary0(JNILibraryLoader.java:268) 
    at com.xuggle.ferry.JNILibraryLoader.loadLibrary(JNILibraryLoader.java:171) 
    at com.xuggle.ferry.JNILibrary.load(JNILibrary.java:161) 
    at com.xuggle.ferry.FerryJNI.<clinit>(FerryJNI.java:16) 
    at com.xuggle.ferry.Ferry.<clinit>(Ferry.java:25) 
    at com.xuggle.xuggler.XugglerJNI.<clinit>(XugglerJNI.java:19) 
    at com.xuggle.xuggler.IContainer.<clinit>(IContainer.java:1622) 
    at com.xuggle.mediatool.MediaReader.<init>(MediaReader.java:137) 
    at com.xuggle.mediatool.ToolFactory.makeReader(ToolFactory.java:77) 
    at logic.server.MediaCoder.createEncodingJobs(MediaCoder.java:39) 
    at controllers.FileCopyJob$ProgressListener.actionPerformed(FileCopyJob.java:127) 
    at controllers.FileCopyJob$DownloadCountingOutputStream.afterWrite(FileCopyJob.java:84) 
    at org.apache.commons.io.output.ProxyOutputStream.write(ProxyOutputStream.java:92) 
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1263) 
    at org.apache.commons.io.IOUtils.copy(IOUtils.java:1236) 
    at controllers.FileCopyJob.doJob(FileCopyJob.java:58) 
    at play.jobs.Job.doJobWithResult(Job.java:50) 
    at play.jobs.Job.call(Job.java:146) 
    ... 8 more 
+0

什么用户在这个失败的程序运行的?它试图粘贴临时文件在哪里?谁拥有它试图粘贴临时文件的目录以及该目录的权限是什么? 也许你可以像'strace'这样的命令来运行程序,试图看看它试图创建临时文件的位置。 – QuantumMechanic

+0

用户与Play!的目录相同。正在运行,并且由用户拥有。问题是,我不知道它试图写入的地方,但也许strace的工具可以工作。我可能会看看 –

回答

2

那么问题是用来存储二进制文件的临时目录。由于另一个实例创建了此临时位置,因此不同用户名下的第二个进程无权访问。 开发人员知道这个问题。删除临时目录或授予权利解决问题

+0

您是否找到解决此问题的解决方案?我正在与类似的问题斗争。 Xuggler无法在服务器端创建文件。 – goodm

+0

你必须找出它正在使用的临时目录。我修改了代码,把一个文本字符串出来告诉我的临时目录,并给予所有权利。如果有多个用户,则可能必须在第一个用户创建目录和文件后再次执行此操作。 –

+0

也许会尝试,现在我们的后端主人更改了用户的权限。 – goodm

0

虽然这个问题是相当古老的,并且xuggle已被弃用,但我仍然认为在查看这里的注释后我是如何解决这个问题的。

可以设置java.io.tmpdir属性,而不是删除文件夹或更改其权限。

喜欢本作例子:

java -Djava.io.tmpdir="~/custom/tempdir/" HelloWorld 

背景:

至于建议由另外一个答案评论,找出问题的根源回,在创建的临时文件夹中的作用问题,显示java使用可以自定义的默认位置。

public static File createTempFile(String prefix, 
            String suffix, 
            File directory) 
          throws IOException 

创建指定目录中的新的空文件,使用给定的前缀和后缀字符串生成其名称。如果此方法成功返回则保证:

  1. 由返回的抽象路径名此方法之前不存在表示的文件被调用,并
  2. 无论这种方法也不是任何变体将返回相同在虚拟机的当前调用中再次提取抽象路径名。

[...]

如果directory参数为null,则系统有关的默认临时文件目录将被使用。默认的临时文件目录由系统属性java.io.tmpdir指定。在UNIX系统上,这个属性的默认值通常是“/ tmp”或“/ var/tmp”;在Microsoft Windows系统上,它通常是“C:\ WINNT \ TEMP”。当调用Java虚拟机时,可能会给此系统属性赋予不同的值,但对此属性的编程更改不保证对此方法使用的临时目录有任何影响。

参见:

  1. JavaDoc createTempFile(String, String, File)
  2. Old Google Groups discussion