簡體   English   中英

Matlab在jar包中看不到我的一些java類(不是全部)

[英]Matlab cannot see some of my java classes (not all) in jar package

我有一個讓我瘋狂的問題。 Matlab只看到我的一些類嵌入在JAR文件中

如果我在一個包之外編譯類並使用javaaddpath在Matlab中添加該類的路徑,我沒有遇到任何問題

當我在一個包中編譯該類然后嘗試在Matlab下訪問它時,我遇到了問題。 下面是一些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

現在,我查看包中,所有類都是公開的。 這是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

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

我在OSX上運行Matlab。 我嘗試過使用Matlab 7.7.0.471(R2008b)和7.11.0.584(R2010b)並遇到同樣的問題。 兩個Matlab都使用本機OSX Java(Java 1.6.0_26-b03-384-10M3425與Apple Inc. Java HotSpot(TM)64位服務器VM混合模式),它應該與Eclipse中的相​​同(我已經檢查過)和Eclipse編譯1.6)。

請記住,當我刪除package語句並在java文件的頂部(當然在所有類中)導入一些導入時,我可以看到缺少的類沒有問題,當我只是添加.class文件的路徑時(不能訪問它們)在JAR文件中)。

任何幫助將不勝感激。 謝謝,

賈森

我最終發現了上面無法看到的問題。 問題(沒有在任何地方記錄)是我的一些類使用我沒有導入到Matlab的外部包。 我沒有計划使用與這些軟件包相關的任何功能。

盡管如此,它找不到類的Matlab錯誤信息令人費解。 指示由於某些包未被引用而無法使用該類的錯誤消息將是最有用的。

如果您的包使用外部包,請確保在java類路徑中包含所有相關的jar文件,否則Matlab將看不到您的依賴類。

我發現另一個有用的提示是,如果輸入一個不存在的包,Matlab函數“import”將不會返回錯誤,例如import java.doesnotexist.*工作正常。 但是, import java.doesnotexist.aclass將不起作用。

賈森

MATLAB不會看到類的另一個原因是編譯JRE7並使用MATLAB 2012b時(可能適用於其他MATLAB版本)。

symtom是極端蹩腳的錯誤

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

解:

使用javac標志進行編譯

-source 1.6 -target 1.6 

為了補充已接受的答案 - 有一種更好的方法來檢查java類是否被加載屬性,而不是通過import命令。 這個答案中使用Andrew Janke提供的whereisjavaclassloadingfrom function。

它不僅會告訴你是否加載了這個類,它還會列出這個類可用的所有 jar。它經常發生在你的類被另一個具有相同包/名稱的類掩蓋/遮蓋,位於不同的jar中。 這可能發生,例如,如果您嘗試使用比Matlab附帶的庫更新的庫,並且不要將它放在靜態java類路徑上的原始庫之上。

多種類型的故障都可能導致同樣的問題。 (所有這些令人沮喪,因為你沒有得到關於失敗的信息!)接受的答案描述了一個原因和解決方案。 Wolfgang Kuehn的回答得到了另一個可能的問題,雖然我很難理解這一點,所以我決定寫一些自己的答案,稍微擴展一下:

每個版本的Matlab都附帶一些運行和支持的特定JRE。 不同版本的Matlab附帶不同版本的JRE。 無論您使用哪個版本的Matlab和相關的JRE,如果您使用更高(且不兼容)的Java編譯器版本來編寫jar文件中的外部Java類,Matlab將拒絕承認類,即使它們在罐子。 如果你很幸運,你可以通過重新編譯Java來解決這個問題,該標志指定了與你的Matlab實例中Java版本的兼容性。

要找出Matlab正在運行的Java版本,請在Matlab命令提示符下使用此命令:

version -java

我剛才遇到了同樣的問題。 解決方案是通過設置此處提到的新envir參數來更新matlab java版本

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

Matlab糟透了消息

發生這種情況的另一個原因是需要一些類在Matlab的靜態類路徑中。

在這種情況下,如上所述,在通過javaaddpath向動態類路徑添加更多jar之后,我的一個java類在Matlab2017b中完美運行。 這阻止了java.lang.ClassNotFoundException的發生。

相同的方法在Matlab2019a中失敗了。

現在我想通過簡單地將包含我的應用程序所需的所有jar的'uber'jar添加到classpath.txt文件來解決我的問題,如下所示:

   # DO NOT MODIFY THIS FILE.  IT IS AN AUTOGENERATED FILE.

/Users/andyhueni/Desktop/SPECCHIO_new_build2/SPECCHIO.app/Contents/Java/specchio-client.jar

$matlabroot/java/patch
$matlabroot/java/jar/jmi.jar
...

classpath.txt(文件的頂部或末尾)內的位置似乎並不重要。

修改classpath.txt可能不適用於所有用戶,但是這些優秀的信息源中列出了解決方法: https//undocumentedmatlab.com/blog/static-java-classpath-hacks

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM