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