我可以在没有主类的情况下执行jar文件吗?
java -jar my_jar.jar -getX arg1 arg2 ...
知道我有一个叫做getX的方法,带arg1 arg2…作为参数。任何想法?
必须有一个main方法
main的签名需要是:
public static void main(String[] args){
// Insert code here
}
因此,你可以在主方法中调用getX方法。
简短的回答是no…but…
在调用jar时,可以使用以下技术在命令行上传递方法名和参数。本示例将以方法名作为第一个参数。根据需要进行调整并添加错误检查/处理。
package com.charles.example;
import java.lang.reflect.Method;
public class MethodRouter {
public void myMethod(final String[] args) {
System.out.println("Amazing!! " + args[1]);
}
public static void main(String[] args) throws Exception {
if (args.length == 0) {
args = new String[2];
args[0] = "myMethod";
args[1] = "yoyo-yada-bla";
}
final MethodRouter methodRouter = new MethodRouter();
final Class<?>[] types = { String[].class };
final Class<?> _class = methodRouter.getClass();
final String methodName = args[0];
final Method _method = _class.getDeclaredMethod(methodName, types);
if (_method != null) {
_method.invoke(methodRouter, new Object[] { args });
}
}
}
输出:Amazing!! yoyo-yada-bla
应该至少有一个类具有主方法
不确定为什么要这样做,但是您可以设置一个Unit Test项目,并从中调用您的方法。这应该(在某种程度上)允许你执行这些方法,而不需要一个(显式的)Main方法。
您的测试运行程序仍将包含一个(隐式的?)Main方法,它将成为方法执行的入口点。
如果要使用" java -jar
"执行jar,则需要定义一个主类。你需要一个main类来定义main方法,这样jar才能执行。
java -classpath my_jar.jar com.project.MyClass
不能仅仅通过将方法作为参数传递来执行方法。你必须解析你的参数-getX arg1 arg2
,它在参数args
中传递给你的主方法,如果你自己解释它们来执行你想要的方法。
如果main方法的类不在META-INF/MANIFEST.MF
中,就像这样
Manifest-Version: 1.0
Class-Path: .
Main-Class: some.pack.age.MainClass
则可以指定它(完全限定)作为第一个参数。
java -cp my_jar.jar some.pack.age.MainClass -getX arg1 arg2 ...
如果jar中没有main方法的类,那么你就不能执行它。JVM需要一个入口点来开始执行,这是主要的方法。这样的jar就是一个库。
您可以编写一个动态链接到您的jar并从中调用方法的代理jar。代理jar 将必须具有main
方法的类。