如何从另一个jar内的shell脚本中调用jar内的java类

时间:2011-04-07 01:49:23

标签: java class shell jar

我有一个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

但我不行,有什么建议我怎么能实现这个? 有没有更好的方法来做这样的事情?

2 个答案:

答案 0 :(得分:2)

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

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

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

  • 如果问题出在相对路径上,则需要注意路径解析时“当前目录”的位置。作为实验,尝试使用JAR文件的绝对路径替换相对路径。

  • -jar选项的设计并非如此。假设JAR文件确实存在于您使用的相对位置,您可能需要这样做:

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

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

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

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


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

答案 1 :(得分:1)

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

您可能更容易定义正确的类路径变量并使用

执行命令
/usr/bin/java -cp $CLASSPATH bar.foo.my.class