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

我有一个让我疯狂的问题。 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的外部包。 我没有计划使用与这些软件包相关的任何function。

尽管如此,Matlab错误信息表明它无法找到类令人费解。 由于某些包未被引用而指示无法使用该类的错误消息将是最有用的。

如果您的包装使用外部包装,请确保在MATLAB下输入所有JAR文件或某些类别不会是美国

我发现另一个有用的提示是,如果你输入一个不存在* * import java.doesnotexist。*的包,Matlab函数“import”将不会返回错误。 但是,“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将拒绝承认类,即使它们在jar子。 如果幸运的话,可以通过使用一个标志重新编译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糟透了消息