2011-12-14 11 views
9

मुझे एक समस्या है जो मुझे पागल कर रही है। मैटलैब केवल एक जार फ़ाइलमैटलैब जार पैकेज में मेरे कुछ जावा वर्ग (सभी नहीं) देख सकते हैं

में embeded मेरी वर्ग के कुछ देखता है अगर मैं एक पैकेज के बाहर वर्गों संकलन और javaaddpath का उपयोग कर मैटलैब में वर्ग के लिए पथ जोड़ने के लिए, मुझे कोई समस्या

जब मैं मुठभेड़ नहीं है कक्षा में एक पैकेज में संकलित करें और फिर Matlab के तहत उन्हें एक्सेस करने का प्रयास करें, मुझे समस्याएं हैं। कुछ मैटलैब कोड

javaaddpath('/Users/me/Documents/workspace/EKGTest.jar'); 
clear java 
import com.neurosky.thinkgear.* 
methods('EkgSense') 

Methods for class com.neurosky.thinkgear.EkgSense: 

EkgSense     getClass     notify     reset    
addTemplate    getClassificationResults notifyAll     toString 
equals     hashCode     processData    wait 

methods('EkgEpoch') 

No methods for class EkgEpoch or no class EkgEpoch 

अब, मैं पैकेज में देखता हूं, सभी वर्ग सार्वजनिक हैं। यह

osx:/Users/me/Documents/workspace> jar tf EKGTest.jar 
META-INF/MANIFEST.MF 
META-INF/REFACTORINGS.XML 
com/ 
com/neurosky/ 
com/neurosky/thinkgear/ 
com/neurosky/thinkgear/EkgEpoch.class 
com/neurosky/thinkgear/EkgEpoch.java 
com/neurosky/thinkgear/EkgParameters.class 
com/neurosky/thinkgear/EkgParameters.java 
com/neurosky/thinkgear/EkgTemplate.class 
com/neurosky/thinkgear/EkgTemplate.java 
com/neurosky/thinkgear/Matlab.class 
com/neurosky/thinkgear/Matlab.java 
com/neurosky/thinkgear/EkgSense.class 
com/neurosky/thinkgear/EkgSense.java 
com/neurosky/thinkgear/DistanceArray.class 
com/neurosky/thinkgear/DistanceArray.java 

-tf और --classpath javap के नीचे

osx:/Users/me/Documents/workspace> javap -classpath /Users/me/Documents/workspace/EKGTest.jar com.neurosky.thinkgear.EkgEpoch 
Compiled from "EkgEpoch.java" 
public class com.neurosky.thinkgear.EkgEpoch extends java.lang.Object implements java.lang.Cloneable{ 
    public int numberOfSamples; 
    public float[] data; 
    public com.neurosky.thinkgear.EkgEpoch(int); 
    public com.neurosky.thinkgear.EkgEpoch(int, float[]); 
    public com.neurosky.thinkgear.EkgEpoch(float[]); 
    public com.neurosky.thinkgear.EkgEpoch(com.neurosky.thinkgear.EkgEpoch); 
    public com.neurosky.thinkgear.EkgEpoch(org.json.JSONArray); 
    public org.json.JSONArray toJSONArray(); 
    public static float[] convolve(float[], float[]); 
    public float getLineNoiseAmplitude(); 
    public com.neurosky.thinkgear.EkgEpoch subtract(com.neurosky.thinkgear.EkgEpoch); 
    public com.neurosky.thinkgear.EkgEpoch subEpoch(int, int); 
    public com.neurosky.thinkgear.EkgEpoch square(); 
    public com.neurosky.thinkgear.EkgEpoch subtract(float); 
    public com.neurosky.thinkgear.EkgEpoch diff(); 
    public boolean exceedValue(float, int, int); 
    public com.neurosky.thinkgear.EkgEpoch smooth(int); 
    public float mean(); 
    public float sum(); 
    public float max(); 
    public float median(); 
    public com.neurosky.thinkgear.EkgEpoch clone(); 
    public com.neurosky.thinkgear.EkgEpoch sort(); 
    public int[] sortIndices(com.neurosky.thinkgear.EkgEpoch); 
    public float std(); 
    public int find_heart_beats(int[], float); 
    public com.neurosky.thinkgear.EkgEpoch detrend(); 
    public java.lang.Object clone()  throws java.lang.CloneNotSupportedException; 
} 

