执行jar没有主?

时间:2013-03-27 11:29:12

标签: java jar main executable-jar

我是否可以在没有主类的情况下执行jar文件,这样:

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

知道我有一个名为getX的方法,带有arg1 arg2 ...作为参数。 有什么想法吗?

7 个答案:

答案 0 :(得分:3)

您必须拥有主要方法。

主要签名需要:

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

应该至少有一个主要方法的课程

答案 3 :(得分:0)

您不能仅仅通过将其作为参数传递来执行方法。你必须解析你的参数-getX arg1 arg2,如果你自己解释它们以执行你想要的方法,那么它会被传递给参数args中的main方法。

如果带有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需要一个入口点来开始执行,这是主要方法。这样一个罐子只是一个图书馆。

答案 4 :(得分:0)

不确定为什么会这样,但您可以设置单元测试项目,并从中调用您的方法。应该(有点)让你执行方法,而不需要(显式)Main方法。

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

答案 5 :(得分:0)

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

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

java -classpath my_jar.jar com.project.MyClass

答案 6 :(得分:0)

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