2011-12-14 88 views
9

我有一个问题让我发疯。只有 Matlab的看到一些在JAR文件Matlab无法在jar包中看到我的一些java类(不是全部)

内嵌我的课,如果我编译类的包外,并使用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 

现在,我看看包中的所有类都是公共的。这是罐子-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™64位服务器VM混合模式),它应该与Eclipse中的相​​同(我已经检查过Eclipse用1.6编译)。

请记住,我可以看到丢失的类没有问题,当我删除包装语句和一些导入在java文件的顶部(当然所有的类),当我只是将路径添加到.class文件(不能在JAR文件中访问它们)。

任何帮助将不胜感激。 谢谢,

杰森

+0

吸如果你已经找到了解决办法,把它放在一个答案,并接受它你自己。这样别人会更容易找到它。 – 2011-12-14 07:39:47

回答

13

我最终发现不能看到上面的问题。这个问题(没有记录在任何地方)是我的一些类使用了我没有导入Matlab的外部包。我没有打算使用与这些软件包相关的任何功能。

不过,Matlab找不到类的错误信息令人费解。指示该类不能被使用的错误消息,因为某些包未被引用将是最有用的。

如果程序包使用外部包,确保导入所有的JAR文件下的MATLAB或某些类不会被美国

另一个秘诀,我发现有用的是,MATLAB函数“进口”不会返回如果输入一个不存在于*“import java.doesnotexist。*”的包,则会出错。但是,“import java.doesnotexist.aclass”不起作用。

杰森

+0

非常感谢。这是matlab令人生厌的失误。 – SColvin 2013-06-13 13:34:09

+1

非常感谢Q&A。这实际上帮助解决了我遇到的类似问题:) – 2013-07-13 00:16:05

1

另一个原因MATLAB不会看到一类是当你编译JRE7和使用MATLAB 2012B(可能适用于其他MATLAB释放)。

的symtom是的极端跛脚错误

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

解决方案:

编译使用javac标志

-source 1.6 -target 1.6 
0

为了配合接受的答案 - 有一个更好的方法来检查,如果java类被加载propertly,比通过import命令。使用whereisjavaclassloadingfrom函数,由Andrew Janke在this answer提供。

不仅它会告诉你班级是否被加载,它将列出所有这个类可用的jar。经常发生这样的情况:你的班级被另一个具有相同包/名的班级掩盖/掩盖,位于不同的罐子里。这可能发生,例如如果您尝试使用比Matlab提供的库更新的库,并且不要将它放在静态Java类路径上的原始库之上。

0

同样的问题可能是由多种类型的故障造成的。 (所有这些令人沮丧,因为你没有得到关于失败的信息!)接受的答案描述了一个原因和解决方案。 Wolfgang Kuehn的答案得到了另一个可能的问题,尽管我很难理解这一点,所以我决定写一个我自己的答案,稍微更一般地扩展它:

每个版本的Matlab附带一些运行和支持的特定JRE 。 Matlab的不同版本附带不同版本的JRE。不管你使用的是哪个版本的Matlab和相关的JRE,如果你在jar文件中编译了一个更高版本(和不兼容)的Java编译器的外部Java类,Matlab将拒绝承认类,即使它们在罐子里。如果你幸运的话,你可以通过用一个标志来重新编译Java来解决这个问题,该标志指定你的Matlab实例与Java版本的兼容性。

要找出的Java的版本您的MATLAB运行,在Matlab的命令提示符下使用这个命令:

version -java

相关问题