diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-java/src/main/java/org/apache/dolphinscheduler/plugin/task/java/JavaTask.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-java/src/main/java/org/apache/dolphinscheduler/plugin/task/java/JavaTask.java index 179b50c35c..372d0c6de6 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-java/src/main/java/org/apache/dolphinscheduler/plugin/task/java/JavaTask.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-java/src/main/java/org/apache/dolphinscheduler/plugin/task/java/JavaTask.java @@ -17,7 +17,6 @@ package org.apache.dolphinscheduler.plugin.task.java; -import static org.apache.dolphinscheduler.common.constants.Constants.FOLDER_SEPARATOR; import static org.apache.dolphinscheduler.plugin.task.java.JavaConstants.JAVA_HOME_VAR; import static org.apache.dolphinscheduler.plugin.task.java.JavaConstants.PUBLIC_CLASS_NAME_REGEX; @@ -49,7 +48,9 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -183,9 +184,8 @@ public class JavaTask extends AbstractTask { StringBuilder builder = new StringBuilder(); builder.append(getJavaCommandPath()) .append("java").append(" ") - .append(buildResourcePath()).append(" ") + .append(buildExtDirs()).append(" ") .append("-jar").append(" ") - .append(taskRequest.getExecutePath()).append(FOLDER_SEPARATOR) .append(mainJarName).append(" ") .append(javaParameters.getMainArgs().trim()).append(" ") .append(javaParameters.getJvmArgs().trim()); @@ -290,13 +290,33 @@ public class JavaTask extends AbstractTask { for (ResourceInfo info : javaParameters.getResourceFilesList()) { builder.append(JavaConstants.PATH_SEPARATOR); builder - .append(taskRequest.getExecutePath()) - .append(FOLDER_SEPARATOR) .append(resourceContext.getResourceItem(info.getResourceName()).getResourceAbsolutePathInLocal()); } return builder.toString(); } + protected String buildExtDirs() { + StringBuilder builder = new StringBuilder(); + if (javaParameters.isModulePath()) { + builder.append("--module-path"); + } else { + builder.append("-Djava.ext.dirs=\"$JAVA_HOME/jre/lib/ext"); + } + ResourceContext resourceContext = taskRequest.getResourceContext(); + Set set = new HashSet<>(); + for (ResourceInfo info : javaParameters.getResourceFilesList()) { + String absolutePathInLocal = + resourceContext.getResourceItem(info.getResourceName()).getResourceAbsolutePathInLocal(); + String extdir = absolutePathInLocal.substring(0, absolutePathInLocal.lastIndexOf(File.separator)); + if (set.add(extdir)) { + builder.append(JavaConstants.PATH_SEPARATOR); + builder.append(extdir); + } + } + builder.append("\""); + return builder.toString(); + } + /** * Constructs a shell command compiled from a Java source file * diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-java/src/test/java/org/apache/dolphinscheduler/plugin/task/java/JavaTaskTest.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-java/src/test/java/org/apache/dolphinscheduler/plugin/task/java/JavaTaskTest.java index 55756241ce..6bb5228e24 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-java/src/test/java/org/apache/dolphinscheduler/plugin/task/java/JavaTaskTest.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-java/src/test/java/org/apache/dolphinscheduler/plugin/task/java/JavaTaskTest.java @@ -84,8 +84,9 @@ public class JavaTaskTest { public void buildJarCommand() { String homeBinPath = JavaConstants.JAVA_HOME_VAR + File.separator + "bin" + File.separator; JavaTask javaTask = runJarType(); - Assertions.assertEquals(javaTask.buildJarCommand(), homeBinPath - + "java -classpath .:/tmp/dolphinscheduler/test/executepath:/tmp/dolphinscheduler/test/executepath/opt/share/jar/resource2.jar -jar /tmp/dolphinscheduler/test/executepath/opt/share/jar/main.jar -host 127.0.0.1 -port 8080 -xms:50m"); + String buildJarCommand = javaTask.buildJarCommand(); + Assertions.assertEquals(buildJarCommand, homeBinPath + + "java -Djava.ext.dirs=\"$JAVA_HOME/jre/lib/ext;opt/share/jar\" -jar /opt/share/jar/main.jar -host 127.0.0.1 -port 8080 -xms:50m"); } /** @@ -284,7 +285,7 @@ public class JavaTaskTest { taskExecutionContext.setTaskAppId("runJavaType"); ResourceContext.ResourceItem resourceItem1 = new ResourceContext.ResourceItem(); resourceItem1.setResourceAbsolutePathInStorage("/opt/share/jar/resource2.jar"); - resourceItem1.setResourceAbsolutePathInLocal("opt/share/jar/resource2.jar"); + resourceItem1.setResourceAbsolutePathInLocal("/opt/share/jar/resource2.jar"); ResourceContext.ResourceItem resourceItem2 = new ResourceContext.ResourceItem(); resourceItem2.setResourceAbsolutePathInStorage("/opt/share/jar/main.jar");