Java 从命令行运行JAR文件并指定类路径
我编译了一个文件并在清单中指定了主类(我使用了Eclipse导出函数)。我的依赖项都在一个名为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 等等 每个都给出一个错误,表示: 错误:无法找到
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中不起作用,但却起作用。你知道为什么吗?