【问题标题】:Command-line options working in windows, but not Linux命令行选项适用于 Windows,但不适用于 Linux
【发布时间】:2013-12-17 17:09:08
【问题描述】:

我在 Linux 上的 Windows/shell 脚本上有一个 .bat 文件,它从命令行启动一个大型 Java 应用程序。它配置类路径、环境变量等。

在某一时刻,它使用RMID 来配置一堆服务,这些服务将在它们自己的 JVM 中运行。问题是它不允许我为 Linux 上的代码库属性指定多个 JAR。它允许我在 Windows 上这样做就好了,但我认为我的语法/样式对于 .sh 脚本一定是错误的,我希望更有经验的 Linux 用户可以提供一些提示。在 Windows 上,工作行如下所示:

SET RMID_OPTIONS=%RMID_VM% 
    -J-DINSTALL_DIR=%CONFIG_PATH% 
    -C-DINSTALL_DIR=%CONFIG_PATH% 
    -J-DINSTALL_DIR_LOCAL=%HOME_DIR% 
    -C-DINSTALL_DIR_LOCAL=%HOME_DIR% 
    -J-Djava.security.policy=%PL_HOME%\windows\system.policy

    -C-Djava.rmi.server.codebase=
        "file:/%HOME_DIR%\jar1.jar file:/%HOME_DIR%\jar2.jar"

    -J-Djava.rmi.server.codebase=
        "file:/%HOME_DIR%\jar1.jar file:/%HOME_DIR%\jar2.jar"
     // more stuff here

唯一重要的行是设置rmi.server.codebase 属性的行。上述工作 100% 正常,但是,当尝试在 Linux 的代码库中设置多个 JAR 时,它会导致一般故障并且整个 RMID 命令没有执行。我的 shell 脚本如下所示:

export RMID_OPTIONS="${RMID_VM} 
    -J-DINSTALL_DIR=${CONFIG_PATH} 
    -C-DINSTALL_DIR=${CONFIG_PATH} 
    -J-DINSTALL_DIR_LOCAL=${HOME_DIR} 
    -C-DINSTALL_DIR_LOCAL=${HOME_DIR} 
    -J-Djava.security.policy=${PL_HOME}/linux/system.policy 
    -C-Djava.rmi.server.codebase=
        ""file:/${HOME_DIR}/jar1.jar file:/${PL_HOME_LOCAL}/jar2.jar"" 
    -J-Djava.rmi.server.codebase=
        ""file:/${HOME_DIR}/jar1.jar file:/${PL_HOME_LOCAL}/jar2.jar"" 
     // more stuff here
     "

如果只指定一个 JAR,shell 脚本本身就可以正常工作,但是再指定一个 JAR,我就会遇到一般故障。关于我做错了什么有什么建议吗?我愿意尝试新的东西来解决这个问题,因为到目前为止我的所有尝试都没有结果。

【问题讨论】:

  • 定义“一般故障”。为什么是双双引号?为什么所有的 RMId 选项?您在注册可激活对象时指定那些,在您启动它时指定机器人。
  • 一般故障,我的意思是它导致可激活对象无法注册,因此无法启动。双引号是一种 Linux 约定,仅在定义变量时解释特殊字符,如本文所述 (serverwatch.com/tutorials/article.php/3898896/…)。我对 Linux 不够熟悉,不知道它们是否不适合这种情况。如果您认为这可能是一个问题,我愿意改变。我得到的具体错误是rmid: illegal option: file://home/jar2.jar(对不起,我以为我把它放在上面了)
  • 'General' 没有任何意义。 “失败”是指异常或错误消息。你应该把它贴在这里,在你的问题中。

标签: java linux bash shell rmi


【解决方案1】:

在 Linux 下,转义引号的方式不同。您正在尝试使用特定于 Windows 的语法,这将导致 jar 文件作为单独的参数传递,而不是应有的单个参数。

您必须在 Linux 中使用 \",而不是 "" 在引号内生成引号:

export RMID_OPTIONS="... -C-Djava.rmi.server.codebase=\"file:/${HOME_DIR}/jar1.jar file:/${PL_HOME_LOCAL}/jar2.jar\" ..."

除此之外,我不确定file:/ 语法是否正确。它可能是 file:// 或前面没有任何内容的绝对文件路径,但您必须尝试一下。

【讨论】:

  • 感谢您的建议。但是,我已经尝试了您提到的所有内容,但仍然从 RMID 收到 Illegal Option 错误,特别是标记第二个 jar。
  • 你怎么称呼rmid?那里可能有问题;如果 RMID_OPTIONS 不加引号,它仍会拆分为多个参数,而不考虑嵌入的引号。
  • 在动态设置了一堆环境变量后,我在 .sh 脚本文件中调用它。我已验证变量设置是否正确,并且已验证 Linux RMID 调用的明文与 Windows RMID 调用的明文相同,但仅在 Linux 上仍然出现相同的错误。
【解决方案2】:

你做错了。您根本不需要使用参数和系统属性来启动 rmid。当您在激活设置程序中注册要使用的ActivationGroup(s) 时,应指定所有这些内容。这反过来意味着所有命令行问题都应该消失。

【讨论】:

    猜你喜欢
    • 2021-05-02
    • 2011-12-16
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2011-10-27
    • 1970-01-01
    相关资源
    最近更新 更多