2011-12-14 40 views
9

Tôi gặp vấn đề khi lái xe cho tôi. Matlab chỉ nhìn thấy một số lớp học của tôi embeded trong một tập tin JARMatlab không thể thấy một số lớp học java của tôi (không phải tất cả) trong gói jar

Nếu tôi biên dịch các lớp bên ngoài của một gói và thêm đường dẫn đến lớp học trong Matlab sử dụng javaaddpath, tôi không gặp phải bất kỳ vấn đề

Khi tôi biên dịch lớp trong một gói và sau đó cố gắng truy cập chúng trong Matlab, tôi có vấn đề. Bên dưới một số mã 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 

Bây giờ, tôi tìm trong gói, tất cả các lớp đều được công khai. Đây là một kết quả của jar -tf

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 

và dưới của javap --classpath

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[]); 
} 

Tôi đang chạy Matlab trên OSX. Tôi đã thử với Matlab 7.7.0.471 (R2008b) và 7.11.0.584 (R2010b) và có cùng một vấn đề. Cả Matlab đang sử dụng Java OSX nguyên gốc (Java 1.6.0_26-b03-384-10M3425 với chế độ hỗn hợp Java HotSpot (TM) 64-Bit Server VM của Apple), nó phải giống như trong Eclipse (tôi đã kiểm tra) và Eclipse biên dịch với 1.6).

Hãy nhớ rằng tôi có thể thấy lớp bị thiếu không có vấn đề khi tôi loại bỏ câu lệnh gói và một số nhập ở đầu tệp java (trong tất cả các lớp học) và khi tôi chỉ cần thêm đường dẫn vào tệp .class (không truy cập chúng trong một tệp JAR).

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn,

Jason

+0

Nếu bạn đã tìm thấy một giải pháp, đặt nó trong một câu trả lời và chấp nhận nó bản thân bạn. Bằng cách đó, những người khác sẽ tìm thấy nó dễ dàng hơn. –

Trả lời

13

tôi cuối cùng đã tìm thấy vấn đề mà không thể được nhìn thấy ở trên. Vấn đề (không được ghi chép ở bất kỳ đâu) là một số lớp của tôi sử dụng các gói bên ngoài mà tôi chưa nhập vào Matlab. Tôi không có ý định sử dụng bất kỳ chức năng nào được liên kết với các gói này.

Tuy nhiên, thông báo lỗi Matlab mà nó không thể tìm thấy lớp là khó hiểu. Một thông báo lỗi chỉ ra rằng lớp không thể được sử dụng vì một số gói không được tham chiếu sẽ hữu ích nhất.

NẾU GÓI CỦA BẠN SỬ DỤNG CÁC GÓI EXTERNAL, hãy chắc chắn để nhập khẩu tất cả FILE JAR THEO MATLAB HOẶC MỘT SỐ LỚP SẼ KHÔNG Mỹ

Một mẹo mà tôi thấy hữu ích là các Matlab chức năng "nhập khẩu" sẽ không trở lại một nếu bạn nhập một gói không tồn tại với * "import java.doesnotexist. *" hoạt động tốt. Tuy nhiên, "import java.doesnotexist.aclass" sẽ không hoạt động.

Jason

+0

Cảm ơn rất nhiều vì điều đó. Đây là một sự mất hiệu lực của MATLAB. – SColvin

+1

Cảm ơn rất nhiều về Giải Đáp. Điều này thực sự đã giúp giải quyết vấn đề tương tự như tôi đã có :) –

+0

Bạn phải chấp nhận câu trả lời của mình là câu trả lời hay nhất cho câu hỏi này :) – Sadjad

1

Một lý do khác MATLAB sẽ không nhìn thấy một lớp là khi bạn biên dịch cho JRE7 và đang sử dụng MATLAB 2012b (có thể áp dụng đối với MATLAB khác phát hành).

Các symtom là lỗi cực kỳ khập khiễng

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

Giải pháp:

Compile với những lá cờ javac

-source 1.6 -target 1.6 
0

Để bổ sung cho câu trả lời chấp nhận - có một cách tốt hơn để kiểm tra xem lớp java đã được tải đúng cách, hơn thông qua lệnh import. Sử dụng chức năng whereisjavaclassloadingfrom, do Andrew Janke cung cấp trong this answer.

Không chỉ nó sẽ cho bạn biết liệu lớp được nạp, nó sẽ liệt kê tất cả lọ rằng lớp này có sẵn trong. Nó xảy ra khá thường xuyên mà lớp học của bạn được đeo mặt nạ/lu mờ bởi một lớp khác với cùng một gói/tên , nằm trong một cái lọ khác. Điều đó có thể xảy ra, ví dụ: nếu bạn cố gắng sử dụng một thư viện mới hơn một trong những thư viện được chuyển với Matlab và không đặt nó ở trên thư viện gốc trên đường dẫn lớp tĩnh java.

0

Sự cố tương tự này có thể do nhiều loại lỗi. (Tất cả chúng đều thất vọng vì bạn KHÔNG nhận được thông tin về những gì thất bại!) Câu trả lời được chấp nhận mô tả một lý do và giải pháp. Câu trả lời của Wolfgang Kuehn nhận được một vấn đề khác có thể xảy ra, mặc dù tôi đã gặp khó khăn trong việc hiểu điểm vì vậy tôi quyết định viết câu trả lời của riêng mình mở rộng về nó một cách tổng quát hơn:

Mỗi phiên bản của tàu Matlab có một số JRE cụ thể được chạy và hỗ trợ . Phiên bản khác nhau của tàu Matlab với phiên bản khác nhau của JRE. Bất kể phiên bản của Matlab và JRE liên quan bạn có, mặc dù bạn đã tuân thủ các lớp Java bên ngoài của bạn trong tệp jar có phiên bản cao hơn (và không tương thích) của trình biên dịch Java, Matlab sẽ từ chối thừa nhận các lớp mặc dù chúng nằm trong cái bình. Nếu bạn may mắn, bạn có thể sửa lỗi này bằng cách biên dịch lại Java bằng một lá cờ chỉ rõ khả năng tương thích với phiên bản Java trong thể hiện của bạn của Matlab.

Để tìm ra phiên bản của Java Matlab của bạn đang chạy, sử dụng lệnh này tại dấu nhắc lệnh Matlab:

version -java

0

tôi gặp phải cùng một vấn đề chỉ là bây giờ. Giải pháp là để cập nhật phiên bản matlab java bằng cách thiết lập một tham số envir mới được đề cập ở đây

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

Matlab hút tại thông báo lỗi

+0

Nếu có thể, sẽ tốt hơn nếu tóm tắt các bước chính ở đây, để câu trả lời này có thể đứng một mình như một giải pháp. – Adam

Các vấn đề liên quan