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) {

Reply via email to