This is an automated email from the ASF dual-hosted git repository.
fanjia pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git
The following commit(s) were added to refs/heads/dev by this push:
new fc393904c4 [Hotfix][Core] Fix the NullPointException for the json
config of the job without pluginname (#6815)
fc393904c4 is described below
commit fc393904c4174fef999eaf0965a8a3a8d0859a09
Author: dailai <[email protected]>
AuthorDate: Sat May 11 14:18:38 2024 +0800
[Hotfix][Core] Fix the NullPointException for the json config of the job
without pluginname (#6815)
---
.../core/starter/flink/FlinkCommandArgsTest.java | 66 +++++++++++++++++++
.../flink/multitable/MultiTableSinkTest.java | 2 +
.../test/resources/config/fake_to_inmemory.json | 28 ++++++++
.../fake_to_inmemory_without_pluginname.json | 26 ++++++++
.../core/starter/spark/SparkCommandArgsTest.java | 76 ++++++++++++++++++++++
.../spark/multitable/MultiTableSinkTest.java | 2 +
.../test/resources/config/fake_to_inmemory.json | 32 +++++++++
.../fake_to_inmemory_without_pluginname.json | 30 +++++++++
.../seatunnel/args/ClientCommandArgsTest.java | 69 ++++++++++++++++++++
.../seatunnel/multitable/MultiTableSinkTest.java | 2 +
.../test/resources/config/fake_to_inmemory.json | 28 ++++++++
.../fake_to_inmemory_without_pluginname.json | 26 ++++++++
.../src/test/resources/junit-platform.properties | 20 ++++++
.../engine/core/parse/ConfigParserUtil.java | 10 ++-
14 files changed, 416 insertions(+), 1 deletion(-)
diff --git
a/seatunnel-core/seatunnel-flink-starter/seatunnel-flink-15-starter/src/test/java/org/apache/seatunnel/core/starter/flink/FlinkCommandArgsTest.java
b/seatunnel-core/seatunnel-flink-starter/seatunnel-flink-15-starter/src/test/java/org/apache/seatunnel/core/starter/flink/FlinkCommandArgsTest.java
new file mode 100644
index 0000000000..050a1a2636
--- /dev/null
+++
b/seatunnel-core/seatunnel-flink-starter/seatunnel-flink-15-starter/src/test/java/org/apache/seatunnel/core/starter/flink/FlinkCommandArgsTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.core.starter.flink;
+
+import org.apache.seatunnel.shade.com.typesafe.config.ConfigException;
+
+import org.apache.seatunnel.core.starter.SeaTunnel;
+import org.apache.seatunnel.core.starter.flink.args.FlinkCommandArgs;
+import org.apache.seatunnel.core.starter.flink.multitable.MultiTableSinkTest;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.io.FileNotFoundException;
+import java.net.URISyntaxException;
+
+import static org.apache.seatunnel.api.common.CommonOptions.PLUGIN_NAME;
+
+public class FlinkCommandArgsTest {
+ @Test
+ public void testExecuteClientCommandArgsWithPluginName()
+ throws FileNotFoundException, URISyntaxException {
+ String configurePath = "/config/fake_to_inmemory.json";
+ String configFile =
MultiTableSinkTest.getTestConfigFile(configurePath);
+ FlinkCommandArgs flinkCommandArgs = buildFlinkCommandArgs(configFile);
+ Assertions.assertDoesNotThrow(() ->
SeaTunnel.run(flinkCommandArgs.buildCommand()));
+ }
+
+ @Test
+ public void testExecuteClientCommandArgsWithoutPluginName()
+ throws FileNotFoundException, URISyntaxException {
+ String configurePath =
"/config/fake_to_inmemory_without_pluginname.json";
+ String configFile =
MultiTableSinkTest.getTestConfigFile(configurePath);
+ FlinkCommandArgs flinkCommandArgs = buildFlinkCommandArgs(configFile);
+ ConfigException configException =
+ Assertions.assertThrows(
+ ConfigException.class,
+ () -> SeaTunnel.run(flinkCommandArgs.buildCommand()));
+ Assertions.assertEquals(
+ String.format("No configuration setting found for key '%s'",
PLUGIN_NAME.key()),
+ configException.getMessage());
+ }
+
+ private static FlinkCommandArgs buildFlinkCommandArgs(String configFile) {
+ FlinkCommandArgs flinkCommandArgs = new FlinkCommandArgs();
+ flinkCommandArgs.setConfigFile(configFile);
+ flinkCommandArgs.setCheckConfig(false);
+ flinkCommandArgs.setVariables(null);
+ return flinkCommandArgs;
+ }
+}
diff --git
a/seatunnel-core/seatunnel-flink-starter/seatunnel-flink-15-starter/src/test/java/org/apache/seatunnel/core/starter/flink/multitable/MultiTableSinkTest.java
b/seatunnel-core/seatunnel-flink-starter/seatunnel-flink-15-starter/src/test/java/org/apache/seatunnel/core/starter/flink/multitable/MultiTableSinkTest.java
index 6ca59d8ee9..1cd1787883 100644
---
a/seatunnel-core/seatunnel-flink-starter/seatunnel-flink-15-starter/src/test/java/org/apache/seatunnel/core/starter/flink/multitable/MultiTableSinkTest.java
+++
b/seatunnel-core/seatunnel-flink-starter/seatunnel-flink-15-starter/src/test/java/org/apache/seatunnel/core/starter/flink/multitable/MultiTableSinkTest.java
@@ -24,6 +24,7 @@ import
org.apache.seatunnel.e2e.sink.inmemory.InMemoryAggregatedCommitter;
import org.apache.seatunnel.e2e.sink.inmemory.InMemorySinkWriter;
import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import java.io.FileNotFoundException;
@@ -34,6 +35,7 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+@Order(1)
public class MultiTableSinkTest {
@Test
diff --git
a/seatunnel-core/seatunnel-flink-starter/seatunnel-flink-15-starter/src/test/resources/config/fake_to_inmemory.json
b/seatunnel-core/seatunnel-flink-starter/seatunnel-flink-15-starter/src/test/resources/config/fake_to_inmemory.json
new file mode 100644
index 0000000000..28b79bfe7e
--- /dev/null
+++
b/seatunnel-core/seatunnel-flink-starter/seatunnel-flink-15-starter/src/test/resources/config/fake_to_inmemory.json
@@ -0,0 +1,28 @@
+{
+ "env": {
+ "parallelism": 4,
+ "job.mode": "BATCH"
+ },
+ "source": [
+ {
+ "plugin_name": "FakeSource",
+ "result_table_name": "fake_to_inmemory_wtih_flink",
+ "row.num": 10,
+ "schema": {
+ "fields": {
+ "name": "string",
+ "age": "int",
+ "card": "int"
+ }
+ }
+ }
+ ],
+ "transform": [
+ ],
+ "sink": [
+ {
+ "plugin_name": "InMemory",
+ "source_table_name": "fake_to_inmemory_wtih_flink"
+ }
+ ]
+}
diff --git
a/seatunnel-core/seatunnel-flink-starter/seatunnel-flink-15-starter/src/test/resources/config/fake_to_inmemory_without_pluginname.json
b/seatunnel-core/seatunnel-flink-starter/seatunnel-flink-15-starter/src/test/resources/config/fake_to_inmemory_without_pluginname.json
new file mode 100644
index 0000000000..f35ee0c364
--- /dev/null
+++
b/seatunnel-core/seatunnel-flink-starter/seatunnel-flink-15-starter/src/test/resources/config/fake_to_inmemory_without_pluginname.json
@@ -0,0 +1,26 @@
+{
+ "env": {
+ "parallelism": 4,
+ "job.mode": "BATCH"
+ },
+ "source": [
+ {
+ "result_table_name": "fake_to_inmemory_wtih_flink",
+ "row.num": 10,
+ "schema": {
+ "fields": {
+ "name": "string",
+ "age": "int",
+ "card": "int"
+ }
+ }
+ }
+ ],
+ "transform": [
+ ],
+ "sink": [
+ {
+ "source_table_name": "fake_to_inmemory_wtih_flink"
+ }
+ ]
+}
diff --git
a/seatunnel-core/seatunnel-spark-starter/seatunnel-spark-3-starter/src/test/java/org/apache/seatunnel/core/starter/spark/SparkCommandArgsTest.java
b/seatunnel-core/seatunnel-spark-starter/seatunnel-spark-3-starter/src/test/java/org/apache/seatunnel/core/starter/spark/SparkCommandArgsTest.java
new file mode 100644
index 0000000000..da997e3355
--- /dev/null
+++
b/seatunnel-core/seatunnel-spark-starter/seatunnel-spark-3-starter/src/test/java/org/apache/seatunnel/core/starter/spark/SparkCommandArgsTest.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.core.starter.spark;
+
+import org.apache.seatunnel.common.config.DeployMode;
+import org.apache.seatunnel.core.starter.SeaTunnel;
+import org.apache.seatunnel.core.starter.exception.CommandExecuteException;
+import org.apache.seatunnel.core.starter.spark.args.SparkCommandArgs;
+import org.apache.seatunnel.core.starter.spark.multitable.MultiTableSinkTest;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledOnJre;
+import org.junit.jupiter.api.condition.JRE;
+
+import java.io.FileNotFoundException;
+import java.net.URISyntaxException;
+
+import static org.apache.seatunnel.api.common.CommonOptions.PLUGIN_NAME;
+
+@DisabledOnJre(
+ value = JRE.JAVA_11,
+ disabledReason =
+ "We should update apache common lang3 version to 3.8 to avoid
NPE, "
+ + "see
https://github.com/apache/commons-lang/commit/50ce8c44e1601acffa39f5568f0fc140aade0564")
+public class SparkCommandArgsTest {
+ @Test
+ public void testExecuteClientCommandArgsWithPluginName()
+ throws FileNotFoundException, URISyntaxException {
+ String configurePath = "/config/fake_to_inmemory.json";
+ String configFile =
MultiTableSinkTest.getTestConfigFile(configurePath);
+ SparkCommandArgs sparkCommandArgs = buildSparkCommands(configFile);
+ sparkCommandArgs.setDeployMode(DeployMode.CLIENT);
+ Assertions.assertDoesNotThrow(() ->
SeaTunnel.run(sparkCommandArgs.buildCommand()));
+ }
+
+ @Test
+ public void testExecuteClientCommandArgsWithoutPluginName()
+ throws FileNotFoundException, URISyntaxException {
+ String configurePath =
"/config/fake_to_inmemory_without_pluginname.json";
+ String configFile =
MultiTableSinkTest.getTestConfigFile(configurePath);
+ SparkCommandArgs sparkCommandArgs = buildSparkCommands(configFile);
+ sparkCommandArgs.setDeployMode(DeployMode.CLIENT);
+ CommandExecuteException commandExecuteException =
+ Assertions.assertThrows(
+ CommandExecuteException.class,
+ () -> SeaTunnel.run(sparkCommandArgs.buildCommand()));
+ Assertions.assertEquals(
+ String.format("No configuration setting found for key '%s'",
PLUGIN_NAME.key()),
+ commandExecuteException.getCause().getMessage());
+ }
+
+ private static SparkCommandArgs buildSparkCommands(String configFile) {
+ SparkCommandArgs sparkCommandArgs = new SparkCommandArgs();
+ sparkCommandArgs.setConfigFile(configFile);
+ sparkCommandArgs.setCheckConfig(false);
+ sparkCommandArgs.setVariables(null);
+ sparkCommandArgs.setDeployMode(DeployMode.CLIENT);
+ return sparkCommandArgs;
+ }
+}
diff --git
a/seatunnel-core/seatunnel-spark-starter/seatunnel-spark-3-starter/src/test/java/org/apache/seatunnel/core/starter/spark/multitable/MultiTableSinkTest.java
b/seatunnel-core/seatunnel-spark-starter/seatunnel-spark-3-starter/src/test/java/org/apache/seatunnel/core/starter/spark/multitable/MultiTableSinkTest.java
index 15b9810a0a..61ed44515c 100644
---
a/seatunnel-core/seatunnel-spark-starter/seatunnel-spark-3-starter/src/test/java/org/apache/seatunnel/core/starter/spark/multitable/MultiTableSinkTest.java
+++
b/seatunnel-core/seatunnel-spark-starter/seatunnel-spark-3-starter/src/test/java/org/apache/seatunnel/core/starter/spark/multitable/MultiTableSinkTest.java
@@ -25,6 +25,7 @@ import
org.apache.seatunnel.e2e.sink.inmemory.InMemoryAggregatedCommitter;
import org.apache.seatunnel.e2e.sink.inmemory.InMemorySinkWriter;
import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledOnJre;
import org.junit.jupiter.api.condition.JRE;
@@ -40,6 +41,7 @@ import java.util.Collections;
import java.util.List;
@Slf4j
+@Order(1)
public class MultiTableSinkTest {
@Test
diff --git
a/seatunnel-core/seatunnel-spark-starter/seatunnel-spark-3-starter/src/test/resources/config/fake_to_inmemory.json
b/seatunnel-core/seatunnel-spark-starter/seatunnel-spark-3-starter/src/test/resources/config/fake_to_inmemory.json
new file mode 100644
index 0000000000..88da70a628
--- /dev/null
+++
b/seatunnel-core/seatunnel-spark-starter/seatunnel-spark-3-starter/src/test/resources/config/fake_to_inmemory.json
@@ -0,0 +1,32 @@
+{
+ "env": {
+ "parallelism": 4,
+ "job.mode": "BATCH",
+ "spark.executor.instances": 1,
+ "spark.executor.cores": 1,
+ "spark.executor.memory": "1g",
+ "spark.master": "local"
+ },
+ "source": [
+ {
+ "plugin_name": "FakeSource",
+ "result_table_name": "fake_to_inmemory_wtih_spark",
+ "row.num": 10,
+ "schema": {
+ "fields": {
+ "name": "string",
+ "age": "int",
+ "card": "int"
+ }
+ }
+ }
+ ],
+ "transform": [
+ ],
+ "sink": [
+ {
+ "plugin_name": "InMemory",
+ "source_table_name": "fake_to_inmemory_wtih_spark"
+ }
+ ]
+}
diff --git
a/seatunnel-core/seatunnel-spark-starter/seatunnel-spark-3-starter/src/test/resources/config/fake_to_inmemory_without_pluginname.json
b/seatunnel-core/seatunnel-spark-starter/seatunnel-spark-3-starter/src/test/resources/config/fake_to_inmemory_without_pluginname.json
new file mode 100644
index 0000000000..ed6d93026f
--- /dev/null
+++
b/seatunnel-core/seatunnel-spark-starter/seatunnel-spark-3-starter/src/test/resources/config/fake_to_inmemory_without_pluginname.json
@@ -0,0 +1,30 @@
+{
+ "env": {
+ "parallelism": 4,
+ "job.mode": "BATCH",
+ "spark.executor.instances": 1,
+ "spark.executor.cores": 1,
+ "spark.executor.memory": "1g",
+ "spark.master": "local"
+ },
+ "source": [
+ {
+ "result_table_name": "fake_to_inmemory_wtih_spark",
+ "row.num": 10,
+ "schema": {
+ "fields": {
+ "name": "string",
+ "age": "int",
+ "card": "int"
+ }
+ }
+ }
+ ],
+ "transform": [
+ ],
+ "sink": [
+ {
+ "source_table_name": "fake_to_inmemory_wtih_spark"
+ }
+ ]
+}
diff --git
a/seatunnel-core/seatunnel-starter/src/test/java/org/apache/seatunnel/core/starter/seatunnel/args/ClientCommandArgsTest.java
b/seatunnel-core/seatunnel-starter/src/test/java/org/apache/seatunnel/core/starter/seatunnel/args/ClientCommandArgsTest.java
new file mode 100644
index 0000000000..87d4aa5b72
--- /dev/null
+++
b/seatunnel-core/seatunnel-starter/src/test/java/org/apache/seatunnel/core/starter/seatunnel/args/ClientCommandArgsTest.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.seatunnel.core.starter.seatunnel.args;
+
+import org.apache.seatunnel.core.starter.SeaTunnel;
+import org.apache.seatunnel.core.starter.enums.MasterType;
+import org.apache.seatunnel.core.starter.exception.CommandExecuteException;
+import
org.apache.seatunnel.core.starter.seatunnel.multitable.MultiTableSinkTest;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.io.FileNotFoundException;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+
+import static org.apache.seatunnel.api.common.CommonOptions.PLUGIN_NAME;
+
+public class ClientCommandArgsTest {
+ @Test
+ public void testExecuteClientCommandArgsWithPluginName()
+ throws FileNotFoundException, URISyntaxException {
+ String configurePath = "/config/fake_to_inmemory.json";
+ String configFile =
MultiTableSinkTest.getTestConfigFile(configurePath);
+ ClientCommandArgs clientCommandArgs =
buildClientCommandArgs(configFile);
+ Assertions.assertDoesNotThrow(() ->
SeaTunnel.run(clientCommandArgs.buildCommand()));
+ }
+
+ @Test
+ public void testExecuteClientCommandArgsWithoutPluginName()
+ throws FileNotFoundException, URISyntaxException {
+ String configurePath =
"/config/fake_to_inmemory_without_pluginname.json";
+ String configFile =
MultiTableSinkTest.getTestConfigFile(configurePath);
+ ClientCommandArgs clientCommandArgs =
buildClientCommandArgs(configFile);
+ CommandExecuteException commandExecuteException =
+ Assertions.assertThrows(
+ CommandExecuteException.class,
+ () -> SeaTunnel.run(clientCommandArgs.buildCommand()));
+ Assertions.assertEquals(
+ String.format(
+ "The '%s' option is not configured, please configure
it.",
+ PLUGIN_NAME.key()),
+ commandExecuteException.getCause().getMessage());
+ }
+
+ private static ClientCommandArgs buildClientCommandArgs(String configFile)
{
+ ClientCommandArgs clientCommandArgs = new ClientCommandArgs();
+ clientCommandArgs.setVariables(new ArrayList<>());
+ clientCommandArgs.setConfigFile(configFile);
+ clientCommandArgs.setMasterType(MasterType.LOCAL);
+ clientCommandArgs.setCheckConfig(false);
+ return clientCommandArgs;
+ }
+}
diff --git
a/seatunnel-core/seatunnel-starter/src/test/java/org/apache/seatunnel/core/starter/seatunnel/multitable/MultiTableSinkTest.java
b/seatunnel-core/seatunnel-starter/src/test/java/org/apache/seatunnel/core/starter/seatunnel/multitable/MultiTableSinkTest.java
index e5c59b792c..a542964511 100644
---
a/seatunnel-core/seatunnel-starter/src/test/java/org/apache/seatunnel/core/starter/seatunnel/multitable/MultiTableSinkTest.java
+++
b/seatunnel-core/seatunnel-starter/src/test/java/org/apache/seatunnel/core/starter/seatunnel/multitable/MultiTableSinkTest.java
@@ -25,6 +25,7 @@ import
org.apache.seatunnel.e2e.sink.inmemory.InMemoryAggregatedCommitter;
import org.apache.seatunnel.e2e.sink.inmemory.InMemorySinkWriter;
import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledOnOs;
import org.junit.jupiter.api.condition.OS;
@@ -37,6 +38,7 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+@Order(1)
public class MultiTableSinkTest {
@Test
diff --git
a/seatunnel-core/seatunnel-starter/src/test/resources/config/fake_to_inmemory.json
b/seatunnel-core/seatunnel-starter/src/test/resources/config/fake_to_inmemory.json
new file mode 100644
index 0000000000..f380a6c3e0
--- /dev/null
+++
b/seatunnel-core/seatunnel-starter/src/test/resources/config/fake_to_inmemory.json
@@ -0,0 +1,28 @@
+{
+ "env": {
+ "parallelism": 4,
+ "job.mode": "BATCH"
+ },
+ "source": [
+ {
+ "plugin_name": "FakeSource",
+ "result_table_name": "fake_to_inmemory_wtih_zeta",
+ "row.num": 10,
+ "schema": {
+ "fields": {
+ "name": "string",
+ "age": "int",
+ "card": "int"
+ }
+ }
+ }
+ ],
+ "transform": [
+ ],
+ "sink": [
+ {
+ "plugin_name": "InMemory",
+ "source_table_name": "fake_to_inmemory_wtih_zeta"
+ }
+ ]
+}
diff --git
a/seatunnel-core/seatunnel-starter/src/test/resources/config/fake_to_inmemory_without_pluginname.json
b/seatunnel-core/seatunnel-starter/src/test/resources/config/fake_to_inmemory_without_pluginname.json
new file mode 100644
index 0000000000..bdf7c9d21f
--- /dev/null
+++
b/seatunnel-core/seatunnel-starter/src/test/resources/config/fake_to_inmemory_without_pluginname.json
@@ -0,0 +1,26 @@
+{
+ "env": {
+ "parallelism": 4,
+ "job.mode": "BATCH"
+ },
+ "source": [
+ {
+ "result_table_name": "fake_to_inmemory_wtih_zeta",
+ "row.num": 10,
+ "schema": {
+ "fields": {
+ "name": "string",
+ "age": "int",
+ "card": "int"
+ }
+ }
+ }
+ ],
+ "transform": [
+ ],
+ "sink": [
+ {
+ "source_table_name": "fake_to_inmemory_wtih_zeta"
+ }
+ ]
+}
diff --git
a/seatunnel-e2e/seatunnel-e2e-common/src/test/resources/junit-platform.properties
b/seatunnel-e2e/seatunnel-e2e-common/src/test/resources/junit-platform.properties
new file mode 100644
index 0000000000..a9c2b8834d
--- /dev/null
+++
b/seatunnel-e2e/seatunnel-e2e-common/src/test/resources/junit-platform.properties
@@ -0,0 +1,20 @@
+################################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+################################################################################
+
+# We can use the following to order the test classes
+junit.jupiter.testclass.order.default =
org.junit.jupiter.api.ClassOrderer$OrderAnnotation
diff --git
a/seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/parse/ConfigParserUtil.java
b/seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/parse/ConfigParserUtil.java
index 94822972bb..377609a5c8 100644
---
a/seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/parse/ConfigParserUtil.java
+++
b/seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/parse/ConfigParserUtil.java
@@ -26,6 +26,7 @@ import org.apache.seatunnel.api.table.factory.FactoryUtil;
import org.apache.seatunnel.engine.common.exception.JobDefineCheckException;
import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
import lombok.extern.slf4j.Slf4j;
import scala.Tuple2;
@@ -263,7 +264,14 @@ public final class ConfigParserUtil {
}
public static String getFactoryId(ReadonlyConfig readonlyConfig) {
- return readonlyConfig.get(PLUGIN_NAME);
+ String pluginName = readonlyConfig.get(PLUGIN_NAME);
+ if (StringUtils.isBlank(pluginName)) {
+ throw new JobDefineCheckException(
+ String.format(
+ "The '%s' option is not configured, please
configure it.",
+ PLUGIN_NAME.key()));
+ }
+ return pluginName;
}
public static String getFactoryId(Config config) {