为什么在 mvn:assembly 构建的批处理中使用 args4j 时出现 java.lang.NoClassDefFoundError

Why occurs a java.lang.NoClassDefFoundError when I use args4j in a batch built by mvn:assembly

为了各种实验,我在 github 负责一个 java 项目。

Maven 构建后,程序 运行s 带有脚本 bat。

现在我打开了一个分支,因为我会使用库 args4j 来解析参数。

构建工作正常,jar 存在于目录 lib 中,但是当我 运行 我有异常堆栈跟踪

Exception in thread "main" java.lang.NoClassDefFoundError: org/kohsuke/args4j/CmdLineException at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2625) at java.lang.Class.getMethod0(Class.java:2866) at java.lang.Class.getMethod(Class.java:1676) at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) Caused by: java.lang.ClassNotFoundException: org.kohsuke.args4j.CmdLineException at java.net.URLClassLoader.run(URLClassLoader.java:366) at java.net.URLClassLoader.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 6 more

在 bat 中我配置了类路径,以便 args4j jar 在 lib 中:这是 bat 脚本的说明

SET JAVA_DIR=C:\Program Files\Java\jdk1.7.0_80\bin\
>CUT
"%JAVA_DIR%\java" -jar ".\lib\buildCSS-1.0.jar"  -cp ".\lib\" -conf "./conf/environment.properties"

我不明白 java.lang.NoClassDefFoundError 的交易。 jar 存在并通过 -cp 选项

链接

请问您有什么想法(和解决方案)吗?

您不能在命令行中组合使用 -jar-cp 参数。如果 java 命令看到 -jar 它会将 jarfile 名称之后的所有内容视为应用程序参数,并且忽略任何较早的 class 路径参数。

您有两个选择:

  • 使用 -cp,在 class 路径中包含主 JAR,并在命令行中输入主 class 的完整 class 名称。
  • 使用 -jar,并向列出所有依赖项的主 JAR 清单文件添加 "Class-Path" 属性。

参考文献:

注意:由于您是使用 Maven 构建 JAR 文件,因此还有其他选项;例如

  • 使用 "Shade" 插件创建一个可执行文件 "uber-jar",其中包含单个 JAR 中的所有依赖项。