2013-03-27 106 views
2

我可以执行一个jar文件,而无需一个主类,以这样的方式执行jar没有主?

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

知道我有一个名为的getX与方法需要ARG1 ARG2 ......作为参数。 有什么想法?

+4

“每一个Java程序启动一个主要方法”,不是吗? – Abubakkar 2013-03-27 11:30:45

+0

确实,但我想只是调用一些方法 – TheForbidden 2013-03-27 11:31:26

+0

在主要方法里调用它们 – Abubakkar 2013-03-27 11:32:04

回答

3

您必须有一个主要方法。

为主要需求的签名是:

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

因此,你可以打电话给你的方法的getX的主要方法里面。

+8

我想OP知道签名 – Abubakkar 2013-03-27 11:32:57

0

应该有ATLEAST一个类主要方法

0

您不能执行的方法只是将它作为一个参数。你必须解析你的论点-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需要一个入口点来开始执行,这是主要的方法。这种罐子只是一个图书馆。

0

不知道为什么你会想,但你可以建立一个单元测试项目,并从中调用你的方法。这应该(有点)让你执行方法,没有(明确的)Main方法。

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

0

如果您打算使用“java -jar”执行jar,则需要定义一个主类。你需要一个主类来定义jar的主要方法,使其可以这样执行。

但是,您可以罐(只要它们有一个主要方法)中执行一类,使用的语法如下:

java -classpath my_jar.jar com.project.MyClass 
0

您可以编写动态链接到您的罐子并调用方法的代理罐子从中。尽管如此,代理罐必须具有与main方法类。

3

简短的答案是否定的...但是...

这里是你可以使用调用罐子时,必须通过方法的名称和参数在命令行上的技术。本指导性示例将采用方法名称作为第一个参数。根据需要调整并根据需要添加错误检查/处理。

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 
+1

它会工作吗?如果你在类型参数中使用args.getClass()? – rcorbellini 2013-03-27 12:04:11

+0

@rcorbellini如果您要求更改“types = {String []。class};”到“types = {args.getClass()};”也工作。答案是肯定的。在这种情况下,我认为参数总是为String []。但我更喜欢你的方式。好的调整。谢谢。 – Java42 2013-03-27 12:09:32

+1

更改“_class.getDeclaredMethod(methodName,types);”到“_class.getDeclaredMethod(methodName,args.getClass());” – rcorbellini 2013-03-27 17:21:47