我正在使用matlabcontrol来启动matlab会话,如果我从eclipse启动它,一切正常。打开一个新的Matlab会话,或者如果一个已经打开和连接,则重新激活旧的会话。 但是,我想通过从python程序调用的Windows命令行来完成此操作。 如果我编译并将其导出到.jar文件,它仍然有效,但只有在旧的,手动启动的MATLAB会话仍然打开时。 我当前的cmd命令只是:
java -jar StartmatlabSim.jar
如果没有打开会话,我会在cmd中收到以下错误:
C:\Users\rEngel\Desktop>java -jar StartmatlabSim.jar
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: matlabcontrol.MatlabConnectionException: Support code location could not be determined. Could not ge
t path from URI location.
URI Location: jar:rsrc:matlabcontrol-4.1.0.jar!/
URL Location: jar:rsrc:matlabcontrol-4.1.0.jar!/
Code Source: (jar:rsrc:matlabcontrol-4.1.0.jar!/ <no signer certificates>)
Protection Domain: ProtectionDomain (jar:rsrc:matlabcontrol-4.1.0.jar!/ <no signer certificates>)
java.net.URLClassLoader@677327b6
<no principals>
java.security.Permissions@27973e9b (
("java.security.AllPermission" "<all permissions>" "<all actions>")
)
Class Loader: java.net.URLClassLoader@677327b6
Class Loader Class: class java.net.URLClassLoader
at matlabcontrol.Configuration.getSupportCodeLocation(Configuration.java:295)
at matlabcontrol.RemoteMatlabProxyFactory.createProcess(RemoteMatlabProxyFactory.java:289)
at matlabcontrol.RemoteMatlabProxyFactory.requestProxy(RemoteMatlabProxyFactory.java:125)
at matlabcontrol.RemoteMatlabProxyFactory.getProxy(RemoteMatlabProxyFactory.java:144)
at matlabcontrol.MatlabProxyFactory.getProxy(MatlabProxyFactory.java:81)
at StartMatlab.main(StartMatlab.java:14)
... 5 more
编辑:出于某种原因,系统似乎将手动启动的会话视为与命令行启动的会话不同。奇怪的是,只有一个命令行的批处理文件也可以工作,但是如果从python调用它也不行 - 必须点击或执行cmd(!?!?!?)。 我完全迷失在这里......
Beeing能够运行并启动我的MATLAB会话对我来说非常重要,因为我需要将它包含在python程序(mosaik)中,该程序使用cmd命令启动java。
如果有人认识到这个问题并知道修复,我将非常感激。 谢谢你和问候, 罗宾
P.S .: Java代码是:
import matlabcontrol.*;
public class StartMatlab {
public static void main(String[] args)
throws MatlabConnectionException, MatlabInvocationException
{
// create proxy
MatlabProxyFactoryOptions options = new MatlabProxyFactoryOptions.Builder()
.setUsePreviouslyControlledSession(true).setHidden(true)
.build();
MatlabProxyFactory factory = new MatlabProxyFactory(options);
MatlabProxy proxy = factory.getProxy();
// call builtin function
proxy.eval("disp('hello world')");
// close connection
proxy.disconnect();
}
}
此外,我将matlabcontrol-4.1.0.jar包含在.jar构建路径中,并选择在导出期间将库打包到jar文件中。