繁体   English   中英

如何运行 JAR 文件

[英]How to run a JAR file

我创建了一个 JAR 文件,如下所示:

jar cf Predit.jar *.*

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

java -jar Predit.jar

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

jar -xf Predit.jar

我运行了 class 文件:

java Predit

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

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

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

Test.java:

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

MANIFEST.MF:

Manifest-version: 1.0
Main-Class: Test

请注意,文本文件必须以新行或回车结束。 如果不以新行或回车结束,则不会正确解析最后一行。

然后运行:

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

输出:

Hello world
java -classpath Predit.jar your.package.name.MainClass

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

java -jar filename.jar

您必须向jar添加一个清单,它告诉Java运行时主类是什么。 使用以下内容创建文件'Manifest.mf':

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

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

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

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

Java示例Hello World Program

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

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

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

这将设置要在jar文件中运行的主类。

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

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

Eclipse Runnable JAR文件

创建一个Java项目 - RunnableJAR

  • 如果使用任何jar文件 ,则将它们添加到项目构建路径。
  • 在创建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]);
    }
}

使用java程序( cmd运行Jar文件,提供参数并获取输出并在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 cut

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

我有这个文件夹结构:

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.classcom.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)使用Manifest和Main-Class入口点创建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点之前)

  • 按照这个答案,如果你有一个jar文件,你需要运行它
  • 有关解决最常见错误的提示,请参阅故障排除部分

介绍

有几种方法可以运行 java 应用程序:

  1. java -jar myjar.jar - 是运行应用程序的默认选项
  2. java -cp my-class-path my-main-classjava -classpath my-class-path my-main-class
  3. java --module-path my-module-path --module my-module/my-main-class
  4. 部署到企业服务器。 当你有warear文件时。 我们将省略对这种情况的解释

在这个答案中,我将解释如何运行jar如果您必须手动运行它,并给出解决常见问题的提示。

java -jar

从最常用的选项开始:使用-jar运行jar文件。 例子:

java -jar myjar.jar

如果失败:

  • no main manifest attribute ,则jar不可执行:
  • 如果出现其他错误,请参阅下面的“故障排除”部分

类路径或模块路径

如果-jar失败,则应使用类路径或模块路径运行 jar。

当应用程序本身是模块化的时,使用模块路径。 JPMS - Java 平台模块系统 - 是一种开发、分发和运行应用程序的现代方式。 详情:

  1. 观看Alex Buckley 使用 JDK 9 进行的出色模块化开发
  2. awesome-java-module-system

要运行 jar:

  1. 确定它是否是模块化的:
    1. 调用:
       jar --describe-module --file=path-to-jar-file
  2. 检查 output:
    1. 如果您看到No module descriptor found. 第一行,然后继续下面的类路径解决方案
    2. 如果您看到类似以下内容:
     org.diligentsnail.consoleconsumer@1.0-SNAPSHOT jar:file:///home/caco3/IdeaProjects/maven-multi-module-project-demo/jars/console-consumer.jar./module-info.class requires java.base mandated requires org.diligensnail.hellolibrary
    继续下面的module-path解决方案

另请参阅: jar 文件中的模块列表

类路径

尝试以下操作:

java -cp my-jar.jar my-main-class
  • -cp-classpath相同
  • my-jar.jar是 jar 运行
  • my-main-class是带有static void main(String[])方法的 class 的名称

例子:

java -cp jars/console-consumer.jar org.diligentsnail.consoleconsumer.Main

模块路径

尝试以下命令:

java --module-path my-jar.jar --module my-module-name/my-main-class
  • my-jar.jarjar运行
  • my-module-namemy-main-class所属模块的名称
    • 通常my-module-namemodule-info.java文件中
  • my-main-class - 带有static void main(String[])方法的 class

如果它因FindException失败:

  • 消息示例:
     Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx.fxml not found, required by org.diligentsnail.javafxconsumer
  • 通常,这意味着my-jar.jar依赖于另一个jar 例如,应用程序使用第三方库。 请参阅下面的“提供依赖项”

故障排除

UnsupportedClassVersionError

更新 java。 查看Java class 文件格式主要版本号列表?

NoClassDefFoundError , NoSuchMethodError , NoSuchFieldError

看:

  1. “提供依赖项”部分
  2. 为什么我在 Java 中收到 NoClassDefFoundError?

提供依赖项

当应用程序在缺少或过期依赖项的情况下运行时,将引发ErrorException 常见异常和错误:

  1. NoClassDefFoundError , NoSuchFieldError , NoSuchMethodError
  2. ClassNotFoundException , NoSuchFieldException , NoSuchMethodException
  3. FindException

提供依赖项:

  1. 确定依赖列表
    1. 通常它是jar的列表,或者可以是目录列表或两者兼而有之
  2. 加入列表:如果您正在运行 Unix ; - 如果你在 Windows
  3. 使用-classpath--module-path调用 java

例子

  • 项目maven-multimodule-project-demo
  • 我正在尝试运行console-consumer.jar
    • 命令:
       java -classpath jars/console-consumer.jar org.diligentsnail.consoleconsumer.Main
    • jars/console-consumer.jar是我正在尝试运行的jar
    • org.diligentsnail.consoleconsumer.Main是带有 main 方法的 class
  • 我得到的错误:
     Exception in thread "main" java.lang.NoClassDefFoundError: org/diligentsnail/hellolibrary/Hello at org.diligentsnail.consoleconsumer.Main.main(Main.java:11) Caused by: java.lang.ClassNotFoundException: org.diligentsnail.hellolibrary.Hello at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)... 1 more
  • 缺少的依赖是jars/hello-library.jar
  • 正确的命令:
     java -classpath jars/console-consumer.jar:jars/hello-library.jar org.diligentsnail.consoleconsumer.Main

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

可执行jar

然后

java -jar xyz.jar

命令会起作用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM