diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyResolver.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyResolver.java index 214175a2640..87d91785167 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyResolver.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyResolver.java @@ -104,6 +104,21 @@ public List load(String artifact, Collection excludes, File destPa return libs; } + public synchronized void copyLocalDependency(String srcPath, File destPath) + throws IOException { + if (StringUtils.isBlank(srcPath)) { + return; + } + + File srcFile = new File(srcPath); + File destFile = new File(destPath, srcFile.getName()); + + if (!destFile.exists() || !FileUtils.contentEquals(srcFile, destFile)) { + FileUtils.copyFile(srcFile, destFile); + logger.info("copy {} to {}", srcFile.getAbsolutePath(), destPath); + } + } + private List loadFromMvn(String artifact, Collection excludes) throws RepositoryException { Collection allExclusions = new LinkedList(); diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java index 5545e9bbb3b..2e3a0923678 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java @@ -195,10 +195,10 @@ public boolean accept(Path entry) throws IOException { Set interpreterKeys = Interpreter.registeredInterpreters.keySet(); for (String interpreterKey : interpreterKeys) { if (className - .equals(Interpreter.registeredInterpreters.get(interpreterKey) - .getClassName())) { + .equals(Interpreter.registeredInterpreters.get(interpreterKey) + .getClassName())) { Interpreter.registeredInterpreters.get(interpreterKey) - .setPath(interpreterDirString); + .setPath(interpreterDirString); logger.info("Interpreter " + interpreterKey + " found. class=" + className); cleanCl.put(interpreterDirString, ccl); } @@ -408,7 +408,6 @@ private void loadFromFile() throws IOException { } private void loadInterpreterDependencies(final InterpreterSetting setting) { - setting.setStatus(InterpreterSetting.Status.DOWNLOADING_DEPENDENCIES); interpreterSettings.put(setting.getId(), setting); synchronized (interpreterSettings) { @@ -454,6 +453,46 @@ public void run() { } } + /** + * Overwrite dependency jar under local-repo/{interpreterId} + * if jar file in original path is changed + */ + private void copyDependenciesFromLocalPath(final InterpreterSetting setting) { + setting.setStatus(InterpreterSetting.Status.DOWNLOADING_DEPENDENCIES); + interpreterSettings.put(setting.getId(), setting); + synchronized (interpreterSettings) { + final Thread t = new Thread() { + public void run() { + try { + List deps = setting.getDependencies(); + if (deps != null) { + for (Dependency d : deps) { + File destDir = new File(conf.getRelativeDir(ConfVars.ZEPPELIN_DEP_LOCALREPO)); + + int numSplits = d.getGroupArtifactVersion().split(":").length; + if (!(numSplits >= 3 && numSplits <= 6)) { + depResolver.copyLocalDependency(d.getGroupArtifactVersion(), + new File(destDir, setting.getId())); + } + } + } + setting.setStatus(InterpreterSetting.Status.READY); + } catch (Exception e) { + logger.error(String.format("Error while copying deps for interpreter group : %s," + + " go to interpreter setting page click on edit and save it again to make " + + "this interpreter work properly.", + setting.getGroup()), e); + setting.setErrorReason(e.getLocalizedMessage()); + setting.setStatus(InterpreterSetting.Status.ERROR); + } finally { + interpreterSettings.put(setting.getId(), setting); + } + } + }; + t.start(); + } + } + private void saveToFile() throws IOException { String jsonString; @@ -873,6 +912,9 @@ public void setPropertyAndRestart(String id, InterpreterOption option, Propertie public void restart(String id) { synchronized (interpreterSettings) { InterpreterSetting intpsetting = interpreterSettings.get(id); + // Check if dependency in specified path is changed + // If it did, overwrite old dependency jar with new one + copyDependenciesFromLocalPath(intpsetting); if (intpsetting != null) { stopJobAllInterpreter(intpsetting);