java.lang.NoClassDefFoundError:org / apache / poi / ss / usermodel / Row运行时错误

时间:2014-02-08 15:11:48

标签: 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的程序包中(程序的第一行以package crazyrunner开头)

用于编译的命令(不确定是否相关)
javac -encoding UTF8 crazyrunner\CrazyRunner.java

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

用于运行的命令
java crazyrunner.CrazyRunner(这很好用)

使用的命令生成jar
jar cvfm CrazyRunner.jar manifest.mf *.class crazyrunner\*.class

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

manifest.mf文件的数据如下 Manifest-Version: 1.0
Created-By: Eric Stanley
Main-Class: crazyrunner.CrazyRunner
Class-Path: "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个新行

不确定我错过了什么:-(而且我花了整整一天来修理这个并且没有选择就离开了这个q !!并且我确实尝试了stackoverflow已经拥有的所有选项并且没有任何结果: - (

选项1:
Open the Control Panel
Go to System
Go to Advanced Systems Properties
Then Environment Variables
In System Variables, click Add
New Variable Name: _JAVA_OPTIONS
New Variable Value: -Xmx512M (tried -Xmx1024M too)
Click OK

选项2:
Reinstall Java

选项3:
Open the Run box
Enter msconfig
Services (tab)
CHECK "Hide All Microsoft Services"
Click "Disable All" (button)
Click APPLY
Click OK

选项4:
Update manifest.txt file with classpath

非常感谢帮助


注意:
该程序打开一个GUI(当我输入java crazyrunner.CrazyRunner时),当我尝试在命令提示符中单独提供CrazyRunner.jar时,它会抛出一个错误,指出Java Virtual Machile Launcher. A java exception occurred


PS:
我使用的是Windows 8,java的版本是1.7.0_51,我没有使用任何IDE,我确实有预感,这可能是由于类路径中的jar文件过多。如果是的话,非常需要修复它!

2 个答案:

答案 0 :(得分:1)

感谢您的所有回复,最后我找到了答案。摇篮! : - )

正如我所假设的,已经创建的.jar文件没有变化;这意味着我使用清单文件创建的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的{​​{1}}环境变量 在项目文件夹(crazyrunner)中创建了一个名为-Xms256m -Xmx2048m的新文件 在build.gradle档案中写下以下代码

build.gradle
apply plugin: 'java'
sourceCompatibility = 1.6
targetCompatibility = 1.8
defaultTasks = ['clean', 'jar']
dependencies {
compile fileTree(dir: 'corelib', includes: ['*.jar'])
compile fileTree(dir: 'libs', includes: ['*.jar'])
}
jar {
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
manifest { attributes 'Main-Class': 'CrazyRunner' }

}C:\poi-3.10-beta2复制所有jar文件(仅通过.jar搜索)并粘贴到我项目文件夹中的单独文件夹(名为C:\selenium-2.39.0)中(在crazyrunner中)
将我已创建的jar(原始问题中提到的libs)文件复制到我项目文件夹(在crazyrunner中)的单独文件夹(名为CrazyRunner.jar)中

注意:此时,我的项目文件夹(crazyrunner)有2个子文件夹(coreliblibs)和1个文件(corelibs
打开命令提示符(正常模式)并遍历到项目文件夹(crazyrunner)
输入的命令build.gradle
那就是它!

我花了大约20分钟才能成功完成构建,经过漫长的夜间搜索后我发现它正常工作!

我的学习:
Gradle基本上集成了jar中的所有编译文件(如果像上面那样构建,就像gradle build文件一样),这样新创建的jar文件在运行时不需要任何额外的依赖,这是一个优点;但是,因为所有依赖文件都被添加到jar中,所以它的大小很大但是文件在任何系统中运行,即使没有selenium和apache-poi(我希望;-))

谢谢你们,我特别感谢jbaliuka :-)干得好的工作人员!!

答案 1 :(得分:0)

您可以检查的一些事项是清单文件,它是否遵循正确的格式,如: http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

请注意,类路径使用斜杠/而不是反斜杠\,并且多个jar文件由空格字符连接,而不是换行符。 例如。以下内容将是一个有效的清单文件:

Manifest-Version: 1.0
Created-By: Eric Stanley
Main-Class: crazyrunner.CrazyRunner
Class-Path: "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"

并确保jar文件位置正确拼写为大写和小写。