Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从命令行运行JAR文件并指定类路径_Java_Shell_Command Line_Classpath - Fatal编程技术网

Java 从命令行运行JAR文件并指定类路径

Java 从命令行运行JAR文件并指定类路径,java,shell,command-line,classpath,Java,Shell,Command Line,Classpath,我编译了一个文件并在清单中指定了主类(我使用了Eclipse导出函数)。我的依赖项都在一个名为lib的目录中。在指定JAR文件应该使用lib/*作为类路径时,我似乎无法直接回答如何执行JAR文件 我试过: ]$ java -jar -cp .:lib/* MyJar.jar ]$ java -cp .:lib/* -jar MyJar.jar ]$ java -cp .:lib/* com.somepackage.subpackage.Main 等等 每个都给出一个错误,表示: 错误:无法找到

我编译了一个文件并在清单中指定了主类(我使用了Eclipse导出函数)。我的依赖项都在一个名为
lib
的目录中。在指定JAR文件应该使用
lib/*
作为类路径时,我似乎无法直接回答如何执行JAR文件

我试过:

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

每个都给出一个错误,表示:

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

或给出
NoClassDefFoundError
,指示找不到库

我甚至尝试重新创建JAR文件,并包含
lib
目录和内容,但仍然没有成功


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

当您指定
-JAR
时,
-cp
参数将被忽略

发件人:

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

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

您有两个选择:

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

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

  • 运行jar文件并指定如下类路径:

    java -cp <jar_name.jar:libs/*> com.test.App
    
    Main-Class: com.test.App
    Class-Path: lib/one.jar lib/two.jar
    
    java-cp com.test.App
    
    jar\u name.jar
    是要执行的jar的全名

    libs/*
    是指向依赖项jar的路径

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


    jar和从属jar应该具有执行权限。

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

    java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main
    
    您可以在windows powershell中执行以下操作:

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

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

    java -cp <jar_name.jar:libs/*> com.test.App
    
    Main-Class: com.test.App
    Class-Path: lib/one.jar lib/two.jar
    
    不幸的是,您需要详细说明清单中的每个jar(这不是一个大问题,因为您只做了一次,您可以使用脚本来构建文件,或者使用诸如ANT、Maven或Gradle之类的构建工具)。引用必须是运行
    java-jar MyJar.jar
    的相对或绝对目录

    然后用

    java -jar MyJar.jar
    

    您可以执行Runtime.getRuntime.exec(命令)来重新启动jar,包括带有参数的类路径。

    的可能副本;而不是:如果您按照如下方式使用windows java-cp MyJar.jar;lib/*com.somepackage.subpackage.main您也不能将所需的jar文件“包含”到另一个jar文件中。当然可以。如果它是内部使用的(即,您希望用户具备一些技术技能等),您可以在尝试运行jar之前询问步骤1,即运行
    解压MyJar.jar lib/*.jar
    。然后,正如您所建议的,他们可以运行
    java-cp MyJar.jar:lib/*…
    ,最糟糕的是,运行一个引用外部服务器特定属性文件的“全包式”uber jar是一个常见的用例。显然不是一个拦截器,但如果您可以使用-jar而不必指定main,那么肯定是一个不太详细的命令。我花了一段时间才弄明白。显式加载log4j文件需要大约6行代码。另一个永远无法修复的Java错误。请注意,manifesst类路径只能用于加载jar文件。例如,它不能用于查找log4j3.xml。很好。我认为类路径需要引用外部jar中的文件。一般来说,我无法做到这一点,在MyJar.jar之外引用配置文件。有时类路径中需要“有时”。例如,在我的Mac中不起作用,但却起作用。你知道为什么吗?