2014-02-08 16 views
0

我是java編程的新手,我創建了一個集成了selenium,apachepoi和java swing的程序。在編譯程序時,我能夠成功編譯並且程序運行正確;但是當我嘗試爲我的程序製作一個jar文件時,它顯示java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/Row錯誤。
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和外部craz中的所有類文件yrunner(父文件夾的Java'內)被添加到罐(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個新行

不知道什麼我失去了:-(,我已經花了整整一天該死固定這一點,並沒有留下無奈地發佈這個問答!是的,我沒試過,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:
I我使用的是Windows 8,而Java的版本是1.7.0_51,我沒有使用任何IDE,我確實有這樣的預感,這可能是由於classpath中的jar文件太多。如果是的話,修復這是非常需要的!

+0

請使用編輯器頂部的小圖標來格式化您的問題。 – 2014-02-08 15:31:43

+0

可能在清單文件http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html中存在錯誤,但我認爲使用工具生成清單比如http://www.gradle.org/ – jbaliuka

+0

條目看起來無效,它應該是相對的,不需要引用。應該有可能找出正確的格式,但從來沒有手動,有很多工具要做,例如maven https://maven.apache.org/plugins/maven-jar-plugin/examples/manifest-customization.html andy IDE也應該能夠將類路徑條目導出到jar。 – jbaliuka

回答

0

幾件事情,你可以檢查是清單文件是否有按照正確的格式爲: http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

注意,classpath中使用斜線/而不是反斜線\和多個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文件的位置是否正確拼寫了他們的小寫和大寫。

0

感謝您的回覆,最後我找到了答案。搖籃! :-)

正如我所設想的那樣,已經創建的.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 envir與價值-Xms256m -Xmx2048m
創建了名稱build.gradle一個新的文件到項目文件夾(crazyrunner)
onment變量寫了下面的代碼在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-beta2C:\selenium-2.39.0複製的所有jar文件(只是搜索的.jar)和我的項目中粘貼到一個單獨的文件夾(命名爲libs)文件夾(在crazyrunner內)
複製我已經創建的jar((在crazyrunner中)

注意:此時,我的項目文件夾(crazyrunner)有2個子文件夾(libscorelibs)和1個文件(build.gradle
打開命令提示(正常模式),並運行到項目文件夾(crazyrunner)
鍵入的命令gradle build
Thatz它!

我花了大約20分鐘完成了構建成功,經過漫長的夜間搜索,我發現它工作!

我的學習:
搖籃基本上集成了所有編譯後的文件的jar文件裏(如果如上建,像build.gradle文件),因此運行這是在新創建的jar文件不需要任何額外的依賴一個優勢;然而,由於所有依賴文件都添加到jar,它使得尺寸巨大,但文件運行在任何系統中,即使沒有硒和apache-poi(我希望;-))

謝謝你們都和我的特別感謝jbaliuka :-)好的工作傢伙!