我可以通过这种方式在没有主类的情况下执行 jar 文件:
java -jar my_jar.jar -getX arg1 arg2 ...
知道我有一个名为 getX 的方法,它以 arg1 arg2 ... 作为参数。任何想法?
我可以通过这种方式在没有主类的情况下执行 jar 文件:
java -jar my_jar.jar -getX arg1 arg2 ...
知道我有一个名为 getX 的方法,它以 arg1 arg2 ... 作为参数。任何想法?
简短的回答是否定的……但是……
这是一种在调用 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
你必须有一个主要的方法。
main 的签名必须是:
public static void main(String[] args){
// Insert code here
}
因此,您可以在 main 方法中调用您的方法 getX。
如果你要使用 " java -jar
" 来执行一个 jar,你需要定义一个主类。您将需要一个主类,该类定义 jar 的主要方法,以便以这种方式执行。
但是,您可以使用以下语法在 jar 中执行一个类(前提是它们有一个 main 方法):
java -classpath my_jar.jar com.project.MyClass
您可以编写一个代理 jar 动态链接到您的 jar 并从中调用方法。代理 jar必须有一个带有main
方法的类。
应该至少有一个类有一个 main 方法
您不能仅通过将方法作为参数传递来执行它。如果您自己解释它们以执行您想要的方法,您必须解析您-getX arg1 arg2
的参数,然后将其传递给参数中的 main 方法。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 需要一个入口点来开始执行,这是主要方法。这样的罐子只是一个图书馆。
不知道你为什么想要这个,但你可以设置一个单元测试项目,并从中调用你的方法。那应该(有点)让您执行这些方法,而无需(显式) Main 方法。
您的测试运行程序仍将包含一个(隐式?) Main 方法,然后它将成为执行您的方法的入口点。