我们有一个项目(比如 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
。
有人可以帮我解决这个问题吗?
如果我在向下投票之前遗漏了任何细节,请询问更多解释。
答案 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
它的输出,很容易像蛋糕。 之后,您可以使用
开始新的JARjava -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