为什么在 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" 属性。
参考文献:
- The
java
command page - 解释 -jar
与 -cp
- The JAR file specification - 解释 "Class-Path" 属性
注意:由于您是使用 Maven 构建 JAR 文件,因此还有其他选项;例如
- 使用 "Shade" 插件创建一个可执行文件 "uber-jar",其中包含单个 JAR 中的所有依赖项。
为了各种实验,我在 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" 属性。
参考文献:
- The
java
command page - 解释-jar
与-cp
- The JAR file specification - 解释 "Class-Path" 属性
注意:由于您是使用 Maven 构建 JAR 文件,因此还有其他选项;例如
- 使用 "Shade" 插件创建一个可执行文件 "uber-jar",其中包含单个 JAR 中的所有依赖项。