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

时间:2012-10-22 19:10:16

标签: java maven jar classpath

我有一个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个库,它可能会在将来的版本中增长。有更好的方法吗?

9 个答案:

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