【问题标题】:Multiple runnable classes inside JAR, how to run them?JAR中有多个可运行类,如何运行它们?
【发布时间】:2011-04-27 22:50:29
【问题描述】:

我在从一个 JAR 文件运行多个不同的类时遇到问题。我知道我可以将 JAR 中的一个类设置为将在命令java -jar myjar.jar 之后运行的 Main 类,但我想要的是:

java -jar myjar.jar MyClass

是否可以这样做,或者我必须创建多个 JAR(每个 JAR 用于一个可运行的类),还是创建“管理器”类来运行我的其他类传递给他们的命令行参数更好?
我正在寻找文档或参考资料,但找不到。

【问题讨论】:

    标签: java jar


    【解决方案1】:

    使用“Launcher”主类会更好吗,它的功能只是将调用分派给实际的控制器类,并使用链接文件作为最终包装器,而不是摆弄 -cp wm的选项?

    在 Windows 中,这样做非常容易。

    “主类”不需要太复杂,比如

    /**
     * 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);
                }
            }
        }
    }
    

    在 Windows 方面,创建这样的链接就足够了

    javaw.exe -jar "jarfile" "a"
    

    在“sendTo”文件夹中放置链接非常有用...一个隐藏的 jar,由许多激活其方面之一的链接调用,使得部署 jar 逻辑的更新更简单。

    实际选择的文件在链接定义中的参数之后作为字符串列表传递。

    这样,您不必担心整个类路径问题。

    【讨论】:

      【解决方案2】:

      由于提供了正确答案,因此您可以使用一种解决方案为具有不同清单的每个主类构建一个存根 jar。这将允许您通过双击每个单独的程序来创建可运行的 jar 文件。

      有几种方法可以实现这一点,但基本是放置一个类似于以下的类,它调用预期的 main 方法并传递 args。

      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 将为目标 main 方法构建一个 jar,该方法是自包含的,并且不需要在类路径上有其他程序集。它通过将每个依赖 jar 的内容复制到生成的 jar 中来做到这一点。

      【讨论】:

        【解决方案3】:

        Jar 文件在 manifest 中只能包含一个 Main-Class 属性,这意味着java -jar myjar.jar 只能启动一个类。

        你可以启动其他可运行的类

        java -cp myjar.jar OtherClass
        

        但这不支持用户双击 jar 文件。

        根据您的用户的熟练程度,命令行可能适合他们。如果没有,您可以为每个可运行的类创建一个脚本,或者为一个带有参数的脚本来选择正确的类。

        【讨论】:

          【解决方案4】:

          可执行 Jar 文件格式只允许您指定一个主类。为了让您能够执行不同的应用程序,您需要按照您的建议创建一个“管理器”,或者改用类路径:

          java -cp myjar.jar MyClass
          

          但是,这种方法会忽略您在 Jar 清单文件中配置的类路径。

          【讨论】:

          • 忽略清单中的类路径是我的担忧之一。但是我已经测试过这个解决方案,它似乎可以工作(但我不知道为什么真的,因为我在清单中设置了类路径)
          • 这是因为这种启动形式不会打扰阅读清单。只有 -jar 形式会读取清单。
          【解决方案5】:

          你这样做:

          java -cp myjar.jar MyClass
          

          即将 JAR 放入类路径中,然后可以通过指定其完全限定名称来运行具有 main 方法的任何类。 -jar 选项仅作为使用 JAR 清单中信息的快捷方式存在(它还可以在类路径中包含其他 JAR 以及指定主类)。

          【讨论】:

            【解决方案6】:

            你必须使用:

            java -cp myjar.jar MyClass
            

            java -cp myjar.jar OtherMainClass
            

            【讨论】:

            • 如何传递多个参数。我的意思是当我传递一个参数时,它的工作 java -cp myjar.jar OtherMainClass foojava -cp myjar.jar OtherMainClass foo bar 不起作用。只取第一个论据 foo.
            猜你喜欢
            • 2021-11-28
            • 1970-01-01
            • 1970-01-01
            • 2020-05-05
            • 2011-01-02
            • 1970-01-01
            • 2020-10-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多