从命令提示符处执行具有多个类path库的jar文件

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

 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. 

我想如果我指定所有的类path依赖(如java -cp lib\dep1.jar;dep2.jar ),它将摆脱这个问题,但我不想这样做,因为我已经有40个库,它可能在未来的版本中增长。 有没有更好的方法来做到这一点?

让maven生成一个batch file来启动你的应用程序。 这是最简单的方法。

你可以使用appassembler-maven-plugin来达到这个目的。

你不能在命令行中同时使用-jar-cp – 请参阅说明如果使用-jar

JAR文件是所有用户类的源,而其他用户类path设置将被忽略。

你可以做这样的事情:

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

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

在UNIX上使用java 1.7 –

 java -cp myjar.jar:lib/*:. mypackage.MyClass 

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

 java -cp myjar.jar;lib/*;. mypackage.MyClass 

可能的解决scheme可能是

创build一个batch file

在lib目录中为其中的所有文件执行一个循环,并将每个文件放在classpath的lib下

然后运行该jar子

源代码循环在batch file循环信息

你可以使用maven-assembly-plugin,这里是官方网站的例子: https : //maven.apache.org/plugins/maven-assembly-plugin/usage.html

  <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.5.1</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>your main class</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <!-- this is used for inheritance merges --> <phase>package</phase> <!-- bind to the packaging phase --> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> 

有几个选项。

最简单的可能是执行插件 。

您还可以使用程序集插件生成一个包含所有依赖项的jar。

最后,可以使用dependency:classpath目标在其中生成一个带有类path的文件。

我遇到了同样的问题,但能够使用Maven Shade Plugin将所有依赖包打包到我的jar文件中

这不会工作java -cp lib\*.jar -jar myproject.jar 。 你必须把它放在jar子里。

那么在commons-codec-1.3.jar情况下。

java -cp lib/commons-codec-1.3.jar;lib/next_jar.jar等等。

另一种解决scheme可能是把你所有的jar放到你的JRE的ext目录下。 如果您正在使用独立的JRE,则可以。 如果您使用相同的JRE来运行多个应用程序,我build议您这样做。