在用Liteflow规则引擎中,用到了python脚本,发现ide启动时脚本正常运行,到了线上环境就报异常。经过调试发现 scriptEngineManager.getEngineByName("python");获取到的engine为null。
public ScriptExecutor init() throws ScriptException {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
scriptEngine = scriptEngineManager.getEngineByName(scriptEngineName());
if (scriptEngine == null) {
log.error("load scriptEngine[{}] error: scriptEngine is null!", scriptEngineName());
throw new ScriptException("load scriptEngine[" + scriptEngineName() + "] error, scriptEngine is null !");
}
return this;
}
正好刚注册了个GhatGpt,于是直接来问一下:
根据ChatGpt提示尝试新增python.home,指定 jython-standalone-2.7.3.jar的绝对路径可以解决。
由于应用打好Jar包里面已经有了jython-standalone依赖,不想再在部署的时候额外拿个jar包进去,所以又做了点改动:应用启动时,判断当jar包运行时,从BOOT-INF/lib下将jython拷贝出来,并设置python.home:
@Slf4j @Component public class ApplicationInitRunner implements CommandLineRunner { @Value("${python.home:}") private String pythonHome; @Override public void run(String... args) { if (StringUtils.isNotBlank(pythonHome)) { //复制jython包到python home boolean copyed = JarExtractor.copyJython2PythonHome(pythonHome); if(copyed){ System.setProperty("python.import.site","false"); System.setProperty("python.home",pythonHome); } } } }
以下拷贝jar包代码片段:
final static String jythonName = "jython-standalone-2.7.3.jar";
/**
* 判断是否从jar包运行
* @return
*/
public static boolean isRunningFromJar() {
URL resource = JarExtractor.class.getResource("");
return resource != null && resource.getProtocol().equals("jar");
}
public static boolean copyJython2PythonHome(String pythonHome){
return copyJar(jythonName,pythonHome);
}
/**
* 拷贝包里的依赖到指定目录
* @param jarName
* @param targetPath
*/
public static boolean copyJar(String jarName,String targetPath){
if(isRunningFromJar()){
ClassLoader defaultClassLoader = ClassUtils.getDefaultClassLoader();
try (InputStream inputStream = defaultClassLoader.getResourceAsStream("BOOT-INF/lib/"+jarName)) {
if(inputStream != null){
log.info("CopyJar:{} -> {}",jarName,targetPath);
write2File(inputStream,targetPath);
return true;
}
} catch (Exception e) {
log.error("jar {} -> {} copy error: {}",jarName,e.getMessage());
}
}
return false;
}
转载请注明:左手代码右手诗 » java环境运行python脚本:Cannot invoke "javax.script.ScriptEngine.getFactory()" because "scriptEngine" is null