5

我可以通过这种方式在没有主类的情况下执行 jar 文件:

java -jar my_jar.jar -getX arg1 arg2 ...

知道我有一个名为 getX 的方法,它以 arg1 arg2 ... 作为参数。任何想法?

4

7 回答 7

3

简短的回答是否定的……但是……

这是一种在调用 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
于 2013-03-27T11:54:11.940 回答
3

你必须有一个主要的方法。

main 的签名必须是:

public static void main(String[] args){
    // Insert code here
}

因此,您可以在 main 方法中调用您的方法 getX。

于 2013-03-27T11:32:00.397 回答
0

如果你要使用 " java -jar" 来执行一个 jar,你需要定义一个主类。您将需要一个主类,该类定义 jar 的主要方法,以便以这种方式执行。

但是,您可以使用以下语法在 jar 中执行一个类(前提是它们有一个 main 方法):

java -classpath my_jar.jar com.project.MyClass
于 2013-03-27T11:38:59.283 回答
0

您可以编写一个代理 jar 动态链接到您的 jar 并从中调用方法。代理 jar必须有一个带有main方法的类。

于 2013-03-27T11:47:17.877 回答
0

应该至少有一个类有一个 main 方法

于 2013-03-27T11:32:10.047 回答
0

您不能仅通过将方法作为参数传递来执行它。如果您自己解释它们以执行您想要的方法,您必须解析您-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 需要一个入口点来开始执行,这是主要方法。这样的罐子只是一个图书馆。

于 2013-03-27T11:34:13.633 回答
0

不知道你为什么想要这个,但你可以设置一个单元测试项目,并从中调用你的方法。那应该(有点)让您执行这些方法,而无需(显式) Main 方法。

您的测试运行程序仍将包含一个(隐式?) Main 方法,然后它将成为执行您的方法的入口点。

于 2013-03-27T11:35:27.990 回答