我有一个让我疯狂的问题.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
Run Code Online (Sandbox Code Playgroud)
现在,我查看包中,所有类都是公开的.这是结果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
Run Code Online (Sandbox Code Playgroud)
以下 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; …Run Code Online (Sandbox Code Playgroud) MATLAB配置为在搜索用户可修改的动态路径之前搜索其静态java类路径.不幸的是,静态路径包含相当多的非常旧的公共库,因此如果您尝试使用新版本,最终可能会加载错误的实现并获得错误.
例如,静态路径包含google-collections.jar的旧副本,该副本长期以来被Google的guava库取代,并且具有一些相同的类名(例如com.google.common.base.Objects).因此,如果你调用一个使用这种类之一的新方法的Guava方法,你最终会得到令人惊讶的NoSuchMethodErrors,因为首先找到了google-collections jar.
从R2012b开始,MATLAB允许您通过将javaclasspath.txt文件放在首选项文件夹中来指定要添加到静态路径的其他jar,但是将jar添加到路径的末尾,并且不允许您覆盖生成的jar进入MATLAB.
那么最好的解决方法是什么?
我试图动态地将类加载到组件中.我正在使用文件选择器来选择将要加载的.JAR文件,然后使用选项窗格来获取类的名称.
我已经在互联网上搜索如何将java文件转换为URL以便在URLClassLoader中加载它我已经提出:
File myFile = filechooser.getSelectedFile();
String className = JOptionPane.showInputDialog(
this, "Class Name:", "Class Name", JOptionPane.QUESTION_MESSAGE);
URL myUrl= null;
try {
myUrl = myFile.toURL();
} catch (MalformedURLException e) {
}
URLClassLoader loader = new URLClassLoader(myUrl);
loader.loadClass(className);
Run Code Online (Sandbox Code Playgroud)
我现在收到一个'无法找到符号'错误,将URL加载到URLClassLoader中
我想使用apache httpclient与webservices进行交互.具体来说,我正在使用 http://mirror.arcor-online.net/www.apache.org//httpcomponents/httpclient/binary/httpcomponents-client-4.3-bin.zip
所以在MATLAB中我将所有包含的jar加载到javaclasspath中然后我可以创建到client-instance来使用:
在MATLAB 2007b和2011b中(这些是我的版本):
client = org.apache.http.impl.client.HttpClients.createDefault()
client =
org.apache.http.impl.client.InternalHttpClient@1e89831
Run Code Online (Sandbox Code Playgroud)
在2012b:
>> client = org.apache.http.impl.client.HttpClients.createDefault()
Java exception occurred:
java.lang.NoSuchFieldError: INSTANCE
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56)
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:72)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:84)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:59)
at
org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:487)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:147)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:136)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:112)
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:710)
at org.apache.http.impl.client.HttpClients.createDefault(HttpClients.java:58)
>> client = org.apache.http.impl.client.HttpClients.createDefault()
Java exception occurred:
java.lang.NoClassDefFoundError: Could not initialize class org.apache.http.impl.conn.ManagedHttpClientConnectionFactory
at
org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:487)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:147)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:136)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:112)
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:710)
at org.apache.http.impl.client.HttpClients.createDefault(HttpClients.java:58)
Run Code Online (Sandbox Code Playgroud)
这真是让我烦恼,因为2011b和2012b中的代码是相同的,所有jar都被加载,并且MATLAB中的两个Java版本也是相同的(1.6.0_17-b04).所以我真的不明白为什么课程在2012b中变得无法加载.
我尝试使用matlab类加载器 - 但这让我更加困惑:
>> jloader = com.mathworks.jmi.ClassLoaderManager.getClassLoaderManager();
>> …Run Code Online (Sandbox Code Playgroud)