问题

我有一个有4个类的JAR,每个类都有Main方法。我希望能够根据需要运行其中的每一个。我试图在Linux机器上从命令行运行它。

E.g. The name of my JAR is MyJar.jar

它具有主类的目录结构,如下所示:

com/mycomp/myproj/dir1/MainClass1.class
com/mycomp/myproj/dir2/MainClass2.class
com/mycomp/myproj/dir3/MainClass3.class
com/mycomp/myproj/dir4/MainClass4.class

我知道我可以在我的Manifest文件中指定一个类作为main。但有没有什么方法可以在命令行上指定一些参数来运行我希望运行的任何类?

我试过这个:

jar cfe MyJar.jar com.mycomp.myproj.dir2.MainClass2 com/mycomp/myproj/dir2/MainClass2.class /home/myhome/datasource.properties /home/myhome/input.txt

我收到了这个错误:

com/mycomp/myproj/dir2/MainClass2.class : no such file or directory

(在上面的命令中,'/ home / myhome / datasource.properties'和'/home/myhome/input.txt'是命令行参数)。


#1 热门回答(127 赞)

你可以在Manifest文件中创建没有Main-Class的jar。然后 :

java -cp MyJar.jar com.mycomp.myproj.dir2.MainClass2 /home/myhome/datasource.properties /home/myhome/input.txt

#2 热门回答(83 赞)

你可以执行从JAR文件具有apublic final static main方法的anyclass,即使jar文件具有aMain-Classdefined。

执行Main-Class:

java -jar MyJar.jar  // will execute the Main-Class

使用apublic static void main方法执行另一个类:

java -cp MyJar.jar com.mycomp.myproj.AnotherClassWithMainMethod

注意:第一次使用-jar,第二次使用-cp


#3 热门回答(9 赞)

除了调用java -jar myjar.jar com.mycompany.Myclass之外,你还可以在Manifest中创建一个Dispatcher类的主类。
示例:

public class Dispatcher{

    private static final Map<String, Class<?>> ENTRY_POINTS =
        new HashMap<String, Class<?>>();
    static{
        ENTRY_POINTS.put("foo", Foo.class);
        ENTRY_POINTS.put("bar", Bar.class);
        ENTRY_POINTS.put("baz", Baz.class);
    }

    public static void main(final String[] args) throws Exception{

        if(args.length < 1){
            // throw exception, not enough args
        }
        final Class<?> entryPoint = ENTRY_POINTS.get(args[0]);
        if(entryPoint==null){
            // throw exception, entry point doesn't exist
        }
        final String[] argsCopy =
            args.length > 1
                ? Arrays.copyOfRange(args, 1, args.length)
                : new String[0];
        entryPoint.getMethod("main", String[].class).invoke(null,
            (Object) argsCopy);

    }
}

原文链接