osx:/Users/me/Documents/workspace> javap -classpath /Users/me/Documents/workspace/EKGTest.jar com.neurosky.thinkgear.EkgSense 
Compiled from "EkgSense.java" 
public class com.neurosky.thinkgear.EkgSense extends java.lang.Object{ 
    public com.neurosky.thinkgear.EkgParameters params; 
    public com.neurosky.thinkgear.EkgTemplate[] templates; 
    public com.neurosky.thinkgear.EkgTemplate currentData; 
    public int lastTemplateInd; 
    public float lastEpochValue; 
    public com.neurosky.thinkgear.EkgSense(com.neurosky.thinkgear.EkgParameters); 
    public void reset(); 
    public void addTemplate(java.lang.String, float[][]); 
    public void addTemplate(com.neurosky.thinkgear.EkgTemplate); 
    public java.lang.String getClassificationResults(); 
    public boolean processData(float[]); 
} 

मैं पर OSX मैटलैब चला रहा हूँ जार का परिणाम है। मैंने Matlab 7.7.0.471 (R2008b) और 7.11.0.584 (R2010b) के साथ प्रयास किया है और एक ही समस्या है। मैटलैब दोनों देशी ओएसएक्स जावा (जावा 1.6.0_26-b03-384-10M3425 ऐप्पल इंक जावा हॉटस्पॉट (टीएम) 64-बिट सर्वर वीएम मिश्रित मोड के साथ उपयोग कर रहे हैं) जो एक्लिप्स में एक जैसा होना चाहिए (मैंने चेक किया है और ग्रहण 1.6 के साथ संकलित)।

याद रखें कि जब मैं संकुल विवरण और जावा फाइलों के शीर्ष पर कुछ आयात करता हूं (पाठ्यक्रम के सभी वर्गों में) और जब मैं बस .class फ़ाइलों में पथ जोड़ता हूं तो मैं लापता वर्ग को कोई समस्या नहीं देख सकता (उन्हें एक जेएआर फ़ाइल में नहीं पहुंचें)।

किसी भी मदद की सराहना की जाएगी। धन्यवाद,

जेसन

+0

पर बेकार है आप, एक समाधान मिल गया है एक जवाब में रख और यह स्वीकार करते हैं स्वयं। इस तरह दूसरों को इसे अधिक आसानी से मिल जाएगा। –

उत्तर

13

मैं अंत में समस्या जो ऊपर नहीं देखा जा सकता पाया। समस्या (कहीं भी दस्तावेज नहीं) यह था कि मेरी कुछ कक्षाएं बाहरी पैकेज का उपयोग करती हैं जिन्हें मैंने मैटलैब में आयात नहीं किया था। मैं इन पैकेजों से जुड़ी किसी भी कार्यक्षमता का उपयोग करने की योजना नहीं बना रहा था।

फिर भी, मैटलैब त्रुटि संदेश है कि यह कक्षा को हल नहीं कर पा रहा है। एक त्रुटि संदेश इंगित करता है कि वर्ग का उपयोग नहीं किया जा सकता है क्योंकि कुछ संकुल संदर्भित नहीं किए जाते हैं।

है कि आपका पैकेज बाहरी संकुल का उपयोग करता है, MATLAB के तहत सभी JAR फ़ाइल आयात करने सुनिश्चित कर सकते हैं या कुछ वर्गों

एक और टिप है कि मैं उपयोगी पाया गया है कि Matlab समारोह "आयात" एक नहीं लौटेगा है BE अमेरिका नहीं होगा त्रुटि अगर आप एक पैकेज दर्ज करते हैं जो * "import java.doesnotexist। *" के साथ मौजूद नहीं है ठीक है। हालांकि, "java.doesnotexist.aclass आयात करें" काम नहीं करेगा।

जेसन

+0

इसके लिए बहुत बहुत धन्यवाद। यह matlab द्वारा एक अजीब चूक है। – SColvin

+1

प्रश्नोत्तर के लिए बहुत बहुत धन्यवाद। इसने वास्तव में मेरी जैसी ही समस्या को हल करने में मदद की :) –

+0

