我可以执行一个jar文件,而无需一个主类,以这样的方式执行jar没有主?
java -jar my_jar.jar -getX arg1 arg2 ...
知道我有一个名为的getX与方法需要ARG1 ARG2 ......作为参数。 有什么想法?
我可以执行一个jar文件,而无需一个主类,以这样的方式执行jar没有主?
java -jar my_jar.jar -getX arg1 arg2 ...
知道我有一个名为的getX与方法需要ARG1 ARG2 ......作为参数。 有什么想法?
您必须有一个主要方法。
为主要需求的签名是:
public static void main(String[] args){
// Insert code here
}
因此,你可以打电话给你的方法的getX的主要方法里面。
我想OP知道签名 – Abubakkar 2013-03-27 11:32:57
应该有ATLEAST一个类主要方法
您不能执行的方法只是将它作为一个参数。你必须解析你的论点-getX arg1 arg2
女巫被传递给参数args
中的主方法,如果自己解释它们来执行你想要的方法。
如果与主方法的类不在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方法,然后它将成为执行你的方法的入口点。
如果您打算使用“java -jar
”执行jar,则需要定义一个主类。你需要一个主类来定义jar的主要方法,使其可以这样执行。
但是,您可以罐(只要它们有一个主要方法)中执行一类,使用的语法如下:
java -classpath my_jar.jar com.project.MyClass
您可以编写动态链接到您的罐子并调用方法的代理罐子从中。尽管如此,代理罐将必须具有与main
方法类。
简短的答案是否定的...但是...
这里是你可以使用调用罐子时,必须通过方法的名称和参数在命令行上的技术。本指导性示例将采用方法名称作为第一个参数。根据需要调整并根据需要添加错误检查/处理。
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
它会工作吗?如果你在类型参数中使用args.getClass()? – rcorbellini 2013-03-27 12:04:11
@rcorbellini如果您要求更改“types = {String []。class};”到“types = {args.getClass()};”也工作。答案是肯定的。在这种情况下,我认为参数总是为String []。但我更喜欢你的方式。好的调整。谢谢。 – Java42 2013-03-27 12:09:32
更改“_class.getDeclaredMethod(methodName,types);”到“_class.getDeclaredMethod(methodName,args.getClass());” – rcorbellini 2013-03-27 17:21:47
“每一个Java程序启动一个主要方法”,不是吗? – Abubakkar 2013-03-27 11:30:45
确实,但我想只是调用一些方法 – TheForbidden 2013-03-27 11:31:26
在主要方法里调用它们 – Abubakkar 2013-03-27 11:32:04