我有一个Maven项目,它生成一个jar文件并将所有依赖项复制到target/lib
文件夹。我想在客户端的机器(windows)上执行这个项目。因此,我将myproject.jar
复制到C:\xyz
文件夹,并将所有依赖项复制到C:\xyz\lib
文件夹。如何从客户端的命令提示符执行此项目?
我尝试使用java -cp lib\*.jar -jar myproject.jar
文件夹中的C:\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.
我认为如果我在类路径中指定所有依赖项(如java -cp lib\dep1.jar;dep2.jar
),它将解决问题,但我不想这样做,因为我已经有40个库,它可能会在将来的版本中增长。有更好的方法吗?
答案 0 :(得分:62)
您不能在命令行上同时使用-jar
和-cp
- 如果您使用-jar
,请参阅the java documentation:
JAR文件是所有用户类的源,其他用户类路径设置将被忽略。
你可以这样做:
java -cp lib\*.jar;. myproject.MainClass
注意;.
参数中的-cp
,以解决Java命令行错误。另请注意,这是该命令的Windows版本。 Unix上的路径分隔符是:
。
答案 1 :(得分:50)
在UNIX上使用java 1.7 -
java -cp myjar.jar:lib/*:. mypackage.MyClass
在Windows上,您需要使用';'而不是':' -
java -cp myjar.jar;lib/*;. mypackage.MyClass
答案 2 :(得分:14)
让maven生成批处理文件以启动您的应用程序。这是最简单的方法。
您可以将appassembler-maven-plugin用于此目的。
答案 3 :(得分:2)
可能的解决方案可能是
创建批处理文件
在lib目录中为其中的所有文件执行循环,并在classpath
上将每个文件设置为lib然后运行jar
源for loop in batch file获取有关循环的信息
答案 4 :(得分:2)
您可以使用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>
答案 5 :(得分:2)
无论使用哪种操作系统,以下命令均应起作用:
java -cp "MyJar.jar;lib/*" com.mainClass
始终使用引号,请注意 lib / *。jar 将不起作用。
答案 6 :(得分:1)
有几种选择。
最简单的可能就是exec plugin。
您还可以使用assembly plugin生成包含所有依赖项的jar。
最后,您可以使用dependency:classpath
目标生成包含类路径的文件。
答案 7 :(得分:1)
我遇到了同样的问题但是能够使用Maven Shade Plugin
将所有依赖项打包到我的jar文件中答案 8 :(得分:-2)
这不起作用java -cp lib\*.jar -jar myproject.jar
。你必须把它放在罐子里。
如果是commons-codec-1.3.jar
。
java -cp lib/commons-codec-1.3.jar;lib/next_jar.jar
等等。
另一个解决方案可能是将您的所有jar放到JRE的ext
目录中。如果您使用独立的JRE,这是可以的。如果您使用相同的JRE来运行多个应用程序,我不建议建议这样做。