आपको इस प्रश्न के लिए सबसे अच्छा जवाब के रूप में अपना उत्तर स्वीकार करना होगा :) – Sadjad

1

एक अन्य कारण MATLAB एक वर्ग नहीं देख पाएंगे कि आपने JRE7 के लिए संकलन और MATLAB 2012b (शायद विज्ञप्ति अन्य MATLAB पर लागू होता है) का उपयोग कर रहे है।

symtom extremly लंगड़ा त्रुटि है

The class "JavaNuServer" is undefined. 
Perhaps Java is not running. 

समाधान:

javac झंडे

-source 1.6 -target 1.6 
0

स्वीकार किए जाते हैं जवाब की मदद के लिए साथ संकलित - वहाँ अगर जाँच करने के लिए कहीं ज्यादा बेहतर तरीका है import कमांड के मुकाबले जावा क्लास को संपत्तिगत रूप से लोड किया गया था। whereisjavaclassloadingfrom फ़ंक्शन का उपयोग करें, जो एंड्रयू जंक द्वारा this answer में प्रदान किया गया है।

यह न केवल आपको बता देंगे वर्ग के लोड होने पर, यह सभी जार कि इस वर्ग में उपलब्ध है सूची जाएगा। यह अक्सर है कि अपने वर्ग नकाबपोश हो जाता है क्या होता है/एक ही पैकेज/नाम के साथ एक और वर्ग भारी पड़ , एक अलग जार में स्थित है। ऐसा हो सकता है उदा। यदि आप Matlab के साथ भेजे गए लोगों में से एक की तुलना में एक नई लाइब्रेरी का उपयोग करने का प्रयास करते हैं, और स्थिर जावा क्लासपाथ पर इसे मूल से ऊपर न रखें।

0

यह समस्या कई प्रकार की विफलताओं के कारण हो सकती है। (उन सभी को निराशा होती है क्योंकि आपको असफल होने के बारे में कोई जानकारी नहीं मिलती है!) स्वीकृत उत्तर एक कारण और समाधान का वर्णन करता है। वुल्फगैंग कुएन का जवाब एक और संभावित मुद्दे पर आता है, हालांकि मुझे इस मुद्दे को समझने में परेशानी थी इसलिए मैंने अपना खुद का उत्तर थोड़ा अधिक आम तौर पर विस्तारित करने का फैसला किया:

कुछ विशिष्ट जेआरई के साथ मैटलैब जहाजों का प्रत्येक संस्करण जो चलाया गया है और समर्थित है । जेआरई के विभिन्न संस्करण के साथ मैटलैब जहाज का अलग संस्करण। इससे कोई फर्क नहीं पड़ता कि मैटलैब और संबंधित जेआरई का कौन सा संस्करण आपके पास है, यदि आपने जावा कंपाइलर के उच्च (और असंगत) संस्करण के साथ जार फ़ाइल में मौजूद बाहरी जावा क्लास का पालन किया है, तो मैटलैब कक्षाओं को स्वीकार करने से इंकार कर देगा, भले ही वे हों डब्बा। यदि आप भाग्यशाली हैं, तो आप जावा को अपने मैटलैब के उदाहरण में जावा के संस्करण के साथ संगतता निर्दिष्ट करने वाले ध्वज के साथ जावा को पुन: संकलित करके ठीक कर सकते हैं।

जावा का कौन सा संस्करण पता लगाने के लिए अपने मैटलैब चल रहा है, मैटलैब कमांड प्रॉम्प्ट पर इस आदेश का उपयोग करें:

version -java

0

मैं बस अब एक ही समस्या का सामना करना पड़ा। समाधान एक नया माहौल पैरामीटर यहाँ उल्लेख की स्थापना द्वारा matlab जावा संस्करण को अद्यतन करने के लिए है

https://cn.mathworks.com/matlabcentral/answers/130359-how-do-i-change-the-java-virtual-machine-jvm-that-matlab-is-using-on-windows

मैटलैब त्रुटि संदेश

+0

यदि संभव हो, तो यहां महत्वपूर्ण कदमों को सारांशित करना अच्छा होगा, ताकि यह उत्तर अकेले खड़े हो सके एक समाधान के रूप में। – Adam

संबंधित मुद्दे