小G今天使用Java动态加载出现问题总结如下,见笑
问题1:
在spring boot 项目中新增一个动态加载class类使用的是tool.jar ,在eclipse上运行正常,部署到线上,就报错调用getSystemJavaCompiler的时候返回为null;
线上环境如下:
1、jdk 1.8或者OpenJDK1.8 都可以,亲自试验过,
2、部署环境容器docker或者tomcat
3、项目spring boot或spring都可以
解决方法如下:
不管使用的是openjdk还是jdk,需要全部下载到项目中,这里的全部是要包括jdk,之前只下载jre,然后把jdk中lib下tool.java放到jre下,还是报错,所以其实关移动tool不行,必须环境中需要有jdk,
总结下:下载jdk全部放到服务器上,然后把jdk中lib里面tool包放到,jre的lib里面,然后tomcat环境指到jre中(如何指向百度查询下,可以在profile环境变量中指向)
问题2: 动态加载过程总项目中pack无法import
解决方法,在使用getTask使用加载
Iterable options = Arrays.asList("-encoding", “UTF-8”, “-classpath”,classpath );
代码如下只是一段代码
String classpath ="';
URL parentClassLoaderUrl= (URLClassLoader) this.getClass().getClassLoader().getURLs();
StringBuilder sb = new StringBuilder();
for (URL url : parentClassLoaderUrl ) {
String p = url.getFile();
sb.append(p).append(File.pathSeparator);
}
//获取lib的项目路径和项目的包
classpath = sb.toString();
//javaFileObject
Iterable<String> options = Arrays.asList("-encoding", "UTF-8", "-classpath",classpath );
CompilationTask task = compiler.getTask(null, manager, null, options, null, Arrays.asList(javaFileObject));