【问题标题】:"Unable to access jarfile" in linux landlinux土地中的“无法访问jarfile”
【发布时间】:2011-07-30 23:42:02
【问题描述】:

我们有一个在 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 file path is enclosed by double quotes。在喝了两杯啤酒和一个巨无霸之后,系统部门确认运行 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

我怀疑是rights issue,所以我们请他们给change the permissions to execute,但唉,仍然不满意。

我唯一能想到的就是path translation error 或者我们没有在正确的地方应用正确的权限!

编辑: 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) 执行该行它可以工作,但是如果我们从 ProcessBuilder 类执行该行,它会引发错误,嵌入在一个 jar 中文件,在 Linux 中。就像我们的 JBoss 会做的那样。参数周围的双引号是此处问题的最可能原因。

【问题讨论】:

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

标签: java linux jar


【解决方案1】:

进入jar文件所在目录

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

然后执行目录下的.jar文件,

java -jar ./iDesigner.jar

这对我有用。

【讨论】:

  • 我刚遇到同样的问题,目前我找到的唯一方法是cd。没有cd,还有其他方法可以解决这个问题吗?
【解决方案2】:

如果您从 shell 脚本运行 Java 命令,请检查 shell 脚本是否有 Linux/Unix 行终止符而不是 Windows 行终止符,如果 shell 脚本是在 Windows 平台上创建的,则可能会发生这种情况。在这种情况下肯定会发生所述错误。

使用 Linux 上的 Kate 编辑器进行检查和纠正,或者使用 dos2unix 实用程序(如果可用)。

【讨论】:

  • 非常感谢!我花了一整天的时间试图解决这个问题。
【解决方案3】:

@ian_scho 嗨!,我认为这里的问题是允许使用命令行引号,因为它是由 linux 中的进程 bash 解释的(这是命令行解释)......当在 java 代码中使用 ProcessBuilder 类时, 引号被解释为路径的一部分...因为显示错误“无法访问 jarfile”。您可以使用命令 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) 执行该行它可以工作... ty/gracias。现在我需要转义那些引号!
  • 在 groovy 脚本中遇到了同样的问题。改变了这个:“java -jar \”/some/path/to/some.jar\"".execute() 到这个:[“java”,“-jar”,“/some/path/to/some.jar "].execute() 并得到了更好的结果。
【解决方案4】:

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

【讨论】:

  • 感谢安德里亚,我已经用针对每个目录的“ls -ld”命令的输出更新了原始帖子。如果我没看错的话,看起来我们已经拥有了权限。
  • 没错,它解决了我的问题,不过还有一个!
猜你喜欢
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 2013-09-27
  • 2018-12-17
  • 2022-12-05
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多