当前位置: 首页 > 面试题库 >

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

滕星纬
2023-03-14
问题内容

我有一个让我发疯的问题。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(具有Apple
Inc. Java HotSpot(TM)64位服务器VM混合模式的Java
1.6.0_26-b03-384-10M3425)应与Eclipse中的相​​同(我已经检查过)和Eclipse用1.6编译)。

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

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

杰森


问题答案:

我最终发现了上面无法看到的问题。问题(在任何地方都没有记录)是我的某些类使用了未导入Matlab的外部包。我没有计划使用与这些软件包相关的任何功能。

但是,找不到该类的Matlab错误消息令人困惑。一条错误消息指出该类不能使用,因为未引用某些程序包将是最有用的。

如果您的程序包使用外部程序包,请确保在Java类路径中包括所有相关的jar文件,否则Matlab将看不到您的依赖类。

我发现有用的另一个技巧是,如果您输入了不存在的程序包,例如import java.doesnotexist.*工作正常,Matlab函数“导入”将不会返回错误。但是,import java.doesnotexist.aclass将无法正常工作。

杰森



 类似资料:
  • 当我运行(Windows 7命令行)时: C:\rest-app\src\main\java\com\mycompany\app\test>java org.testng.testng testng.xml Suite1运行的测试总数:0,失败:0,跳过:0 ================================================== 此时我的testng.xml文件如下所

  • 在尝试学习如何使用storm时。我决定编译我自己的著名WordCount拓扑实例,看看它是如何实现的。代码与示例完全相同。(https://github.com/apache/storm/blob/master/examples/storm-starter/src/jvm/org/apache/storm/starter/WordCountTopology.java) 然而,每当我尝试运行jar时

  • 问题内容: 我需要在Matlab中运行Java .jar文件。 我们将文件称为MyJar.jar,如果有帮助,我正在运行Java 1.8.0_121-b13。 我尝试了不同的解决方案,并收到了这些相应的错误 我已经设置了javaclasspath:C:\ My \ Java \ Class \ Path \ To \ MyJar.jar(即使它没有任何帮助) 我什至已经准备好编辑classpath

  • 表-col_pk、col1、col2、col3、col4、col_date_更新 此表中有些行的col2和col3列值重复。我想保持那些列的列更新为最新(max)。 如: 预期结果:

  • 我正在开发一个使用反射的库,我想操纵给定KClass的所有属性/函数。 使用属性,我可以操作所有可访问的成员(根据留档),即:公共、内部和受保护的字段、属性和函数。但是我看不到私有的。 使用Java反射,我可以使用,同样,我可以看到使用类的私有方法。getDeclaredMethods()。 有没有办法使用kotlin反射API来实现这一点?

  • 我试图在命令行中使用依赖项运行我的java类。我使用IntelliJ IDEA13从我的项目中构建工件。我有一个名为“main.java”的主类,在构建之后,我得到了一个类似MyTest.jar的jar文件。java的全限定名类似于“test.main” 但是当我试图使用“java mytest.jar”运行它时,它抱怨找不到主类mytest.jar。 ----Main.class --META-