【问题标题】:how can i call a java class that is inside a jar from within a shell script that is inside another jar我如何从另一个 jar 中的 shell 脚本中调用 jar 中的 java 类
【发布时间】:2011-04-07 01:49:22
【问题描述】:

我有一个 Web 应用程序,并且在一个 jar 中我有一个 shell 脚本。从该 shell 脚本中,我想执行另一个 jar 文件中的 java 类。 我实际上可以在提示符下执行这样的类

/usr/bin/java -jar bar.foo.a.jar bar.foo.my.class

但问题是当任务从 jar 中执行脚本时。然后 bar.foo.a.jar 没有找到,因为它不在同一级别

我试过了

/usr/bin/java -jar ../../bar.foo.a.jar bar.foo.my.class

但我不工作,关于我如何实现这一目标的任何建议? 有没有更好的方法来做这样的事情?

【问题讨论】:

  • jar 只是一个 zip 文件。解压或解压 shell 脚本,然后运行 ​​java 命令。
  • 不确定为什么您的相对路径解决方案不起作用(您还没有说明执行此操作时会发生什么)。尝试在脚本中添加 cd (chdir)。

标签: java class shell jar


【解决方案1】:

从您的问题中不清楚您实际尝试了什么,但这里有几个指针。

  • 您不能执行 JAR 文件中的 shell 脚本。您必须先将其解压到文件系统中的独立文件中,然后才能执行。

  • 您不能使用嵌套在另一个 JAR 文件中的 JAR 文件。 (或者至少,您不能不创建自定义 ClassLoader。)嵌套的 JAR 文件需要提取为独立文件。

  • 如果您的问题与相对路径有关,则需要仔细注意解析路径时的“当前目录”是什么。作为实验,尝试将相对路径替换为 JAR 文件的绝对路径。

  • -jar 选项并非旨在以这种方式工作。假设 JAR 文件确实存在于您使用的相对位置,您可能需要这样做:

    /usr/bin/java -cp ../../bar.foo.a.jar bar.foo.MyClass
    

    -jar 选项告诉 JVM 将 JAR 文件作为命令执行,使用 JAR 文件清单中声明的​​ Main-Class 作为入口点。如果你这样做:

    /usr/bin/java -jar ../../bar.foo.a.jar bar.foo.MyClass
    

    你会发现bar.foo.MyClass作为它的第一个命令行参数传递给声明的主程序。


我的建议是花几分钟时间仔细阅读 java 命令、jar 命令的手册页,以及描述类路径如何工作的链接页面等。

【讨论】:

    【解决方案2】:

    -jar 选项是在 jar 文件中执行类的便捷方式,也就是具有可执行 jar 的。但是使用 -jar 文件会忽略用户类路径。

    定义正确的类路径变量并执行命令可能更容易

    /usr/bin/java -cp $CLASSPATH bar.foo.my.class
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      相关资源
      最近更新 更多