Как исправить 'java.lang.ClassNotFoundException: com.mathworks.toolbox.javabuilder.internal.MWComponentInstance' в Java? - PullRequest
0 голосов
/ 11 апреля 2019

Когда я использую URLClassLoader для отображения jar, созданного Matlab, консоль показывает:

'java.lang.ClassNotFoundException: com.mathworks.toolbox.javabuilder.internal.MWComponentInstance',

На самом деле, когда я использую отражение в другом Сервлете:

public class DrawServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.getWriter().append("Served at: 111").append(request.getContextPath());

        try {
            PlotClass p = new PlotClass();
            p.plotTest(); 
            //request.getRequestDispatcher("/in.jsp").forward(request,response);
        } catch (MWException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

, оно работает правильно, но оно используется, когда вы знаете имя Класса.Я хочу выгрузить jar и одновременно выгрузить его имя пакета, имя класса, имя метода, затем использовать URLClassLoader, чтобы найти класс, и я попытался использовать URLClassLoader, чтобы отразить jar в тестовом классе, а не в Servlet, простоJava-приложение, оно работает тоже

public class MyClassLoader  {
    public static void main(String[] args) throws Exception {
        File file = new File("C:/Users/Administrator/Desktop/plotTest/for_redistribution_files_only/plotTest.jar");
        URL url = file.toURI().toURL();
        URLClassLoader loader = new URLClassLoader(new URL[]{url});
        Class<?> cls = loader.loadClass("plotTest.PlotClass");
        Method[] m2=cls.getDeclaredMethods();
        for(Method m:m2){
            System.out.println(m);
        }
        Object[] a={},b={2};
        Method m1=cls.getDeclaredMethod("plotTest",Object[].class);
        System.out.println(cls);
        Object obj=cls.newInstance();
        m1.setAccessible(true);
        m1.invoke(obj,(Object)a);

    }
}

, но когда я использую этот код в сервлете, он не работает.

if("operate.mat".equals(url1)) {
                System.out.println("run class in jar");
                int matNum = Integer.parseInt(request.getParameter("matNum"));
                Matlab e = new Matlab();
                System.out.println(request.getParameter("matNum"));
                Result result = service.findAll();
                List<Matlab> mat=(List<Matlab>) result.getData();
                System.out.println(mat.get(0));
                String str=mat.get(0).toString();
                int i1=str.indexOf(",");
                str=str.substring(i1+1);
                i1=str.indexOf("=");
                int i2=str.indexOf(",");
                String matPackageName=str.substring(i1+1, i2);
                str=str.substring(i2+1);
                System.out.println(matPackageName);
                System.out.println(str);
                i1=str.indexOf("=");
                i2=str.indexOf(",");
                String matDesc=str.substring(i1+1, i2);
                str=str.substring(i2+1);
                System.out.println(matDesc);
                System.out.println(str);
                i1=str.indexOf("=");
                i2=str.indexOf(",");
                String matClass=str.substring(i1+1, i2);
                str=str.substring(i2+1);
                System.out.println(matClass);
                System.out.println(str);
                i1=str.indexOf("=");
                i2=str.indexOf("]");
                String matMethod=str.substring(i1+1, i2);
                str=str.substring(i2+1);
                System.out.println(matMethod);
                System.out.println(str);
                try{
                    File file = new File("E:/javaworkspace/demo/WebContent/WEB-INF/lib/plotTest.jar");
                    URL url = file.toURI().toURL();
                    URLClassLoader loader = new URLClassLoader(new URL[]{url});
                    Class<?> cls = loader.loadClass("plotTest.PlotClass");
                    Method[] m2=cls.getDeclaredMethods();
                    for(Method m:m2){
                        System.out.println(m);
                    }
                    Object[] a={},b={2};
                    Method m1=cls.getDeclaredMethod("plotTest",Object[].class);
                    System.out.println(cls);
                    Object obj=cls.newInstance();
                    m1.setAccessible(true);
                    m1.invoke(obj,(Object)a);

                    } 
                catch(Exception e1){

                }
            }

это то, что консольное шоу, начальная частьЯ получаю имя пакета, имя класса, имя метода для подготовки к отражению.

Matlab [matNum=1, matPackageName=plotTest, matDesc=y=x^2, matClass=PlotClass, matMethod=PlotTest]
plotTest
 matDesc=y=x^2, matClass=PlotClass, matMethod=PlotTest]
y=x^2
 matClass=PlotClass, matMethod=PlotTest]
PlotClass
 matMethod=PlotTest]
PlotTest

April 11, 2019 9:48:21 上午 org.apache.catalina.core.StandardWrapperValve invoke
: Servlet.service() for servlet [com.shine.controller.matlab.MatlabServlet] in context with path [/demo] threw exception [Servlet execution threw an exception] with root cause
java.lang.ClassNotFoundException: com.mathworks.toolbox.javabuilder.internal.MWComponentInstance
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at com.shine.controller.matlab.MatlabServlet.service(MatlabServlet.java:140)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:534)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

, и я прочитал этот ответ Возвращаемое значение из файла jar, созданного из Matlab , но мой jar работает так, что ядумаю, что решение мне не подходит.

Я надеюсь, что оно может работать даже в сервлете.

...