无法访问jar文件(在Linux中)

6
我们有一个运行在JBoss 5下的Web应用程序,定期启动一个'java'进程(使用ProcessBuilder)在Linux上编译文件。该进程在Windows开发机器和我们安装的Ubuntu虚拟机上都可以正常工作。命令如下:
/usr/java/jdk1.6.0_18/bin/java -Xmx256M -DiDesigner.javabin=java -jar "/aplicaciones/jboss/nfs/pmc_tdt/bin/lib/iDesigner.jar" --compiler --obfuscate --in "81.ida" --out "directory:OUTPUT"

哪个导致了错误:
Unable to access jarfile "/aplicaciones/jboss/nfs/pmc_tdt/bin/lib/iDesigner.jar"

所有路径均已确认正确,jar文件路径用双引号括起来。在喝了两杯啤酒和吃了一个巨无霸汉堡后,系统部门确认运行JBoss的用户(jbossadmin)也是该文件的所有者:

[root@miv-multicanalidad-01 lib]# pwd
/aplicaciones/jboss/nfs/pmc_tdt/bin/lib
[root@miv-multicanalidad-01 lib]# ls -l iDesigner.jar
-rw-r--r-- 1 jbossadmin jbossadmin 1329162 ene 22  2010 iDesigner.jar

我怀疑这是一个权限问题,所以我们要求他们更改执行权限,但遗憾的是,仍然没有满足。
我唯一能想到的是这可能是一个路径转换错误或者我们没有在正确的位置应用正确的权限! 编辑:Andrea Spadaccini提出了一个很好的建议,但似乎我们已经通过路径具有遍历权限:
drwxr-xr-x 3 root root 4096 abr  6  2010 /aplicaciones/
drwxr-xr-x+ 16 jbossadmin jbossadmin 4096 mar  7 10:13 /aplicaciones/jboss/
drwxrwxr-x+ 5 jbossadmin jbossadmin 4096 ene 25 09:21 /aplicaciones/jboss/nfs/
drwxr-xr-x 4 jbossadmin jbossadmin 4096 abr  6 16:03 /aplicaciones/jboss/nfs/pmc_tdt
drwxr-xr-x 4 jbossadmin jbossadmin 4096 sep  3  2010 /aplicaciones/jboss/nfs/pmc_tdt/bin/
drwxr-xr-x 3 jbossadmin jbossadmin 4096 abr  6 16:03 /aplicaciones/jboss/nfs/pmc_tdt/bin/lib/ 
编辑:使用 Eva,我们可以确认通过命令行(bash)执行该行是有效的,但如果我们在Linux上嵌入在jar文件中的ProcessBuilder类中执行该行,则会引发错误。就像我们的JBoss一样。这里参数周围的双引号很可能是问题的原因。

我将重新编译应用程序,并在命令中添加-verbose参数。 - ian_scho
1
很奇怪。不幸的是,我不熟悉JBoss.. 您可以跟踪与文件访问相关的所有系统调用,并查看哪些失败了。使用命令 strace -e trace=file -o YOUR_TRACEFILE YOUR_COMMAND 进行操作。您将在 YOUR_TRACEFILE 中找到由该命令发出的系统调用列表。检查返回值并查看发出哪些错误。 - Andrea Spadaccini
4个回答

8

@ian_scho 你好!我认为这里的问题是因为在命令行中引号是被允许的,因为它是由Linux中的bash进程解释的(即命令行解释器)...当在Java代码中使用ProcessBuilder类时,引号会被解释为路径的一部分...因此会显示“无法访问jar文件”的错误。您可以使用命令ps -adf查看进程父级,尝试将您的命令行作为后台进程运行(&)。

/usr/java/jdk1.6.0_18/bin/java -Xmx256M -DiDesigner.javabin=java -jar "/aplicaciones/jboss/nfs/pmc_tdt/bin/lib/iDesigner.jar" --compiler --obfuscate --in "81.ida" --out "directory:OUTPUT" &

然后调用命令。
ps -adf

你会发现bash进程是父进程... 如果在jboss运行时执行相同的操作,你会发现java执行的进程的父进程是另一个无法解释引号的进程。

希望这能帮到你 :)


我可以确认通过命令行(bash)执行该行代码是有效的...谢谢/感谢。现在我需要转义这些引号! - ian_scho
在Groovy脚本中遇到了同样的问题。将这个:"java -jar "/some/path/to/some.jar"".execute()改为:["java", "-jar", "/some/path/to/some.jar"].execute()结果更好了。 - SteveDonie

4

检查通往JAR文件的所有目录是否对jbossadmin用户具有读取和遍历权限(+rx)。


谢谢Andrea,我已经更新了原始帖子,并列出了每个目录下“ls -ld”命令的输出。看起来如果我没读错的话,我们已经拥有了权限。 - ian_scho
没错,它解决了我的问题,加一分! - Yahya

4
如果您正在从shell脚本运行Java命令,请检查shell脚本是否具有Linux / Unix行终止符,而不是Windows终止符。如果shell脚本是在Windows平台上创建的,则可能会出现这种情况。在Linux上使用Kate编辑器进行检查和更正,或者如果可用,使用dos2unix实用程序。

1
非常感谢!我花了一整天的时间来解决那个问题。 - Yaryna

1

进入包含jar文件的目录。

cd /aplicaciones/jboss/nfs/pmc_tdt/bin/lib/

然后使用以下命令在目录中执行.jar文件:

java -jar ./iDesigner.jar

那对我有效。


我刚遇到了同样的问题,目前我找到的唯一解决方法是使用 cd 命令。有没有其他不需要使用 cd 的解决方法呢? - Kirk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接