我是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文件过多。如果是的话,非常需要修复它!
答案 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个子文件夹(corelib
和libs
)和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文件位置正确拼写为大写和小写。