0

I am using matlabcontrol to start matlab-sessions and everything works fine if i start it from eclipse. A new Matlab-session is opened or, if one is already open&connected, the old one is reactivated. However, I want to do this via a windows command line that is called from a python program. If I compile and export this to a .jar-file, it still works, but ONLY if an old, manually started MATLAB session is still open. my current cmd-command is simply:

java -jar StartmatlabSim.jar

If no session is open, i get the following error in the 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

EDIT: For some reason, the system seems to treat a manually started session different from a commandline-started session. Strangely, a batch file with only that single command line also works, but not if it is called from python - it must be clicked on or executed from cmd (!?!?!?). I am totally lost here....

Beeing able to run and launch my MATLAB-sessions is important for me, because I need to include it into a python-program (mosaik), which uses a cmd-command to start java.

If anybody recognizes the issue and knows a fix I would be very grateful. Thank you&regards, Robin

P.S.: The Java-code is:

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();

    }
}

Also, I included matlabcontrol-4.1.0.jar to the .jar build path and chose to package the library into the jar file during export.

R. Engel
  • 16
  • 2
  • I found a very dirty solution to my problem: First, I have python call a cmd-file with the line: `java -cp ".;matlabcontrol-4.1.0.jar" StartMatlab` Then, I use a while-loop to attempt a connection via `os.system('java -jar MatSim.jar %(addr)s Zaehlersimulator')` Usually, this produces the error above two or three times, before the next and all following attempts are successfull. (MatSim.jar is my actual java program and %(addr)s and Zaehlersimulator are its arguments) – R. Engel Mar 01 '16 at 15:28
  • I found out that the while-loop is not necessary. Matlab just needs time to start properly. A simple delay of 1-3 seconds after the starting-script does the trick. – R. Engel Mar 15 '16 at 13:50

0 Answers0