Когда я использую 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 работает так, что ядумаю, что решение мне не подходит.
Я надеюсь, что оно может работать даже в сервлете.