【问题标题】:How to call public static String method from jar from command-line?如何从命令行从 jar 调用公共静态字符串方法?
【发布时间】:2014-07-24 21:28:44
【问题描述】:

我们有一个项目(例如,Foo),它有一些public static 方法,其中一些返回String。现在,我需要从命令行访问该项目的jar 并调用其中一个public static 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

这是意料之中的,因为该类没有 Main 函数。

还尝试在 Foo.jar 周围添加一个包装器。就像,在我的另一个项目中添加了这个 jar (Foo.jar) 作为依赖项,并从 Foo.jar 调用了 public static String 方法。好吧,这可行,但我必须在 Java 应用程序之外返回一个字符串,并且 Main 必须是 void

谁能帮我解决这个问题?

如果我遗漏了任何细节,请在否决之前寻求更多解释。

【问题讨论】:

  • “我必须在 Java 应用程序之外返回一个字符串”是什么意思?如果您有另一个应用程序需要从这个 Java 应用程序中读取,它是否需要可以重定向的 stdin/out?
  • @specializt:很遗憾,我不能使用 Groovy。
  • Main() 不是总是无效的吗?您可以将“字符串”打印到标准输出并阅读。你打算如何掌握那个“字符串”?
  • 完美。通过管道输出包装器执行的输出。

标签: java jar static


【解决方案1】:

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

System.out.println

它的输出,像蛋糕一样简单。 之后,您可以使用

开始您的新 JAR
java -jar FILE.jar

按照你需要的方式输出

【讨论】:

  • 我能够打印输出,但忘记了 shell 可以将 stdout 作为参数。 +1 并被接受。
【解决方案2】:

您只需要创建一个主方法,将命令行参数传递给该方法,然后执行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...

【讨论】:

  • 感谢 Alcanzar 的回复。看起来specializt的答案更直接。为您的回复 +1。
  • 他的肯定更简单,但是如果你有多次你必须写一个包装器,只写一次就更简单了。
【解决方案3】:

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

Java

// -- 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

输入.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多