【问题标题】:Cannot execute shell script without command line manual classpath update first在没有命令行手动类路径更新的情况下无法执行 shell 脚本
【发布时间】:2012-07-20 17:43:34
【问题描述】:

我希望这相当简单,但我很难让它发挥作用。

我有一个 java 包,我想使用 shell 脚本命令来执行它...

/jdk1.7.0/bin/java .path.to.classname.ClassToExecute >> /var/log/output.log

...所以本质上...

./SCRIPT_NAME

...应该从命令行运行上述内容。

问题是每次首先从命令行更新类路径以使会话能够看到特定的 JAR...

export CLASSPATH=$CLASSPATH:/path/to/jar/file/lib/JAR_NAME.jar:.

如果我不把这一行放在第一位,shell 脚本将不会执行抛出与我需要手动添加的 JAR 相关的 NoClassDefFoundError 错误。

谁能告诉我我需要在哪里编辑这个类路径更新,以便脚本和 cron 始终可以使用它,因为最终我想从 cron 调用它?

谢谢, 森林SDMC

【问题讨论】:

    标签: shell jar cron classpath


    【解决方案1】:

    您的 shell 脚本应该如下所示。

    #!/bin/bash
    export CLASSPATH=$CLASSPATH:/path/to/jar/file/lib/JAR_NAME.jar:. 
    /jdk1.7.0/bin/java .path.to.classname.ClassToExecute >> /var/log/output.log 
    

    您还需要更改脚本的权限,使其可执行

    chmod 700 SCRIPT_NAME
    

    700 = 所有者只能执行脚本 770 = 组的所有者和成员可以运行脚本 777 = 有权访问服务器的每个人都可以运行该脚本。

    注意到您想从 cron 运行它。您需要从 crontab 条目或脚本中获取 .profile。

    【讨论】:

      【解决方案2】:

      刚刚找到答案并且工作正常,因此希望其他人会发现这很有用...

      您可以在 shell 脚本中动态生成类路径变量,然后将其作为属性应用到 java 命令行执行。像这样……

      THE_CLASSPATH=
      for i in `ls /path/to/the/JARS/lib/*.jar`
      do
        THE_CLASSPATH=${THE_CLASSPATH}:${i}
      done
      
      /usr/bin/java -cp ".:${THE_CLASSPATH}" path.to.the.class.ClassName >> /var/log/logfile.log
      

      【讨论】:

        猜你喜欢
        • 2016-11-08
        • 1970-01-01
        • 2013-12-26
        • 2011-02-25
        • 2022-07-21
        • 1970-01-01
        • 2017-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多