我是否可以在没有主类的情况下执行jar文件,这样:
java -jar my_jar.jar -getX arg1 arg2 ...
知道我有一个名为getX的方法,带有arg1 arg2 ...作为参数。 有什么想法吗?
答案 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
方法的类。