2017-02-11 27 views
1

請注意,儘管其他帖子提出了類似問題,但我已經用盡了所有這些帖子中的答案。問題如下:Java App在MacOS上運行,但在Raspberry Pi上運行 - 錯誤:無法找到或加載主類

我開發了一個Java應用程序NetBeans Ver。 8.1上的MacOS Sierra。應用程序從NetBeans IDE和MacOS終端命令行成功運行。在收購Raspberry Pi B +之後,我創建了一個NetBeans項目配置,連接到Raspberry Pi B +,運行Raspbian OS。因此,我現在可以從NetBeans IDE構建並部署到MacOS或Raspberry Pi。 但是,當我嘗試通過IDE或SSH通過終端命令行運行應用程序時,應用程序在Pi上失敗。

Kenwood_520S.jar是應用程序jar文件的名稱,Kenwood_520S的名稱,和收發是的類的與公共靜態main()方法的名稱。

從終端命令行執行的命令是:

的java -cp Kenwood_520S.jarKenwood_520S.Transceiver

張貼在IDE的調試窗口和SSH錯誤消息終端在嘗試在Pi上運行應用程序時是相同的,即:

錯誤:未能找到或加載主類Kenwood_520S.Transceiver

我比較了dist目錄和子目錄以及在MacOS(默認配置)和Raspberry Pi B +(Pi配置)上創建的jar文件的內容。這兩個平臺上的目錄,子目錄和jar文件內容是相同的。我張貼下面的詳細信息:

ls dist 

Kenwood_520S.jar  
README.TXT  
lib 

ls lib 

AbsoluteLayout.jar 
commons-lang3-3.5.jar 
HawkBridgeFactory.jar 
JTransforms-3.1-with-dependencies.jar 
swing-layout-1.0.4.jar 

jar -tf Kenwood_520S.jar 

META-INF/ 
META-INF/MANIFEST.MF 
Kenwood_520S/ 
Kenwood_520S/AudioConversion$Range.class 
Kenwood_520S/AudioConversion.class 
Kenwood_520S/Cryptography.class 
Kenwood_520S/DateInputVerifier.class 
Kenwood_520S/DialogStringEditor.class 
Kenwood_520S/DoubleInputVerifier.class 
Kenwood_520S/ExceptionWriter.class 
Kenwood_520S/FrequencyInputVerifier.class 
Kenwood_520S/IntegerInputVerifier.class 
Kenwood_520S/Internationalization.class 
Kenwood_520S/ModeInputVerifier.class 
Kenwood_520S/PowerInputVerifier.class 
Kenwood_520S/QRZSearchWebService.class 
Kenwood_520S/QSOXML.class 
Kenwood_520S/RSTInputVerifier.class 
Kenwood_520S/SampleProcessor.class 
Kenwood_520S/TimeInputVerifier.class 
Kenwood_520S/Transceiver$1.class 
Kenwood_520S/Transceiver$10.class 
Kenwood_520S/Transceiver$11.class 
Kenwood_520S/Transceiver$12.class 
Kenwood_520S/Transceiver$13.class 
Kenwood_520S/Transceiver$14.class 
Kenwood_520S/Transceiver$15.class 
Kenwood_520S/Transceiver$16.class 
Kenwood_520S/Transceiver$17.class 
Kenwood_520S/Transceiver$18.class 
Kenwood_520S/Transceiver$19.class 
Kenwood_520S/Transceiver$2.class 
Kenwood_520S/Transceiver$20.class 
Kenwood_520S/Transceiver$21.class 
Kenwood_520S/Transceiver$22.class 
Kenwood_520S/Transceiver$23.class 
Kenwood_520S/Transceiver$24.class 
Kenwood_520S/Transceiver$25.class 
Kenwood_520S/Transceiver$26.class 
Kenwood_520S/Transceiver$27.class 
Kenwood_520S/Transceiver$28.class 
Kenwood_520S/Transceiver$29.class 
Kenwood_520S/Transceiver$3.class 
Kenwood_520S/Transceiver$30.class 
Kenwood_520S/Transceiver$31.class 
Kenwood_520S/Transceiver$32.class 
Kenwood_520S/Transceiver$33.class 
Kenwood_520S/Transceiver$34.class 
Kenwood_520S/Transceiver$35.class 
Kenwood_520S/Transceiver$4.class 
Kenwood_520S/Transceiver$5.class 
Kenwood_520S/Transceiver$6.class 
Kenwood_520S/Transceiver$7.class 
Kenwood_520S/Transceiver$8.class 
Kenwood_520S/Transceiver$9.class 
Kenwood_520S/Transceiver.class 
Kenwood_520S/WavAudioPulse$PulseLevel.class 
Kenwood_520S/WavAudioPulse.class 
Kenwood_520S/WavAudioRecorder.class 
Kenwood_520S/WavAudioSample.class 
Kenwood_520S/WebServiceListener.class 
Kenwood_520S/strings.properties 
Kenwood_520S/strings_ar_SA.properties 
Kenwood_520S/strings_el_GR.properties 
Kenwood_520S/strings_en_US.properties 
Kenwood_520S/strings_es_ES.properties 
Kenwood_520S/strings_it_IT.properties 

