首页 文章

从命令行运行JAR文件并指定classpath

提问于
浏览
88

我编译了一个JAR文件,并在清单中指定了Main-Class(我使用了Eclipse Export函数) . 我的依赖项都在一个标记为 lib 的目录中 . 我似乎无法直接回答如何执行我的JAR文件,同时指定它应该使用 lib/* 作为类路径 .

我试过了:

]$ java -jar -cp .:lib/* MyJar.jar
]$ java -cp .:lib/* -jar MyJar.jar
]$ java -cp .:lib/* com.somepackage.subpackage.Main

等等...

每个都给出一个错误说:

错误:无法找到或加载主类....

或者给出 NoClassDefFoundError 表示未找到库 .

我甚至尝试重新制作JAR文件并包含 lib 目录和内容,但仍然没有骰子......

如何从命令行执行JAR文件并指定要使用的类路径?

4 回答

  • 2

    指定 -jar 时,将忽略 -cp 参数 .

    来自the documentation

    使用此选项时,JAR文件是所有用户类的源,并忽略其他用户类路径设置 .

    您也不能将所需的jar文件“包含”到另一个jar文件中(您需要提取其内容并将.class文件放入您的jar文件中)

    您有两种选择:

    • lib 目录中的所有jar文件包含到清单中(您可以在那里使用相对路径)

    • 使用 -cp 在命令行上指定所有内容(包括jar):
      java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

  • 28

    运行jar文件并指定类路径,如下所示:

    java -cp <jar_name.jar:libs/*> com.test.App
    

    jar_name.jar 是您要执行的JAR的全名

    libs/* 是依赖项JAR的路径

    com.test.App 是具有 main(String[]) 方法的JAR中类的完全限定名称

    jar和依赖jar应该具有执行权限 .

  • 159

    您可以在unix shell中执行以下操作:

    java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main
    

    你可以在windows powershell中做到这些:

    java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main
    
  • 4

    或者,如果您愿意,可以使用清单指定类路径和主类,因此您不需要使用 -cp 或指定主类 . 在你的情况下,它将包含这样的行:

    Main-Class: com.test.App
    Class-Path: lib/one.jar lib/two.jar
    

    不幸的是,你需要拼出清单中的每个jar(不是一个biggie,因为你只做一次,你可以使用脚本来构建文件或使用像ANT或Maven或Gradle这样的构建工具) . 并且引用必须是运行 java -jar MyJar.jar 的相对或绝对目录 .

    然后执行它

    java -jar MyJar.jar
    

相关问题