diff --git a/serving/docker/scripts/install_djl_serving.sh b/serving/docker/scripts/install_djl_serving.sh index b7b842cee..45bf62da7 100755 --- a/serving/docker/scripts/install_djl_serving.sh +++ b/serving/docker/scripts/install_djl_serving.sh @@ -23,8 +23,7 @@ if [ -z "$PYTORCH_JNI" ]; then dpkg -i djl-serving_all.deb rm djl-serving_all.deb - cp /usr/local/djl-serving-*/conf/log4j2.xml /opt/djl/conf/ - cp -r /usr/local/djl-serving-*/plugins /opt/djl/plugins + mkdir -p /opt/djl/plugins else if [[ ! "$DJL_VERSION" == *SNAPSHOT ]]; then djl-serving -i ai.djl.pytorch:pytorch-jni:${PYTORCH_JNI}-${DJL_VERSION} diff --git a/serving/src/main/java/ai/djl/serving/plugins/FolderScanPluginManager.java b/serving/src/main/java/ai/djl/serving/plugins/FolderScanPluginManager.java index f75ff3d24..96ee81948 100644 --- a/serving/src/main/java/ai/djl/serving/plugins/FolderScanPluginManager.java +++ b/serving/src/main/java/ai/djl/serving/plugins/FolderScanPluginManager.java @@ -32,8 +32,11 @@ import java.nio.file.Path; import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -200,29 +203,30 @@ public Set findImplementations(Class pluginInterface) { } private URL[] listPluginJars() throws IOException { - Path pluginsFolder = configManager.getPluginFolder(); - if (pluginsFolder == null || !Files.isDirectory(pluginsFolder)) { - logger.info("plug-in folder not exists:{}", pluginsFolder); - return new URL[0]; - } - logger.info("scanning in plug-in folder :{}", pluginsFolder); - - try (Stream stream = Files.walk(pluginsFolder, Integer.MAX_VALUE)) { - return stream.filter(file -> !Files.isDirectory(file)) - .filter(file -> file.getFileName() != null) - .filter(file -> file.getFileName().toString().toLowerCase().endsWith(".jar")) - .map(Path::toUri) - .map( - t -> { - try { - return t.toURL(); - } catch (MalformedURLException e) { - logger.error(e.getMessage(), e); + List pluginsFolders = configManager.getPluginFolder(); + List ret = new ArrayList<>(); + for (Path dir : pluginsFolders) { + if (dir == null || !Files.isDirectory(dir)) { + logger.info("plug-in folder not exists:{}", dir); + continue; + } + logger.info("scanning in plug-in folder :{}", dir); + + try (Stream stream = Files.walk(dir)) { + stream.forEach( + f -> { + String name = f.toFile().getName().toLowerCase(Locale.ROOT); + try { + if (Files.isRegularFile(f) && name.endsWith(".jar")) { + ret.add(f.toUri().toURL()); } - return null; - }) - .toArray(URL[]::new); + } catch (MalformedURLException e) { + logger.error("scan plugins folder failed", e); + } + }); + } } + return ret.toArray(new URL[0]); } /** diff --git a/serving/src/main/java/ai/djl/serving/util/ConfigManager.java b/serving/src/main/java/ai/djl/serving/util/ConfigManager.java index 4f4f2db46..41bfd7543 100644 --- a/serving/src/main/java/ai/djl/serving/util/ConfigManager.java +++ b/serving/src/main/java/ai/djl/serving/util/ConfigManager.java @@ -40,6 +40,7 @@ import java.security.cert.X509Certificate; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; +import java.util.ArrayList; import java.util.Arrays; import java.util.Base64; import java.util.Collection; @@ -302,10 +303,21 @@ public String getCorsAllowedHeaders() { /** * return the folder where the model search for plugins. * - * @return the configured plugin folder or the default folder. + * @return the configured plugin folder or the default folder + * @throws IOException if failed to resolve plugin folder */ - public Path getPluginFolder() { - return getPathProperty(PLUGIN_FOLDER, "plugins"); + public List getPluginFolder() throws IOException { + List list = new ArrayList<>(); + Path plugin = getPathProperty(PLUGIN_FOLDER, "plugins"); + list.add(plugin); + String appHome = Utils.getenv("APP_HOME"); + if (appHome != null) { + Path path = Paths.get(appHome, "plugins"); + if (!Files.isSameFile(path, plugin)) { + list.add(path); + } + } + return list; } /**