0

我是 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 文件太多。如果是,则急需解决此问题!

4

2 回答 2

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 提示符并键入带有值的 添加环境变量as (在系统变量部分下) 添加到变量(在系统变量部分下) 添加具有值的环境变量在项目文件夹中 创建了一个具有名称的新文件(crazyrunner)在文件 中编写了以下代码


"C:\Windows\system32\rundll32.exe" sysdm.cpl,EditEnvironmentVariables
GRADLE_HOMEC:\gradle-1.10\bin
%GRADLE_HOME%PATH
JAVA_OPTS-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' }
}

从我的项目文件夹(在 crazyrunner 中)复制 所有jar 文件(仅由 .jar 搜索)C:\poi-3.10-beta2C:\selenium-2.39.0粘贴到一个单独的文件夹(名为我的项目文件夹中的文件夹(命名)(在 crazyrunner 中)libs
CrazyRunner.jarcorelib

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

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

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

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

于 2014-02-09T10:08:11.837 回答
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 文件的位置正确拼写为它们的小写和大写。

于 2014-02-08T16:27:54.743 回答