Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从命令提示符执行包含多个类路径库的jar文件_Java_Maven_Jar_Classpath - Fatal编程技术网

Java 从命令提示符执行包含多个类路径库的jar文件

Java 从命令提示符执行包含多个类路径库的jar文件,java,maven,jar,classpath,Java,Maven,Jar,Classpath,我有一个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.NoClassDe

我有一个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.

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

这将不起作用
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运行多个应用程序,我不建议这样做。

有几个选项

最简单的可能是最简单的

您还可以使用生成一个包含所有依赖项的jar


最后,您可以使用
依赖项:classpath
目标生成包含类路径的文件。

可能的解决方案是

创建批处理文件

对lib目录中的所有文件执行一个循环,并在类路径上设置每个文件unside lib

然后运行罐子


循环信息的来源

您不能在命令行上同时使用
-jar
-cp
-请参阅上面的说明,如果您使用
-jar

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

你可以这样做:

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


请注意
-cp
参数中使用code>,以解决Java命令行错误。另外,请注意,这是该命令的Windows版本。Unix上的路径分隔符是:

让maven生成一个批处理文件来启动应用程序。这是最简单的方法


您可以使用来实现此目的。

我遇到了相同的问题,但能够使用java 1.7在UNIX上将所有依赖项打包到我的jar文件中-

java -cp myjar.jar:lib/*:. mypackage.MyClass
在Windows上,您需要使用“;”而不是“:”-

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

您可以使用maven assembly插件,以下是来自官方网站的示例:


org.apache.maven.plugins
maven汇编插件
2.5.1
带有依赖项的jar
你的主课
组装
包裹
单一的

无论操作系统是什么,下面的命令都应该有效:

java -cp "MyJar.jar;lib/*" com.mainClass

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

通配符类路径在JDK 6+中可用,问题是不能同时指定
-jar
-cp
。将jar放在ext目录IMO中是一个非常糟糕的想法。@DaveNewton是的,这个问题是关于执行一个带有依赖项的
jar
。是的,你可以使用通配符类路径来完成。填充ext目录会影响您运行的所有内容,如果您运行其他任何内容,这都是危险的。这是一个专业项目;使用Maven。@DaveNewton,你想怎么做?输入通配符,然后输入包含
main
方法的类的完全限定名?拥有一个可执行的
jar
文件的整个想法是避免在执行时放入完全限定的名称,而是将其放在清单文件中。如果“笨重”的意思是“可能会破坏世界上的一切”,那么当然。我们的客户机上没有安装maven。对不起,我应该提到这一点。当你使用-jar时,我可以使用汇编插件,但不能使用exec插件,-cp被忽略。另一方面,'-cp-lib/*.jar'与'-cp-lib/dep1.jar相同;lib/dep2.jar…',我认为从java1.5我在文档中读到,*代表一个或多个jar文件。所以你需要说-cp lib*;你不应该在正常意义上使用它(一个或多个字符)事实上,*.jar对我来说不起作用(在raspberry pi上运行),而那些本应该让你的生活更轻松的工具实际上会带来更多的麻烦…我只想补充一点,这在PowerShell当前不起作用,但是在CommandPrompt中可以找到工作……很遗憾,
-cp
-jar
不能同时使用。我有一个CLI程序,它要求用户提供一个JDBC库来正确使用它,将它打包为一个可执行的JAR文件是一个挑战,here.pfew,我已经找了30分钟了,试图在raspberry pi上运行一个应用程序。原来我只需要替换
分隔符,带
。谢谢:)谢谢。这对我有用。windows版本。实际上,命令因操作系统而异,在windows中应使用分号,在unix中应使用冒号
java -cp "MyJar.jar;lib/*" com.mainClass