【问题标题】:How to run a JAR file如何运行 JAR 文件
【发布时间】:2010-11-17 07:29:07
【问题描述】:

我创建了一个这样的 JAR 文件:

jar cf Predit.jar *.*

我通过双击运行这个 JAR 文件(它不起作用)。所以我像这样从 DOS 提示符运行它:

java -jar Predit.jar

它引发了“无法加载主类”异常。所以我提取了这个 JAR 文件:

jar -xf Predit.jar

然后我运行了类文件:

java Predit

效果很好。我不知道为什么 JAR 文件不起作用。请告诉我运行 JAR 文件的步骤

【问题讨论】:

    标签: java jar


    【解决方案1】:

    您需要在 jar 文件清单中指定一个 Main-Class。

    Oracle 的tutorial 包含一个完整的演示,但这里是另一个从头开始的演示。您需要两个文件:

    Test.java:

    public class Test
    {
        public static void main(String[] args)
        {
            System.out.println("Hello world");
        }
    }
    

    清单.mf:

    Manifest-version: 1.0
    Main-Class: Test
    

    请注意,文本文件必须以换行符或回车符结尾。 如果最后一行不以 a 结尾,则将无法正确解析 换行或回车。

    然后运行:

    javac Test.java
    jar cfm test.jar manifest.mf Test.class
    java -jar test.jar
    

    输出:

    Hello world
    

    【讨论】:

    【解决方案2】:
    java -classpath Predit.jar your.package.name.MainClass
    

    【讨论】:

    • 如果这个jar使用其他jar,classpath不应该像“/path/to/jars/*”吗?
    • @Max Chetrusca 是的,但是分隔符是 : 使用 * 将不起作用,因为你的 shell 会像这样扩展它:"/path/to/jars/a.jar" "/path/to/jars/b.jar" 但你真正想要的是:"/path/to/jars/a.jar:/path/to/jars/b.jar"
    【解决方案3】:

    在运行 jar 之前检查 Main-Class: classnameMANIFEST.MF 文件中是否可用。 MANIFEST.MF 存在于 jar 中。

    java -jar filename.jar
    

    【讨论】:

      【解决方案4】:

      你必须在 jar 中添加一个清单,它告诉 java 运行时主类是什么。 创建一个包含以下内容的文件“Manifest.mf”:

      Manifest-Version: 1.0
      Main-Class: your.programs.MainClass
      

      将“your.programs.MainClass”更改为您的实际主类。现在将文件放入 Jar 文件中,位于名为“META-INF”的子文件夹中。为此,您可以使用任何 ZIP 实用程序。

      【讨论】:

      • 出于好奇,“Meta-inf”子文件夹名称是否区分大小写?我传统上看到它拼写为“META-INF”
      • 你是对的。规范说“META-INF”,并没有说明不区分大小写 (java.sun.com/j2se/1.4.2/docs/guide/jar/…)
      【解决方案5】:

      一种创建.class、.jar 文件的非常简单的方法。

      执行 jar 文件。无需过多担心清单文件。让它简单而优雅。

      Java 示例 Hello World 程序

      public class HelloWorld {
          public static void main(String[] args) {
              System.out.println("Hello World");
          }
      }
      

      编译类文件

      javac HelloWorld.java
      

      创建 jar 文件

      jar cvfe HelloWorld.jar HelloWorld HelloWorld.class
      

      jar cvfe HelloWorld.jar HelloWorld *.class
      

      运行 jar 文件

       java -jar HelloWorld.jar
      

      或者

      java -cp HelloWorld.jar HelloWorld
      

      【讨论】:

      【解决方案6】:

      如果您不想创建清单只是为了运行 jar 文件,您可以在运行 jar 文件时直接从命令行引用 main-class。

      java -jar Predit.jar -classpath your.package.name.Test
      

      这设置在 jar 文件中运行哪个主类。

      【讨论】:

      • -classpath 紧跟在java 之后并去掉-jar (即这个答案不正确)
      【解决方案7】:

      Java

      class Hello{
         public static void main(String [] args){
          System.out.println("Hello Shahid");
         }
      }
      

      manifest.mf

      Manifest-version: 1.0
      Main-Class: Hello
      

      在命令行:

      $ jar cfm HelloMss.jar  manifest.mf Hello.class 
      $ java -jar HelloMss.jar
      

      输出:

      Hello Shahid
      

      【讨论】:

        【解决方案8】:

        如果您不想处理这些细节,也可以使用 Eclipse 或 NetBeans 中的导出 jar 助手。

        【讨论】:

        • 我们做到了,我把罐子移到另一台电脑上,它没有打开:)
        【解决方案9】:

        Eclipse 可运行 JAR 文件

        创建一个 Java 项目 - RunnableJAR

        • 如果使用了任何jar files,则将它们添加到项目构建路径中。
        • 在创建 Runnable Jar 文件时选择具有 main() 的类。

        主类

        public class RunnableMainClass {
            public static void main(String[] args) throws InterruptedException {
                System.out.println("Name : "+args[0]);
                System.out.println(" ID  : "+args[1]);
            }
        }
        

        Run Jar 文件使用 java 程序 (cmd) 通过提供参数并获取输出并在 Eclipse 控制台中显示。

        public class RunJar { 
            static StringBuilder sb = new StringBuilder();
            public static void main(String[] args) throws IOException {
                String jarfile = "D:\\JarLocation\\myRunnable.jar";
                String name = "Yash";
                String id = "777";
        
                try { // jarname arguments has to be saperated by spaces
                    Process process = Runtime.getRuntime().exec("cmd.exe start /C java -jar "+jarfile+" "+name+" "+id);
                            //.exec("cmd.exe /C start dir java -jar "+jarfile+" "+name+" "+id+" dir");
                    BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream ()));
                    String line = null;
                    while ((line = br.readLine()) != null){
                        sb.append(line).append("\n");
                    }
                    System.out.println("Console OUTPUT : \n"+sb.toString());
                    process.destroy();
                }catch (Exception e){
                    System.err.println(e.getMessage());
                }
           }
        }
        

        在 Eclipse 中找到Short cuts:

        帮助 ► 帮助内容 ► Java 开发用户指南 ► 参考 ► 菜单和操作

        【讨论】:

          【解决方案10】:

          我有这个文件夹结构:

          D:\JavaProjects\OlivePressApp\com\lynda\olivepress\Main.class D:\JavaProjects\OlivePressApp\com\lynda\olivepress\press\OlivePress.class D:\JavaProjects\OlivePressApp\com\lynda\olivepress\olives\Kalamata.class D:\JavaProjects\OlivePressApp\com\lynda\olivepress\olives\Ligurian.class D:\JavaProjects\OlivePressApp\com\lynda\olivepress\olives\Olive.class

          Main.class 在包中com.lynda.olivepress

          还有另外两个包:

          com.lynda.olivepress.press

          com.lynda.olivepress.olive

          1) 创建一个名为 "Manifest.txt" 的文件,其中包含两行,第一行是 Main-Class,第二行是空行。

          Main-Class: com.lynda.olivepress.Main
          

          D:\JavaProjects\OlivePressApp\Manifest.txt

          2) 创建带有清单和主类入口点的 JAR

          D:\JavaProjects\OlivePressApp>jar cfm OlivePressApp.jar Manifest.txt com/lynda/olivepress/Main.class com/lynda/olivepress/*

          3) 运行 JAR

          java -jar OlivePressApp.jar

          注意:com/lynda/olivepress/* 表示在第 1 点之前包含上面提到的其他两个包

          【讨论】:

            【解决方案11】:

            要运行jar,首先你必须创建

            可执行文件

            然后

            java -jar xyz.jar

            命令将起作用

            【讨论】:

              猜你喜欢
              • 2017-04-23
              • 1970-01-01
              • 1970-01-01
              • 2014-07-30
              • 2017-06-14
              • 2023-04-09
              • 2023-03-08
              • 2018-12-13
              • 2013-07-04
              相关资源
              最近更新 更多