从命令提示符处执行带有多个类路径库的jar文件

Pra*_*eth 54 java jar classpath maven

我有一个Maven项目,它生成一个jar文件并将所有依赖项复制到target/lib文件夹.我想在客户端的机器(windows)上执行这个项目.所以,我复制myproject.jarC:\xyz文件夹和所有依赖项到C:\xyz\lib文件夹.如何从客户端的命令提示符执行此项目?我试图java -cp lib\*.jar -jar myproject.jarC:\xyz文件夹使用,但它抛出以下错误.

Exception in thread "main" java.lang.NoClassDefFoundError: lib\commons-codec-1/3/jar
Caused by: java.lang.ClassNotFoundException: lib\commons-codec-1.3.jar
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: lib\commons-codec-1.3.jar.  Program will exit.
Run Code Online (Sandbox Code Playgroud)

我想如果我在classpath(如java -cp lib\dep1.jar;dep2.jar)中指定所有依赖项,它将解决问题,但我不想这样做,因为我已经有40个库,并且它可能会在将来的版本中增长.有一个更好的方法吗?

Sua*_*ehi 63

你不能同时使用-jar,并-cp在命令行上-看Java文档是说,如果你使用-jar:

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

你可以这样做:

java -cp lib\*.jar;. myproject.MainClass

注意;.-cp参数中,解决Java命令行错误.另请注意,这是该命令的Windows版本.Unix上的路径分隔符是:.

  • 根据我在文档中读到的内容,* 代表一个或多个 jar 文件。所以你需要说 -cp lib\*; 您不应该在正常意义上使用它(一个或多个字符) (2认同)
  • 令人遗憾的是 `-cp` 和 `-jar` 不能同时使用。我有一个 CLI 程序,要求用户提供 JDBC 库才能正确使用它,将其打包为可执行 JAR 文件在这里提出了一个挑战。 (2认同)

jam*_*amp 52

在UNIX上使用java 1.7 -

java -cp myjar.jar:lib/*:. mypackage.MyClass
Run Code Online (Sandbox Code Playgroud)

在Windows上,您需要使用';' 代替 ':' -

java -cp myjar.jar;lib/*;. mypackage.MyClass
Run Code Online (Sandbox Code Playgroud)


khm*_*ise 15

让maven生成批处理文件以启动您的应用程序.这是最简单的方法.

您可以将appassembler-maven-plugin用于此类目的.


小智 5

无论使用哪种操作系统,以下命令均应起作用:

java -cp "MyJar.jar;lib/*" com.mainClass
Run Code Online (Sandbox Code Playgroud)

始终使用引号,并请注意lib / *。jar将不起作用。