java.lang.NoClassDefFoundError : org/apache/poi/ss/usermodel/Row Error during runtime

标签 java jar classpath classnotfound

我是java编程新手,我创建了一个集成了selenium、apachepoi和java swing的程序。在编译程序时,我能够成功编译它并且程序运行正常;然而,当我尝试为我的程序制作 jar 文件时,它显示 java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/Row 错误。

下面是我的程序的文件夹结构
c:\users\userid\documents\java\crazyrunner
java 文件的名称为 CrazyRunner.java,位于crazyrunner 文件夹

该程序位于名为crazyrunner的包中(程序的第一行以packagecrazyrunner开头)

编译时使用的命令(不确定是否相关)
javac -编码 UTF8crazyrunner\CrazyRunner.java

编译导致在父 (java) 和子 (crazyrunner) 文件夹中创建 .class 文件

用于运行的命令
javacrazyrunner.CrazyRunner(这工作得很好)

用于生成 jar 的命令
jar cvfm CrazyRunner.jar manifest.mf *.classcrazyrunner\*.class

jar 命令的结果成功,并且crazyrunner 内和crazyrunner 外部(父文件夹“Java”内)的所有类文件都添加到jar 中(CrazyRunner.jar)

manifest.mf 文件的数据如下
list 版本:1.0
创建者:Eric Stanley
主类:crazyrunner.CrazyRunner
类路径:“C:\poi-3.10-beta2\poi-3.10-beta2-20130904.jar”
“C:\poi-3.10-beta2\poi-examples-3.10-beta2-20130904.jar”
“C:\poi-3.10-beta2\poi-excelant-3.10-beta2-20130904.jar”
..


以 2 个新行结尾

不确定我错过了什么:-(我花了一整天的时间来解决这个问题,除了发布这个问题之外别无选择!!是的,我确实尝试了 stackoverflow 已经有的所有选项,但没有任何结果: -(

选项 1:
打开控制面板
进入系统
转到高级系统属性
然后是环境变量
在“系统变量”中,单击“添加”
新变量名称:_JAVA_OPTIONS
新变量值:-Xmx512M(也尝试过-Xmx1024M)
单击“确定”

选项 2:
重新安装 Java

选项 3:
打开运行框
输入msconfig
服务(选项卡)
选中“隐藏所有 Microsoft 服务”
点击“全部禁用”(按钮)
点击“应用”
单击“确定”

选项 4:
使用类路径更新manifest.txt文件

非常感谢您的帮助


注意:
该程序打开一个 GUI(当我输入 javacrazyrunner.CrazyRunner 时),当我尝试在命令提示符中单独给出 CrazyRunner.jar 时,它会抛出一个错误,指出 Java 虚拟机启动器。发生java异常


PS:
我使用的是 Windows 8,java 的版本是 1.7.0_51,我没有使用任何 IDE,我有预感这可能是由于类路径中的 jar 文件太多所致。如果是,那么迫切需要解决这个问题!!

最佳答案

谢谢大家的回复,我终于找到答案了。 Gradle !! :-)

正如我所假设的,已创建的 .jar 文件没有任何更改;这意味着我使用 list 文件创建的 jar 文件是正确的,问题是编译时可用的类文件在运行时不可用。因此,我使用了用于编译的所有 jar 文件以及我已经创建的 jar 文件 (CrazyRunner.jar) 来使用 gradle 构建新的 jar 文件。

遵循的步骤:
http://downloads.gradle.org/distributions/gradle-1.10-all.zip下载了gradle 1.10
提取“C:\gradle-1.10
”下的文件 在管理员模式下打开cmd提示符并输入
"C:\Windows\system32\rundll32.exe"sysdm.cpl,EditEnvironmentVariables
添加了 GRADLE_HOME 环境变量,其值为 C:\gradle-1.10\bin(在系统变量部分下)
%GRADLE_HOME% 添加到 PATH 变量(在系统变量部分下)
添加了 JAVA_OPTS 环境变量,其值为 -Xms256m -Xmx2048m
在项目文件夹 (crazyrunner) 中创建了一个名为 build.gradle 的新文件
build.gradle文件

中写入以下代码

应用插件:'java'
sourceCompatibility = 1.6
目标兼容性= 1.8
defaultTasks = ['clean', 'jar']
依赖项{
编译 fileTree(dir: 'corelib', include: ['*.jar'])
编译 fileTree(dir: 'libs', include: ['*.jar'])
}
jar{
来自 {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
list { 属性 'Main-Class': 'CrazyRunner' }
}

C:\poi-3.10-beta2C:\selenium-2.39.0 复制所有 jar 文件(仅通过 .jar 搜索)并粘贴到我的项目文件夹(在crazyrunner内)内的单独文件夹(名为libs)
将我已经创建的 jar(CrazyRunner.jar 是按照原始问题中提到的方式创建的)文件复制到我的项目文件夹(在crazyrunner内)中的一个单独的文件夹(名为corelib)

注意:此时,我的项目文件夹 (crazyrunner) 有 2 个子文件夹(libscorelibs)和 1 个文件 (build.gradle)
打开命令提示符(普通模式)并遍历到项目文件夹(crazyrunner)
输入命令gradle build
就这样!!

我花了大约 20 分钟才成功完成构建,经过一夜的搜索,我发现它可以工作了!!

我的学习:
Gradle 基本上集成了 jar 中所有已编译的文件(如果按照上面的方式构建,如 build.gradle 文件),这样新创建的 jar 文件在运行时不需要任何额外的依赖项,这是一个优势;但是,由于所有依赖文件都添加到 jar 中,因此文件大小很大,但即使没有 selenium 和 apache-poi,该文件也可以在任何系统中运行(我希望;-))

谢谢你们,特别感谢 jbaliuka :-) 干得好!

关于java.lang.NoClassDefFoundError : org/apache/poi/ss/usermodel/Row Error during runtime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21647650/

相关文章:

java - 制作可执行jar文件

java - 升级没有 .proto 的 protobuf jar 的命名空间

java - NetBeans - Java EE 服务器类路径设置不正确 - 服务器主目录丢失错误

java - 将外部属性文件添加到类路径

java - 从 jar 中搜索并提取文件。 java

java - vscode 类路径 : Import all jar in folder

java - 带有图像的 GUI 窗口

java - 想要使用 post 方法的剩余模板来使用服务

java - Java Swing有没有类似.NET中listview的控件?

java - 确定使用哪些 .jar 文件