jar xf Kenwood_520S.jar 
cat META-INF/MANIFEST.MF 

Manifest-Version: 1.0 

Ant-Version: Apache Ant 1.9.4 

Created-By: 1.8.0_73-b02 (Oracle Corporation) 

Class-Path: lib/swing-layout-1.0.4.jar lib/AbsoluteLayout.jar lib/Hawk 
BridgeFactory.jar lib/JTransforms-3.1-with-dependencies.jar lib/commo 
ns-lang3-3.5.jar 

X-COMMENT: Main-Class will be added automatically by build 

Main-Class: Kenwood_520S.Transceiver 

The version of Java on the MacOS is: 

java -version 

java version "1.8.0_73" 
Java(TM) SE Runtime Environment (build 1.8.0_73-b02) 
Java HotSpot(TM) 64-Bit Server VM (build 25.73-b02, mixed mode) 

The version of Java on the Raspberry Pi is: 

java -version 

java version "1.8.0_65" 
Java(TM) SE Runtime Environment (build 1.8.0_65-b17) 
Java HotSpot(TM) Client VM (build 25.65-b01, mixed mode) 

我懷疑,在行爲的差異是由於環境的差異。 Java版本的差異更多的是一種遙遠的可能性,但可能存在影響行爲的其他環境變量。 (我懷疑CLASSPATH的差異是因爲我明確指出它在-cp命令行參數中的原因。)

請注意:我成功創建了幾個「Hello World」類型的應用程序,這兩個應用程序可以在兩個平臺上運行,和命令行。作爲我調查這個問題的一部分,我做了這件事。我是一位經驗豐富的開發人員,但Java是相對較新的一個。

您的時間和耐心非常感謝。

回答

0

我在這裏回答我自己的問題,但不幸的是沒有立即解決這個問題的原因。此外,儘管我在我的問題中提供了所有細節,但是我沒有包含一個基本事實:此應用程序使用了swing並導入了javax。

有問題的Java應用程序導入用於swing的javax。ARM處理器沒有javax導入。因此,這個Java swing應用程序在Mac上運行,但不在Pi上運行。

理解手頭實際問題的關鍵在於使用-verbose開關執行java命令。

當從MacOS終端命令行成功運行應用程序時,請觀察該命令的結果摘錄。有很多對javax的引用以及成功的load語句。

的java -verbose -cp Kenwood_520S.jar Kenwood_520S.Transceiver

