从命令提示符处执行具有多个类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议您这样做。