如何从命令行jar调用public static String方法?

时间:2014-07-24 21:28:44

标签: java jar static

我们有一个项目(比如 Foo ),它有一些public static方法,其中一些返回String。现在,我需要从命令行访问该项目的jar并调用其中一个public static String方法来获取该String。


编辑1:

我需要将返回的字符串作为参数传递给shell脚本。像这样:

./my_bash_script.sh <value returned from jar> <more arguments> 

我们怎么做?

试图从命令行调用jar,但这没有帮助。

java -cp Foo.jar full.package.name.ClassName

Error: Could not find or load main class jar

这是预期的,因为该课程没有主要功能。

还尝试在 Foo.jar 周围添加一个包装器。比如,在我的其他项目中将此jar(Foo.jar)添加为依赖项,并从public static String调用Foo.jar方法。嗯,这可行,但我必须在Java应用程序外返回一个String,而Main必须是void

有人可以帮我解决这个问题吗?

如果我在向下投票之前遗漏了任何细节,请询问更多解释。

3 个答案:

答案 0 :(得分:1)

您只需要创建一个main方法,将命令行参数传递给方法,然后执行System.out.println(result)

更通用的解决方案需要一个使用反射来调用正确方法并打印出结果的包装器。

你可以通过以下方式做到这一点:

public class InvokeMethod {
    public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
        String clazz = args[0];
        String method = args[1];
        String[] methodArgs = new String[args.length - 2];
        Class<?>[] methodParam = new Class[args.length - 2];
        for (int i = 2; i<args.length; i++) {
            methodArgs[i-2] = args[i];
            methodParam[i-2] = String.class;
        }

        Class<?> c = Class.forName(clazz);
        Method m = c.getMethod(method, methodParam);
        String result = (String) m.invoke(methodParam);
        System.out.println(result);
    }
}

编译并将其打包到invoke.jar然后你就可以java -cp invoke.jar:your_real_jar.jar InvokeMethod some.class.Here method_name arg1 arg2 arg3...

答案 1 :(得分:1)

最简单的解决方案是:创建&amp;编译一个新的Java控制台应用程序作为JAR,包括您的其他JAR和

System.out.println

它的输出,很容易像蛋糕。 之后,您可以使用

开始新的JAR
java -jar FILE.jar

并按照您需要的方式输出

答案 2 :(得分:1)

您可以将包装器的输出传递给shell脚本。

爪哇

// -- Test.java ----
public class Test
{
    public static void main(String args[])
    {
        // Call the method from Foo.jar here
        System.out.println("Hello" + " World");
    }
}

壳牌

# ----- test.sh ------
#!/bin/sh
grep "$1" input.txt

input.txt中

# Sample Input
Line 1 : Hello World
Line 2 : Here is Hello World Again
Line 3 : This is not Hello + World
Line 4 : AB Hello World CD

命令

javac Test.java
./test.sh "`java Test`" # Note the `

样本o / p

Line 1 : Hello World
Line 2 : Here is Hello World Again
Line 4 : AB Hello World CD