[加載從/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/jre/lib java.io.FilePermission中/rt.jar] [加載java.io.FilePermission中$ 1從/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/jre/lib/rt.jar] [加載從java.io.FilePermissionCollection /Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/jre/lib/rt.jar] [從/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents載入java.security.AllPermission /Home/jre/lib/rt.jar] [Loaded java.security.Unres從/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/jre/lib/rt.jar] olvedPermission [ /Contents/Home/jre/lib/rt.jar] [已加載的Kenwood_520S.WebServiceListener來自文件:/Users/steffen/Desktop/dist/Kenwood_520S.jar] [來自/ Library/Java/JavaVirtualMachines的加載的java.util.EventListener /jdk1.8.0_73.jdk/Contents/Home/jre/lib/rt.jar] [來自file:/Library/Java/Extensions/RXTXcomm.jar的加載的gnu.io.SerialPortEventListener] [Loaded javax.swing。 event.CellEditorListener from /Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/jre/lib/rt.jar] [從/ Library/java庫中加載javax.swing.WindowConstants,的Java/JavaVirtualMachines/jdk1.8.0_73.jdk /內容/首頁/ JRE/lib中/的rt.jar] [從/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/加載javax.accessibility.Accessible首頁/ JRE/lib中/的rt.jar] ... [從文件加載Kenwood_520S.Transceiver:/Users/steffen/Desktop/dist/Kenwood_520S.jar] ... [加載從javax.swing.UnsupportedLookAndFeelException /Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/jre/lib/rt.jar] [從/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents載入的java.text.Format /Home/jre/lib/rt.jar] [來自/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/jre/lib/rt.jar的Loaded java.text.NumberFormat] [L oaded java.text.DecimalFormat from /Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/jre/lib/rt.jar] [從/ Library/Java/JavaVirtualMachines中載入javax.swing.JFormattedTextField $ AbstractFormatter /jdk1.8.0_73.jdk/Contents/Home/jre/lib/rt.jar] ... [從文件加載Kenwood_520S.Cryptography:/Users/steffen/Desktop/dist/Kenwood_520S.jar] 。 .. [加載Kenwood_520S.Transceiver $ 1從文件:/Users/steffen/Desktop/dist/Kenwood_520S.jar] [加載Kenwood_520S.Transceiver $ 2從文件:/Users/steffen/Desktop/dist/Kenwood_520S.jar] [加載Kenwood_520S.Transceiver $ 3文件:/Users/steffen/Desktop/dist/Kenwood_520S.jar] ...

現在看看該命令的結果的一個代碼段,當應用程序對裨失敗:

的java -verbose -cp Kenwood_520S.jar Kenwood_520S.Transceiver

[加載java.io.來自/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/lib/rt.jar的FilePermission [從/ usr/lib/jvm/jdk-8-中加載的java.io.FilePermission $ 1] oracle-arm32-vfp -hflt/jre/lib/rt.jar] [從/ usr/lib/jvm/jdk-8-oracle-arm32-vfp -hflt/jre/lib/rt中加載了java.io.FilePermissionCollection。 jar] [Loaded java.security.AllPermission從/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/lib/rt.jar] [加載java.security.UnresolvedPermission從/ usr/LIB/JVM/JDK -8- oracle- ARM32-VFP-hflt/JRE/LIB/rt.jar中] [加載從/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/lib/rt.jar java.security.BasicPermissionCollection] [已加載的Kenwood_520S.WebServiceListener來自文件:/home/pi/NetBeansProjects/Kenwood_520S/dist/Kenwood_520S.jar] [已加載的java.util.zip.Inflater來自/ usr/lib/jvm/jdk-8-oracle-arm32- vfp-hflt/jre/lib/rt.jar] [已加載的java.util.zip.ZStreamRef來自/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/lib/rt.jar] [已加載的java.util.zip.InflaterInputStream來自/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/lib/rt.jar] [Loaded java.util.zip.ZipFile $ ZipFileInflaterInputStream從/ usr/lib/jvm/jdk-8-oracle-arm32-v FP-hflt/JRE/LIB/rt.jar中] [加載從/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/lib/rt.jar] java.io.IOException的。 .. [加載java.text.Format子$從/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/lib/rt.jar領域 [加載java.text.MessageFormat中的$場from /usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/lib/rt.jar] 錯誤:無法找到或加載主類Kenwood_520S.Transceiver [Loaded java.lang。關閉/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/lib/rt.jar] [已從/ usr/lib/jvm/jdk-8載入java.lang.Shutdown $ Lock -Oracle-ARM32-VFP-hflt/JRE/LIB/rt.jar中]

從詳細輸出整個Pi沒有對javax的引用,因爲在遇到導入Kenwood_520S.Transceiver時,加載失敗!問題不是該文件不能是找到,而是它不能是加載

我的下一步是找到一個與javax相當的ARM - 如果類似的東西存在。

相關問題