JAR中的多个可运行类,如何运行它们?
我遇到了从一个JAR文件运行多个不同类的问题。 我知道我可以在JAR中设置其中一个类为Main类,该类将在命令java -jar myjar.jar
后运行,但是我想要的是这样的:
java -jar myjar.jar MyClass
是否有可能这样做,或者我必须创build多个JAR(每个为一个runnable类),还是创build'pipe理'类,将运行我的其他类传递给他们的命令行参数更好?
我正在寻找文件或参考,但我找不到任何。
可执行的Jar文件格式只允许你指定一个主类。 为了能够执行不同的应用程序,您需要按照您的build议创build一个“pipe理器”,或者使用类path:
java -cp myjar.jar MyClass
但是,这种方法会忽略在Jar的清单文件中configuration的类path。
你将不得不使用:
java -cp myjar.jar MyClass
和
java -cp myjar.jar OtherMainClass
你这样做:
java -cp myjar.jar MyClass
即将JAR放入类path,然后可以通过指定完全限定名称来运行具有main方法的任何类。 -jar
选项仅作为使用JAR清单中信息的快捷方式存在(也可以在类path中包括其他JAR以及指定主类)。
这个文件将帮助你。
你会不会更好地使用“启动器”主类,其function只是调用实际控制器类的调用,并使用链接文件作为最后的包装,而不是摆弄-cp选项的WM?
在Windows中,这样做是非常容易的。
“主要class级”不需要太复杂,就像
/** * Sample launcher */ public class Launcher { /** * @param args */ public static void main(String[] args) throws Exception { if (args != null && args.length > 0) { String option= args[0]; String[] args2=new String[0]; if( args.length>1){ args2= new String[args.length-1]; System.arraycopy(args, 1, args2, 0, args2.length); } if(option.equals("a")); new ClassA().exec(args2); else if(option.equals("b")); new ClassB().exec(args2); } } }
在事物的窗口方面,就像创build这种链接就足够了
javaw.exe -jar "jarfile" "a"
将链接放置在“sendTo”文件夹中是非常有用的…一个隐藏的,被许多激活它的一个方面的链接所调用的jar使部署jar逻辑的更新变得更简单。
所选的实际文件以链接定义中的参数之后的string列表forms传递。
这样,你不应该担心整个类path问题。
由于已经提供了正确的答案,所以可以使用一种解决scheme为每个具有不同清单的主类构build一个存根jar。 这将允许您通过允许双击每个单独的程序来创build可运行jar文件。
有几种方法来完成这一点,但基本的东西是放一个类似于下面的调用主要方法传递参数。
package com.acme.myapp; public final class Stub1 { public static void main(String[] args) { App1.main(args); } }
至于包装,使用maven的一种方法是使用maven -assembly-plugin : jar -with -dependencies mojo。 这样做的好处是,mojo将为自包含的目标主方法构build一个jar,并且不需要在classpath上有其他程序集。 它通过将每个依赖jar的内容复制到生成的jar中来实现。
Jar文件只能在清单中包含一个Main-Class属性,这意味着java -jar myjar.jar
只能启动一个类。
您可以使用其他可运行类来启动
java -cp myjar.jar OtherClass
但是不支持双击jar文件的用户。
根据用户的熟练程度,可能命令行对他们来说是OK的。 如果没有,您可以为每个可运行类或一个脚本创build一个脚本,该脚本使用参数来select正确的类。