This is an automated email from the ASF dual-hosted git repository.

yamer pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git


The following commit(s) were added to refs/heads/main by this push:
     new cfb424e7e3 kie-issues#1910: Create a single “codegen” management 
library  (#3881)
cfb424e7e3 is described below

commit cfb424e7e374bd32ea073549ba0a802807fc4333
Author: Yeser Amer <[email protected]>
AuthorDate: Thu Apr 10 11:19:56 2025 +0200

    kie-issues#1910: Create a single “codegen” management library  (#3881)
    
    * First Draft
    
    * Test Ignore
    
    * Test Ignore
    
    * Test Ignore
    
    * Fix
    
    * Fix + Tests
    
    * Fix + Tests
    
    * Fix + Tests
    
    * Fix + Tests
    
    * Tests
    
    * Readme
    
    * Tests
    
    * Tests
    
    * Fix imports
    
    * Fix importsAdd dep scope
    
    * pom cleanup
    
    * Logback classic added
    
    * Change Request
    
    * Change Request
    
    * Change Request
    
    * Change Request
    
    * Format?
    
    * Format
---
 kogito-bom/pom.xml                                 |  11 ++
 kogito-build/kogito-dependencies-bom/pom.xml       |   5 +
 .../kogito-codegen-manager/README.md               |  30 ++++
 .../kogito-codegen-manager/pom.xml                 | 136 +++++++++++++++
 .../kogito/codegen/manager}/CompilerHelper.java    |  90 ++++++----
 .../codegen/manager}/GenerateModelHelper.java      |   7 +-
 .../processes}/PersistenceGenerationHelper.java    |  16 +-
 .../codegen/manager/util/CodeGenManagerUtil.java   | 186 ++++++++++++++++++++
 .../manager/util/CodeGenManagerUtilTest.java       | 139 +++++++++++++++
 kogito-codegen-modules/pom.xml                     |   9 +-
 kogito-maven-plugin-test/pom.xml                   |   2 +-
 kogito-maven-plugin/README.md                      |  55 ++++++
 kogito-maven-plugin/pom.xml                        | 112 ++++--------
 .../kie/kogito/maven/plugin/AbstractKieMojo.java   | 194 ++-------------------
 .../kie/kogito/maven/plugin/GenerateModelMojo.java | 106 ++++++-----
 .../org/kie/kogito/maven/plugin/ScaffoldMojo.java  |   6 +-
 .../org/kie/kogito/maven/plugin/util/MojoUtil.java |  18 ++
 .../kogito/maven/plugin/AbstractKieMojoTest.java   | 111 ------------
 .../kogito/maven/plugin/GenerateModelMojoTest.java |  33 ++--
 19 files changed, 775 insertions(+), 491 deletions(-)

diff --git a/kogito-bom/pom.xml b/kogito-bom/pom.xml
index 346809d6d6..aa38acc76e 100755
--- a/kogito-bom/pom.xml
+++ b/kogito-bom/pom.xml
@@ -638,6 +638,17 @@
         <version>${project.version}</version>
         <classifier>sources</classifier>
       </dependency>
+      <dependency>
+        <groupId>org.kie.kogito</groupId>
+        <artifactId>kogito-codegen-manager</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.kie.kogito</groupId>
+        <artifactId>kogito-codegen-manager</artifactId>
+        <version>${project.version}</version>
+        <classifier>sources</classifier>
+      </dependency>
 
       <!-- Monitoring addon     -->
       <dependency>
diff --git a/kogito-build/kogito-dependencies-bom/pom.xml 
b/kogito-build/kogito-dependencies-bom/pom.xml
index 605eca46dc..92b76f6fbc 100644
--- a/kogito-build/kogito-dependencies-bom/pom.xml
+++ b/kogito-build/kogito-dependencies-bom/pom.xml
@@ -620,6 +620,11 @@
         <artifactId>maven-artifact</artifactId>
         <version>${version.maven}</version>
       </dependency>
+      <dependency>
+        <groupId>org.apache.maven</groupId>
+        <artifactId>maven-model</artifactId>
+        <version>${version.maven}</version>
+      </dependency>
       <dependency>
         <groupId>org.apache.maven</groupId>
         <artifactId>maven-plugin-api</artifactId>
diff --git a/kogito-codegen-modules/kogito-codegen-manager/README.md 
b/kogito-codegen-modules/kogito-codegen-manager/README.md
new file mode 100644
index 0000000000..a3ba59455b
--- /dev/null
+++ b/kogito-codegen-modules/kogito-codegen-manager/README.md
@@ -0,0 +1,30 @@
+<!--
+  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.
+  -->
+
+# Kogito Codegen Manager
+
+The aim of this module is to be consumed by a build automation and project 
management tool such as Maven or Gradle.
+
+This module manages all the required logic to actually execute the KIE assets 
Generators defined in the other `kogito-codegen-*`
+, togheter with the glue code that perform the following actions:
+- It generates the CodeGen classes based on the given Apache KIE assets (BPMN, 
DMN, DRL, PMML), using its specific Generator;
+- It writes the CodeGen classes;
+- It compiles the CodeGen classes, based on the Java version used in the user 
Apache KIE project
+- It writes the compiled CodeGen classes;
+
diff --git a/kogito-codegen-modules/kogito-codegen-manager/pom.xml 
b/kogito-codegen-modules/kogito-codegen-manager/pom.xml
new file mode 100644
index 0000000000..5912dfea55
--- /dev/null
+++ b/kogito-codegen-modules/kogito-codegen-manager/pom.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.kie.kogito</groupId>
+        <artifactId>kogito-codegen-modules</artifactId>
+        <version>999-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>kogito-codegen-manager</artifactId>
+    <name>Kogito :: Codegen Manager</name>
+
+    <properties>
+        <java.module.name>org.kie.kogito.codegen.manager</java.module.name>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.kie.kogito</groupId>
+                <artifactId>kogito-kie-bom</artifactId>
+                <version>${project.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <!-- Internal dependencies -->
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-codegen-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-compiler</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-model-codegen</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.kie.kogito</groupId>
+            <artifactId>kogito-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.kie.kogito</groupId>
+            <artifactId>kogito-codegen-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.kie.kogito</groupId>
+            <artifactId>kogito-codegen-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.kie.kogito</groupId>
+            <artifactId>kogito-codegen-decisions</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.kie.kogito</groupId>
+            <artifactId>kogito-codegen-predictions</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.kie.kogito</groupId>
+            <artifactId>kogito-codegen-processes</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.kie.kogito</groupId>
+            <artifactId>kogito-codegen-rules</artifactId>
+        </dependency>
+
+        <!-- 3rd party dependencies -->
+        <dependency>
+            <groupId>org.reflections</groupId>
+            <artifactId>reflections</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+
+        <!-- Test -->
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-params</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git 
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/CompilerHelper.java
 
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/CompilerHelper.java
similarity index 54%
rename from 
kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/CompilerHelper.java
rename to 
kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/CompilerHelper.java
index 58d32a1b44..8d7b782671 100644
--- 
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/CompilerHelper.java
+++ 
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/CompilerHelper.java
@@ -16,71 +16,76 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.kie.kogito.maven.plugin.util;
+package org.kie.kogito.codegen.manager;
 
 import java.io.File;
 import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
 
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.project.MavenProject;
 import org.drools.codegen.common.GeneratedFile;
 import org.drools.codegen.common.GeneratedFileType;
 import org.drools.codegen.common.GeneratedFileWriter;
 import org.drools.compiler.compiler.io.memory.MemoryFileSystem;
 import org.drools.util.PortablePath;
+import org.kie.memorycompiler.CompilationProblem;
 import org.kie.memorycompiler.CompilationResult;
 import org.kie.memorycompiler.JavaCompiler;
 import org.kie.memorycompiler.JavaCompilerFactory;
 import org.kie.memorycompiler.JavaCompilerSettings;
 import org.kie.memorycompiler.JavaConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class CompilerHelper {
 
-    private static final JavaCompiler JAVA_COMPILER = 
JavaCompilerFactory.loadCompiler(JavaConfiguration.CompilerType.NATIVE, "1.8");
-    private static final GeneratedFileWriter.Builder 
generatedFileWriterBuilder = GeneratedFileWriter.builder("kogito", 
"kogito.codegen.resources.directory", "kogito.codegen.sources.directory");
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(CompilerHelper.class);
+
+    private static final JavaCompiler JAVA_COMPILER = 
JavaCompilerFactory.loadCompiler(JavaConfiguration.CompilerType.NATIVE, "17");
+    private static final GeneratedFileWriter.Builder 
GENERATED_FILE_WRITER_BUILDER = GeneratedFileWriter.builder("kogito", 
"kogito.codegen.resources.directory", "kogito.codegen.sources.directory");
     public static final String SOURCES = "SOURCES";
     public static final String RESOURCES = "RESOURCES";
 
     private CompilerHelper() {
     }
 
-    public static void 
dumpAndCompileGeneratedSources(Collection<GeneratedFile> generatedSources,
+    public static void 
compileAndDumpGeneratedSources(Collection<GeneratedFile> generatedSources,
             ClassLoader classLoader,
-            MavenProject project,
-            File baseDir, Log log) throws MojoExecutionException {
-        try {
-            JavaCompilerSettings settings = new JavaCompilerSettings();
-            for (String path : project.getRuntimeClasspathElements()) {
-                File pathFile = new File(path);
-                settings.addClasspath(pathFile);
-            }
-            compileAndWriteClasses(generatedSources, classLoader, settings, 
getGeneratedFileWriter(baseDir), log);
-            writeFiles(generatedSources, baseDir, log);
-        } catch (Exception e) {
-            throw new MojoExecutionException("Error during processing model 
classes", e);
-        }
+            List<String> runtimeClassPathElements,
+            File baseDir,
+            String javaSourceEncoding,
+            String javaSourceVersion,
+            String javaTargetVersion) {
+        compileAndWriteClasses(generatedSources,
+                classLoader,
+                buildJavaCompilerSettings(runtimeClassPathElements,
+                        javaSourceEncoding,
+                        javaSourceVersion,
+                        javaTargetVersion),
+                getGeneratedFileWriter(baseDir));
+        writeFiles(generatedSources, baseDir);
     }
 
-    public static void dumpResources(Collection<GeneratedFile> resources, File 
baseDir, Log log) {
-        writeFiles(resources, baseDir, log);
+    public static void dumpResources(Collection<GeneratedFile> resources, File 
baseDir) {
+        writeFiles(resources, baseDir);
     }
 
-    static void writeFiles(Collection<GeneratedFile> toWrite, File baseDir, 
Log log) {
+    static void writeFiles(Collection<GeneratedFile> toWrite, File baseDir) {
         GeneratedFileWriter writer = getGeneratedFileWriter(baseDir);
-        toWrite.forEach(generatedFile -> writeGeneratedFile(generatedFile, 
writer, log));
+        toWrite.forEach(generatedFile -> writeGeneratedFile(generatedFile, 
writer));
     }
 
-    static void writeGeneratedFile(GeneratedFile generatedFile, 
GeneratedFileWriter writer, Log log) {
-        log.info("Generating: " + generatedFile.relativePath());
+    static void writeGeneratedFile(GeneratedFile generatedFile, 
GeneratedFileWriter writer) {
+        LOGGER.info("Writing compiled class: {}", 
generatedFile.relativePath());
         writer.write(generatedFile);
     }
 
-    static void compileAndWriteClasses(Collection<GeneratedFile> 
generatedClasses, ClassLoader cl, JavaCompilerSettings settings, 
GeneratedFileWriter fileWriter, Log log)
-            throws MojoFailureException {
+    static void compileAndWriteClasses(Collection<GeneratedFile> 
generatedClasses,
+            ClassLoader classLoader,
+            JavaCompilerSettings javaCompilerSettings,
+            GeneratedFileWriter fileWriter) {
         MemoryFileSystem srcMfs = new MemoryFileSystem();
         MemoryFileSystem trgMfs = new MemoryFileSystem();
 
@@ -93,21 +98,36 @@ public class CompilerHelper {
         }
 
         if (sources.length > 0) {
+            CompilationResult result = JAVA_COMPILER.compile(sources, srcMfs, 
trgMfs, classLoader, javaCompilerSettings);
 
-            CompilationResult result = JAVA_COMPILER.compile(sources, srcMfs, 
trgMfs, cl, settings);
             if (result.getErrors().length > 0) {
-                throw new 
MojoFailureException(Arrays.toString(result.getErrors()));
+                throw new 
IllegalStateException(Arrays.stream(result.getErrors())
+                        .map(CompilationProblem::getMessage)
+                        .collect(Collectors.joining(",")));
             }
 
             for (PortablePath path : trgMfs.getFilePaths()) {
                 byte[] data = trgMfs.getBytes(path);
-                writeGeneratedFile(new 
GeneratedFile(GeneratedFileType.COMPILED_CLASS, path.asString(), data), 
fileWriter, log);
+                writeGeneratedFile(new 
GeneratedFile(GeneratedFileType.COMPILED_CLASS, path.asString(), data), 
fileWriter);
             }
         }
     }
 
-    private static GeneratedFileWriter getGeneratedFileWriter(File baseDir) {
-        return generatedFileWriterBuilder
-                .build(Path.of(baseDir.getAbsolutePath()));
+    static GeneratedFileWriter getGeneratedFileWriter(File baseDir) {
+        return 
GENERATED_FILE_WRITER_BUILDER.build(Path.of(baseDir.getAbsolutePath()));
+    }
+
+    static JavaCompilerSettings buildJavaCompilerSettings(List<String> 
runtimeClassPathElements,
+            String sourceEncoding,
+            String sourceVersion,
+            String targetVersion) {
+        JavaCompilerSettings settings = new JavaCompilerSettings();
+        for (String path : runtimeClassPathElements) {
+            settings.addClasspath(new File(path));
+        }
+        settings.setSourceEncoding(sourceEncoding);
+        settings.setSourceVersion(sourceVersion);
+        settings.setTargetVersion(targetVersion);
+        return settings;
     }
 }
diff --git 
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/GenerateModelHelper.java
 
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/GenerateModelHelper.java
similarity index 93%
rename from 
kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/GenerateModelHelper.java
rename to 
kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/GenerateModelHelper.java
index 826c92eb58..ec6d51d5b5 100644
--- 
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/GenerateModelHelper.java
+++ 
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/GenerateModelHelper.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.kie.kogito.maven.plugin.util;
+package org.kie.kogito.codegen.manager;
 
 import java.io.File;
 import java.util.Collection;
@@ -29,8 +29,8 @@ import org.kie.kogito.codegen.core.ApplicationGenerator;
 import org.kie.kogito.codegen.core.utils.ApplicationGeneratorDiscovery;
 
 import static org.drools.codegen.common.GeneratedFileType.COMPILED_CLASS;
-import static org.kie.kogito.maven.plugin.util.CompilerHelper.RESOURCES;
-import static org.kie.kogito.maven.plugin.util.CompilerHelper.SOURCES;
+import static org.kie.kogito.codegen.manager.CompilerHelper.RESOURCES;
+import static org.kie.kogito.codegen.manager.CompilerHelper.SOURCES;
 
 public class GenerateModelHelper {
 
@@ -55,7 +55,6 @@ public class GenerateModelHelper {
                 case COMPILED_CLASS -> generatedResources.add(new 
GeneratedFile(COMPILED_CLASS, convertPath(generatedFile.path().toString()), 
generatedFile.contents()));
                 default -> throw new IllegalStateException("Unexpected file 
with category: " + generatedFile.category());
             }
-
         });
         return Map.of(SOURCES, generatedClasses, RESOURCES, 
generatedResources);
     }
diff --git 
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/PersistenceGenerationHelper.java
 
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/processes/PersistenceGenerationHelper.java
similarity index 89%
rename from 
kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/PersistenceGenerationHelper.java
rename to 
kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/processes/PersistenceGenerationHelper.java
index c783408eca..9234e9aa4e 100644
--- 
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/PersistenceGenerationHelper.java
+++ 
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/processes/PersistenceGenerationHelper.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.kie.kogito.maven.plugin.util;
+package org.kie.kogito.codegen.manager.processes;
 
 import java.io.IOException;
 import java.util.Collection;
@@ -25,7 +25,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.stream.Stream;
 
-import org.apache.maven.plugin.MojoExecutionException;
 import org.drools.codegen.common.GeneratedFile;
 import org.drools.codegen.common.GeneratedFileType;
 import org.kie.kogito.Model;
@@ -33,6 +32,7 @@ import org.kie.kogito.ProcessInput;
 import org.kie.kogito.UserTask;
 import org.kie.kogito.codegen.api.context.KogitoBuildContext;
 import org.kie.kogito.codegen.json.JsonSchemaGenerator;
+import org.kie.kogito.codegen.manager.util.CodeGenManagerUtil;
 import org.kie.kogito.codegen.process.persistence.PersistenceGenerator;
 import 
org.kie.kogito.codegen.process.persistence.marshaller.ReflectionMarshallerGenerator;
 import 
org.kie.kogito.codegen.process.persistence.proto.ReflectionProtoGenerator;
@@ -40,8 +40,8 @@ import org.reflections.Reflections;
 
 import static java.util.Arrays.asList;
 import static 
org.kie.kogito.codegen.core.utils.GeneratedFileValidation.validateGeneratedFileTypes;
-import static org.kie.kogito.maven.plugin.util.CompilerHelper.RESOURCES;
-import static org.kie.kogito.maven.plugin.util.CompilerHelper.SOURCES;
+import static org.kie.kogito.codegen.manager.CompilerHelper.RESOURCES;
+import static org.kie.kogito.codegen.manager.CompilerHelper.SOURCES;
 
 public class PersistenceGenerationHelper {
 
@@ -49,9 +49,10 @@ public class PersistenceGenerationHelper {
     }
 
     public static Map<String, Collection<GeneratedFile>> 
generatePersistenceFiles(KogitoBuildContext context,
-            Reflections reflections,
-            String schemaVersion) throws MojoExecutionException {
+            ClassLoader projectClassloader,
+            String schemaVersion) {
         try {
+            Reflections reflections = 
CodeGenManagerUtil.getReflections(projectClassloader);
 
             @SuppressWarnings({ "rawtype", "unchecked" })
             Set<Class<?>> modelClasses = (Set) 
reflections.getSubTypesOf(Model.class);
@@ -71,7 +72,7 @@ public class PersistenceGenerationHelper {
             
toReturn.get(RESOURCES).addAll(generateJsonSchemaFromClasses(userTaskClassStream,
 schemaVersion));
             return toReturn;
         } catch (Exception e) {
-            throw new MojoExecutionException("Error during processing model 
classes", e);
+            throw new IllegalStateException("Error during processing model 
classes", e);
         }
     }
 
@@ -97,5 +98,4 @@ public class PersistenceGenerationHelper {
                 .withSchemaVersion(schemaVersion).build()
                 .generate();
     }
-
 }
diff --git 
a/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/util/CodeGenManagerUtil.java
 
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/util/CodeGenManagerUtil.java
new file mode 100644
index 0000000000..ced206c650
--- /dev/null
+++ 
b/kogito-codegen-modules/kogito-codegen-manager/src/main/java/org/kie/kogito/codegen/manager/util/CodeGenManagerUtil.java
@@ -0,0 +1,186 @@
+/*
+ * 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.kie.kogito.codegen.manager.util;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.lang.reflect.Modifier;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.PathMatcher;
+import java.util.Optional;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+import org.drools.codegen.common.AppPaths;
+import org.drools.codegen.common.DroolsModelBuildContext;
+import org.drools.model.codegen.project.RuleCodegen;
+import org.kie.kogito.KogitoGAV;
+import org.kie.kogito.codegen.api.Generator;
+import org.kie.kogito.codegen.api.context.KogitoBuildContext;
+import org.kie.kogito.codegen.api.context.impl.JavaKogitoBuildContext;
+import org.kie.kogito.codegen.api.context.impl.QuarkusKogitoBuildContext;
+import org.kie.kogito.codegen.api.context.impl.SpringBootKogitoBuildContext;
+import org.kie.kogito.codegen.decision.DecisionCodegen;
+import org.kie.kogito.codegen.prediction.PredictionCodegen;
+import org.kie.kogito.codegen.process.ProcessCodegen;
+import org.kie.kogito.codegen.process.persistence.PersistenceGenerator;
+import org.reflections.Reflections;
+import org.reflections.util.ConfigurationBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CodeGenManagerUtil {
+
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(CodeGenManagerUtil.class);
+    public static final PathMatcher DRL_FILE_MATCHER = 
FileSystems.getDefault().getPathMatcher("glob:**.drl");
+
+    public enum Framework {
+        QUARKUS,
+        SPRING,
+        NONE
+    }
+
+    public record ProjectParameters(CodeGenManagerUtil.Framework framework,
+            String generateDecisions,
+            String generatePredictions,
+            String generateProcesses,
+            String generateRules,
+            boolean persistence) {
+    }
+
+    public static KogitoBuildContext discoverKogitoRuntimeContext(ClassLoader 
projectClassLoader,
+            Path projectDir,
+            KogitoGAV kogitoGAV,
+            ProjectParameters projectParameters,
+            Predicate<String> classAvaialbilityPredicate) {
+        AppPaths appPaths = AppPaths.fromProjectDir(projectDir);
+        KogitoBuildContext context = 
contextBuilder(projectParameters.framework)
+                .withClassAvailabilityResolver(classAvaialbilityPredicate)
+                
.withClassSubTypeAvailabilityResolver(classSubTypeAvailabilityResolver(projectClassLoader))
+                .withApplicationProperties(appPaths.getResourceFiles())
+                .withPackageName(DroolsModelBuildContext.DEFAULT_PACKAGE_NAME)
+                .withClassLoader(projectClassLoader)
+                .withAppPaths(appPaths)
+                .withGAV(kogitoGAV)
+                .build();
+
+        additionalProperties(context, projectParameters);
+        return context;
+    }
+
+    static KogitoBuildContext.Builder 
contextBuilder(CodeGenManagerUtil.Framework framework) {
+        return switch (framework) {
+            case QUARKUS -> QuarkusKogitoBuildContext.builder();
+            case SPRING -> SpringBootKogitoBuildContext.builder();
+            default -> JavaKogitoBuildContext.builder();
+        };
+    }
+
+    static Optional<String> classToCheckForREST(CodeGenManagerUtil.Framework 
framework) {
+        return switch (framework) {
+            case QUARKUS -> 
Optional.of(QuarkusKogitoBuildContext.QUARKUS_REST);
+            case SPRING -> 
Optional.of(SpringBootKogitoBuildContext.SPRING_REST);
+            default -> Optional.empty();
+        };
+    }
+
+    static Optional<String> classToCheckForDI(CodeGenManagerUtil.Framework 
framework) {
+        return switch (framework) {
+            case QUARKUS -> Optional.of(QuarkusKogitoBuildContext.QUARKUS_DI);
+            case SPRING -> Optional.of(SpringBootKogitoBuildContext.SPRING_DI);
+            default -> Optional.empty();
+        };
+    }
+
+    static void overwritePropertiesIfNeeded(KogitoBuildContext context, 
ProjectParameters projectParameters) {
+        overwritePropertyIfNeeded(context, RuleCodegen.GENERATOR_NAME, 
projectParameters.generateRules());
+        overwritePropertyIfNeeded(context, ProcessCodegen.GENERATOR_NAME, 
projectParameters.generateProcesses());
+        overwritePropertyIfNeeded(context, PredictionCodegen.GENERATOR_NAME, 
projectParameters.generatePredictions());
+        overwritePropertyIfNeeded(context, DecisionCodegen.GENERATOR_NAME, 
projectParameters.generateDecisions());
+        overwritePropertyIfNeeded(context, 
PersistenceGenerator.GENERATOR_NAME, 
Boolean.toString(projectParameters.persistence()));
+    }
+
+    static void overwritePropertyIfNeeded(KogitoBuildContext context, String 
generatorName, String propertyValue) {
+        if (propertyValue != null && !propertyValue.isEmpty()) {
+            context.setApplicationProperty(Generator.CONFIG_PREFIX + 
generatorName, propertyValue);
+        }
+    }
+
+    static void additionalProperties(KogitoBuildContext context, 
ProjectParameters projectParameters) {
+        classToCheckForREST(projectParameters.framework).ifPresent(restClass 
-> {
+            if (!context.hasClassAvailable(restClass)) {
+                LOGGER.info("Disabling REST generation because class '{}' is 
not available", restClass);
+                
context.setApplicationProperty(DroolsModelBuildContext.KOGITO_GENERATE_REST, 
"false");
+            }
+        });
+        classToCheckForDI(projectParameters.framework).ifPresent(diClass -> {
+            if (!context.hasClassAvailable(diClass)) {
+                LOGGER.info("Disabling dependency injection generation because 
class '{}", diClass);
+                
context.setApplicationProperty(DroolsModelBuildContext.KOGITO_GENERATE_DI, 
"false");
+            }
+        });
+
+        overwritePropertiesIfNeeded(context, projectParameters);
+    }
+
+    public static Reflections getReflections(ClassLoader projectClassLoader) {
+        URLClassLoader urlClassLoader = (URLClassLoader) projectClassLoader;
+        ConfigurationBuilder builder = new ConfigurationBuilder();
+        builder.addUrls(urlClassLoader.getURLs());
+        builder.addClassLoaders(urlClassLoader);
+        return new Reflections(builder);
+    }
+
+    static Predicate<Class<?>> classSubTypeAvailabilityResolver(ClassLoader 
projectClassLoader) {
+        return clazz -> 
getReflections(projectClassLoader).getSubTypesOf(clazz).stream()
+                .anyMatch(c -> !c.isInterface() && 
!Modifier.isAbstract(c.getModifiers()));
+    }
+
+    public static boolean isClassNameInUrlClassLoader(URL[] urls, String 
className) {
+        try (URLClassLoader cl = new URLClassLoader(urls)) {
+            cl.loadClass(className);
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    /**
+     * It deletes all DRL files in a given Path directory
+     */
+    public static void deleteDrlFiles(Path directory) {
+        try (final Stream<Path> drlFiles = Files.find(directory,
+                Integer.MAX_VALUE,
+                (p, f) -> DRL_FILE_MATCHER.matches(p))) {
+            drlFiles.forEach(p -> {
+                try {
+                    Files.delete(p);
+                } catch (IOException e) {
+                    throw new UncheckedIOException(e);
+                }
+            });
+        } catch (IOException e) {
+            throw new UncheckedIOException("Error during .drl files deletion", 
e);
+        }
+    }
+}
diff --git 
a/kogito-codegen-modules/kogito-codegen-manager/src/test/java/org/kie/kogito/codegen/manager/util/CodeGenManagerUtilTest.java
 
b/kogito-codegen-modules/kogito-codegen-manager/src/test/java/org/kie/kogito/codegen/manager/util/CodeGenManagerUtilTest.java
new file mode 100644
index 0000000000..8a56e3fe37
--- /dev/null
+++ 
b/kogito-codegen-modules/kogito-codegen-manager/src/test/java/org/kie/kogito/codegen/manager/util/CodeGenManagerUtilTest.java
@@ -0,0 +1,139 @@
+/*
+ * 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.kie.kogito.codegen.manager.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.kie.kogito.codegen.api.Generator;
+import org.kie.kogito.codegen.api.context.KogitoBuildContext;
+import org.kie.kogito.codegen.decision.DecisionCodegen;
+import org.kie.kogito.codegen.prediction.PredictionCodegen;
+import org.kie.kogito.codegen.process.ProcessCodegen;
+import org.kie.kogito.codegen.process.persistence.PersistenceGenerator;
+import org.kie.kogito.codegen.rules.RuleCodegen;
+import org.mockito.Mockito;
+
+class CodeGenManagerUtilTest {
+
+    private static final List<String> generatorNames;
+
+    static {
+        generatorNames = new ArrayList<>();
+        generatorNames.add(RuleCodegen.GENERATOR_NAME);
+        generatorNames.add(ProcessCodegen.GENERATOR_NAME);
+        generatorNames.add(PredictionCodegen.GENERATOR_NAME);
+        generatorNames.add(DecisionCodegen.GENERATOR_NAME);
+        generatorNames.add(PersistenceGenerator.GENERATOR_NAME);
+    }
+
+    @ParameterizedTest
+    @MethodSource("getGeneratorNamesStream")
+    void overwritePropertiesIfNeededWithNullParameters(String generatorName) {
+        String expectedWrittenProperty = Generator.CONFIG_PREFIX + 
generatorName;
+        KogitoBuildContext kogitoBuildContextMocked = 
Mockito.mock(KogitoBuildContext.class);
+        CodeGenManagerUtil.ProjectParameters parameters = new 
CodeGenManagerUtil.ProjectParameters(CodeGenManagerUtil.Framework.QUARKUS,
+                null,
+                null,
+                null,
+                null,
+                false);
+        
CodeGenManagerUtil.overwritePropertiesIfNeeded(kogitoBuildContextMocked, 
parameters);
+        if (generatorName.equals(PersistenceGenerator.GENERATOR_NAME)) {
+            Mockito.verify(kogitoBuildContextMocked, 
Mockito.times(1)).setApplicationProperty(expectedWrittenProperty, "false"); // 
being a boolean property, it default to false
+        } else {
+            Mockito.verify(kogitoBuildContextMocked, 
Mockito.never()).setApplicationProperty(Mockito.eq(expectedWrittenProperty), 
Mockito.any());
+        }
+    }
+
+    @ParameterizedTest
+    @MethodSource("getGeneratorNamesStream")
+    void overwritePropertiesIfNeededWithEmptyParameters(String generatorName) {
+        String expectedWrittenProperty = Generator.CONFIG_PREFIX + 
generatorName;
+        KogitoBuildContext kogitoBuildContextMocked = 
Mockito.mock(KogitoBuildContext.class);
+        CodeGenManagerUtil.ProjectParameters parameters = new 
CodeGenManagerUtil.ProjectParameters(CodeGenManagerUtil.Framework.QUARKUS,
+                "",
+                "",
+                "",
+                "",
+                false);
+        
CodeGenManagerUtil.overwritePropertiesIfNeeded(kogitoBuildContextMocked, 
parameters);
+        if (generatorName.equals(PersistenceGenerator.GENERATOR_NAME)) {
+            Mockito.verify(kogitoBuildContextMocked, 
Mockito.times(1)).setApplicationProperty(expectedWrittenProperty, "false"); // 
being a boolean property, it default to false
+        } else {
+            Mockito.verify(kogitoBuildContextMocked, 
Mockito.never()).setApplicationProperty(Mockito.eq(expectedWrittenProperty), 
Mockito.any());
+        }
+    }
+
+    @ParameterizedTest
+    @MethodSource("getGeneratorNamesStream")
+    void overwritePropertiesIfNeededWithNotNullParameters(String 
generatorName) {
+        String expectedWrittenProperty = Generator.CONFIG_PREFIX + 
generatorName;
+        KogitoBuildContext kogitoBuildContextMocked = 
Mockito.mock(KogitoBuildContext.class);
+        CodeGenManagerUtil.ProjectParameters parameters = new 
CodeGenManagerUtil.ProjectParameters(CodeGenManagerUtil.Framework.QUARKUS,
+                "notnull",
+                "notnull",
+                "notnull",
+                "notnull",
+                true);
+        
CodeGenManagerUtil.overwritePropertiesIfNeeded(kogitoBuildContextMocked, 
parameters);
+        if (generatorName.equals(PersistenceGenerator.GENERATOR_NAME)) {
+            Mockito.verify(kogitoBuildContextMocked, 
Mockito.times(1)).setApplicationProperty(expectedWrittenProperty, "true");
+        } else {
+            Mockito.verify(kogitoBuildContextMocked, 
Mockito.times(1)).setApplicationProperty(Mockito.eq(expectedWrittenProperty), 
Mockito.eq("notnull"));
+        }
+    }
+
+    @ParameterizedTest
+    @MethodSource("getGeneratorNamesStream")
+    void overwritePropertyIfNeededWithNotNull(String generatorName) {
+        String propertyValue = "notnull";
+        String expectedWrittenProperty = Generator.CONFIG_PREFIX + 
generatorName;
+        KogitoBuildContext kogitoBuildContextMocked = 
Mockito.mock(KogitoBuildContext.class);
+        CodeGenManagerUtil.overwritePropertyIfNeeded(kogitoBuildContextMocked, 
generatorName, propertyValue);
+        Mockito.verify(kogitoBuildContextMocked, 
Mockito.times(1)).setApplicationProperty(expectedWrittenProperty, 
propertyValue);
+    }
+
+    @ParameterizedTest
+    @MethodSource("getGeneratorNamesStream")
+    void overwritePropertyIfNeededWithEmpty(String generatorName) {
+        String propertyValue = "";
+        String expectedWrittenProperty = Generator.CONFIG_PREFIX + 
generatorName;
+        KogitoBuildContext kogitoBuildContextMocked = 
Mockito.mock(KogitoBuildContext.class);
+        CodeGenManagerUtil.overwritePropertyIfNeeded(kogitoBuildContextMocked, 
generatorName, propertyValue);
+        Mockito.verify(kogitoBuildContextMocked, 
Mockito.never()).setApplicationProperty(expectedWrittenProperty, propertyValue);
+    }
+
+    @ParameterizedTest
+    @MethodSource("getGeneratorNamesStream")
+    void overwritePropertyIfNeededWithNull(String generatorName) {
+        String propertyValue = null;
+        String expectedWrittenProperty = Generator.CONFIG_PREFIX + 
generatorName;
+        KogitoBuildContext kogitoBuildContextMocked = 
Mockito.mock(KogitoBuildContext.class);
+        CodeGenManagerUtil.overwritePropertyIfNeeded(kogitoBuildContextMocked, 
generatorName, propertyValue);
+        Mockito.verify(kogitoBuildContextMocked, 
Mockito.never()).setApplicationProperty(expectedWrittenProperty, propertyValue);
+    }
+
+    static Stream<String> getGeneratorNamesStream() {
+        return generatorNames.stream();
+    }
+}
diff --git a/kogito-codegen-modules/pom.xml b/kogito-codegen-modules/pom.xml
index 942697d379..9ab6872eae 100644
--- a/kogito-codegen-modules/pom.xml
+++ b/kogito-codegen-modules/pom.xml
@@ -36,14 +36,15 @@
   <name>Kogito :: Codegen Modules</name>
 
   <modules>
-    <module>kogito-codegen-core</module>
     <module>kogito-codegen-api</module>
+    <module>kogito-codegen-core</module>
+    <module>kogito-codegen-decisions</module>
+    <module>kogito-codegen-integration-tests</module>
+    <module>kogito-codegen-manager</module>
+    <module>kogito-codegen-predictions</module>
     <module>kogito-codegen-processes</module>
     <module>kogito-codegen-processes-integration-tests</module>
     <module>kogito-codegen-rules</module>
-    <module>kogito-codegen-decisions</module>
-    <module>kogito-codegen-predictions</module>
-    <module>kogito-codegen-integration-tests</module>
     <module>kogito-codegen-sample</module>
   </modules>
 
diff --git a/kogito-maven-plugin-test/pom.xml b/kogito-maven-plugin-test/pom.xml
index b125e8a525..52dbda08d9 100644
--- a/kogito-maven-plugin-test/pom.xml
+++ b/kogito-maven-plugin-test/pom.xml
@@ -32,7 +32,7 @@
   </parent>
 
   <artifactId>kogito-maven-plugin-test</artifactId>
-
+  <name>Kogito :: Maven Plugin :: Test</name>
 
   <properties>
     <java.module.name>org.kie.kogito.maven.plugin.testing</java.module.name>
diff --git a/kogito-maven-plugin/README.md b/kogito-maven-plugin/README.md
new file mode 100644
index 0000000000..bae92dfa2a
--- /dev/null
+++ b/kogito-maven-plugin/README.md
@@ -0,0 +1,55 @@
+<!--
+  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.
+  -->
+
+# Kogito Maven Plugin
+
+This Maven plugin aims to manage the code generation assets during the compile 
time of a Kogito application.
+
+Supported frameworks of this plugin are:
+- Apache KIE plain Java projects;
+- Apache KIE Springboot based projects;
+
+During the execution, the plugin will discover all Apache KIE assets, which 
are:
+- Decisions (DMN);
+- Predictions (PMML);
+- Processes (BPMN);
+- Rules (DRL)
+  
+and will generate and compile all the Java Classes auto-generated by the 
Kogito Codegen layer 
+(see the `kogito-coden-modules`) that are mandatory for a correct Kogito 
application operation.
+
+## How to use it
+
+In your Kogito project root `pom.xml` file, add the following plugin 
declaration:
+
+```      
+<plugin>
+    <groupId>org.kie.kogito</groupId>
+    <artifactId>kogito-maven-plugin</artifactId>
+    <version>${version.org.kie.kogito}</version>
+    <executions>
+        <execution>
+            <phase>compile</phase>
+            <goals>
+              <goal>generateModel</goal>
+            </goals>
+        </execution>
+    </executions>
+</plugin>
+```
\ No newline at end of file
diff --git a/kogito-maven-plugin/pom.xml b/kogito-maven-plugin/pom.xml
index 8fe97c300b..566bc96bb8 100644
--- a/kogito-maven-plugin/pom.xml
+++ b/kogito-maven-plugin/pom.xml
@@ -53,13 +53,6 @@
 
   <dependencyManagement>
     <dependencies>
-      <dependency>
-        <groupId>org.kie.kogito</groupId>
-        <artifactId>kogito-pmml-dependencies</artifactId>
-        <version>${project.version}</version>
-        <type>pom</type>
-        <scope>import</scope>
-      </dependency>
       <dependency>
         <groupId>org.kie.kogito</groupId>
         <artifactId>kogito-kie-bom</artifactId>
@@ -71,102 +64,72 @@
   </dependencyManagement>
 
   <dependencies>
+    <!-- Internal dependencies -->
     <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven.plugin-tools</groupId>
-      <artifactId>maven-plugin-annotations</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-core</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-      <scope>provided</scope>
+      <groupId>org.drools</groupId>
+      <artifactId>drools-codegen-common</artifactId>
     </dependency>
-
     <dependency>
-      <groupId>com.google.protobuf</groupId>
-      <artifactId>protobuf-java</artifactId>
+      <groupId>org.drools</groupId>
+      <artifactId>drools-compiler</artifactId>
     </dependency>
-    <!-- Internal dependencies -->
     <dependency>
-      <groupId>org.kie.kogito</groupId>
-      <artifactId>kogito-drools</artifactId>
+      <groupId>org.drools</groupId>
+      <artifactId>drools-decisiontables</artifactId>
+      <scope>runtime</scope>
     </dependency>
     <dependency>
       <groupId>org.drools</groupId>
-      <artifactId>drools-model-compiler</artifactId>
+      <artifactId>drools-util</artifactId>
     </dependency>
-
     <dependency>
       <groupId>org.kie.kogito</groupId>
       <artifactId>kogito-api</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-    </dependency>
     <dependency>
       <groupId>org.kie.kogito</groupId>
-      <artifactId>kogito-dmn</artifactId>
+      <artifactId>kogito-codegen-api</artifactId>
     </dependency>
-    <!-- PMML -->
     <dependency>
       <groupId>org.kie.kogito</groupId>
-      <artifactId>kogito-pmml-dependencies</artifactId>
-      <type>pom</type>
+      <artifactId>kogito-codegen-manager</artifactId>
     </dependency>
 
+    <!-- 3rd party dependencies -->
     <dependency>
-      <groupId>org.drools</groupId>
-      <artifactId>drools-decisiontables</artifactId>
-    </dependency>
-
-    <!-- codegen dependencies -->
-    <dependency>
-      <groupId>org.kie.kogito</groupId>
-      <artifactId>kogito-codegen-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.kie.kogito</groupId>
-      <artifactId>kogito-codegen-processes</artifactId>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-artifact</artifactId>
+      <scope>provided</scope>
     </dependency>
     <dependency>
-      <groupId>org.kie.kogito</groupId>
-      <artifactId>kogito-codegen-rules</artifactId>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-core</artifactId>
+      <scope>provided</scope>
     </dependency>
     <dependency>
-      <groupId>org.kie.kogito</groupId>
-      <artifactId>kogito-codegen-decisions</artifactId>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-model</artifactId>
+      <scope>provided</scope>
     </dependency>
     <dependency>
-      <groupId>org.kie.kogito</groupId>
-      <artifactId>kogito-codegen-predictions</artifactId>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-plugin-api</artifactId>
+      <scope>provided</scope>
     </dependency>
-    <!-- code generation for executable model -->
     <dependency>
-      <groupId>com.github.javaparser</groupId>
-      <artifactId>javaparser-core</artifactId>
+      <groupId>org.apache.maven.plugin-tools</groupId>
+      <artifactId>maven-plugin-annotations</artifactId>
+      <scope>provided</scope>
     </dependency>
-
-    <!-- classpath scanning -->
     <dependency>
-      <groupId>org.reflections</groupId>
-      <artifactId>reflections</artifactId>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
     </dependency>
 
     <!-- Test -->
     <dependency>
-      <groupId>ch.qos.logback</groupId>
-      <artifactId>logback-classic</artifactId>
+      <groupId>org.assertj</groupId>
+      <artifactId>assertj-core</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -175,21 +138,20 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.junit.jupiter</groupId>
-      <artifactId>junit-jupiter-engine</artifactId>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.junit.jupiter</groupId>
-      <artifactId>junit-jupiter-params</artifactId>
+      <groupId>org.apache.maven.plugin-testing</groupId>
+      <artifactId>maven-plugin-testing-harness</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.maven.plugin-testing</groupId>
-      <artifactId>maven-plugin-testing-harness</artifactId>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
       <scope>test</scope>
     </dependency>
   </dependencies>
 
-
 </project>
diff --git 
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/AbstractKieMojo.java
 
b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/AbstractKieMojo.java
index 1833ae35c0..ee16a43a10 100644
--- 
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/AbstractKieMojo.java
+++ 
b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/AbstractKieMojo.java
@@ -19,45 +19,23 @@
 package org.kie.kogito.maven.plugin;
 
 import java.io.File;
-import java.lang.reflect.Modifier;
-import java.net.URL;
-import java.net.URLClassLoader;
 import java.nio.file.Path;
-import java.util.Iterator;
 import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.Predicate;
 
-import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
-import org.drools.codegen.common.AppPaths;
-import org.drools.codegen.common.DroolsModelBuildContext;
 import org.drools.codegen.common.GeneratedFileWriter;
-import org.kie.kogito.KogitoGAV;
-import org.kie.kogito.codegen.api.Generator;
-import org.kie.kogito.codegen.api.context.KogitoBuildContext;
-import org.kie.kogito.codegen.api.context.impl.JavaKogitoBuildContext;
-import org.kie.kogito.codegen.api.context.impl.QuarkusKogitoBuildContext;
-import org.kie.kogito.codegen.api.context.impl.SpringBootKogitoBuildContext;
-import org.kie.kogito.codegen.decision.DecisionCodegen;
-import org.kie.kogito.codegen.prediction.PredictionCodegen;
-import org.kie.kogito.codegen.process.ProcessCodegen;
-import org.kie.kogito.codegen.process.persistence.PersistenceGenerator;
-import org.kie.kogito.codegen.rules.RuleCodegen;
+import org.kie.kogito.codegen.manager.util.CodeGenManagerUtil;
 import org.kie.kogito.maven.plugin.util.MojoUtil;
-import org.reflections.Reflections;
-import org.reflections.util.ConfigurationBuilder;
 
 public abstract class AbstractKieMojo extends AbstractMojo {
 
-    protected static final GeneratedFileWriter.Builder 
generatedFileWriterBuilder = GeneratedFileWriter.builder("kogito", 
"kogito.codegen.resources.directory", "kogito.codegen.sources.directory");
+    protected static final GeneratedFileWriter.Builder 
GENERATED_FILE_WRITER_BUILDER = GeneratedFileWriter.builder("kogito", 
"kogito.codegen.resources.directory", "kogito.codegen.sources.directory");
 
     @Parameter(required = true, defaultValue = "${project.basedir}")
-    protected File projectDir;
+    protected File projectBaseDir;
 
     @Parameter
     protected Map<String, String> properties;
@@ -65,6 +43,9 @@ public abstract class AbstractKieMojo extends AbstractMojo {
     @Parameter(required = true, defaultValue = "${project}")
     protected MavenProject project;
 
+    @Parameter(required = true, defaultValue = 
"${project.build.sourceEncoding}")
+    protected String projectSourceEncoding;
+
     @Parameter(required = true, defaultValue = 
"${project.build.outputDirectory}")
     protected File outputDirectory;
 
@@ -86,10 +67,7 @@ public abstract class AbstractKieMojo extends AbstractMojo {
     @Parameter(property = "kogito.codegen.predictions")
     protected String generatePredictions;
 
-    private Reflections reflections;
-
     protected void setSystemProperties(Map<String, String> properties) {
-
         if (properties != null) {
             getLog().debug("Additional system properties: " + properties);
             for (Map.Entry<String, String> property : properties.entrySet()) {
@@ -99,52 +77,6 @@ public abstract class AbstractKieMojo extends AbstractMojo {
         }
     }
 
-    protected KogitoBuildContext discoverKogitoRuntimeContext(ClassLoader 
classLoader) {
-        AppPaths appPaths = AppPaths.fromProjectDir(projectDir.toPath());
-        KogitoBuildContext context = contextBuilder()
-                .withClassAvailabilityResolver(this::hasClassOnClasspath)
-                
.withClassSubTypeAvailabilityResolver(classSubTypeAvailabilityResolver())
-                .withApplicationProperties(appPaths.getResourceFiles())
-                .withPackageName(appPackageName())
-                .withClassLoader(classLoader)
-                .withAppPaths(appPaths)
-                .withGAV(new KogitoGAV(project.getGroupId(), 
project.getArtifactId(), project.getVersion()))
-                .build();
-
-        additionalProperties(context);
-        return context;
-    }
-
-    protected Reflections getReflections() throws MojoExecutionException {
-        if (reflections == null) {
-            URLClassLoader classLoader = (URLClassLoader) projectClassLoader();
-            ConfigurationBuilder builder = new ConfigurationBuilder();
-            builder.addUrls(classLoader.getURLs());
-            builder.addClassLoaders(classLoader);
-            reflections = new Reflections(builder);
-        }
-        return reflections;
-    }
-
-    protected Reflections getReflections(ClassLoader toAdd) throws 
MojoExecutionException {
-        URLClassLoader classLoader = (URLClassLoader) projectClassLoader();
-        ConfigurationBuilder builder = new ConfigurationBuilder();
-        builder.addUrls(classLoader.getURLs());
-        builder.addClassLoaders(classLoader, toAdd);
-        return new Reflections(builder);
-    }
-
-    protected Predicate<Class<?>> classSubTypeAvailabilityResolver() {
-        return clazz -> {
-            try {
-                return getReflections().getSubTypesOf(clazz).stream()
-                        .anyMatch(c -> !c.isInterface() && 
!Modifier.isAbstract(c.getModifiers()));
-            } catch (MojoExecutionException e) {
-                throw new RuntimeException(e);
-            }
-        };
-    }
-
     protected ClassLoader projectClassLoader() throws MojoExecutionException {
         ClassLoader contextClassLoader = 
Thread.currentThread().getContextClassLoader();
         return MojoUtil.createProjectClassLoader(contextClassLoader,
@@ -153,127 +85,23 @@ public abstract class AbstractKieMojo extends 
AbstractMojo {
                 null);
     }
 
-    protected String appPackageName() {
-        return DroolsModelBuildContext.DEFAULT_PACKAGE_NAME;
-    }
-
-    private void additionalProperties(KogitoBuildContext context) {
-
-        classToCheckForREST().ifPresent(restClass -> {
-            if (!context.hasClassAvailable(restClass)) {
-                getLog().info("Disabling REST generation because class '" + 
restClass + "' is not available");
-                
context.setApplicationProperty(DroolsModelBuildContext.KOGITO_GENERATE_REST, 
"false");
-            }
-        });
-        classToCheckForDI().ifPresent(diClass -> {
-            if (!context.hasClassAvailable(diClass)) {
-                getLog().info("Disabling dependency injection generation 
because class '" + diClass + "' is not available");
-                
context.setApplicationProperty(DroolsModelBuildContext.KOGITO_GENERATE_DI, 
"false");
-            }
-        });
-
-        overwritePropertiesIfNeeded(context);
-    }
-
-    void overwritePropertiesIfNeeded(KogitoBuildContext context) {
-        overwritePropertyIfNeeded(context, RuleCodegen.GENERATOR_NAME, 
generateRules);
-        overwritePropertyIfNeeded(context, ProcessCodegen.GENERATOR_NAME, 
generateProcesses);
-        overwritePropertyIfNeeded(context, PredictionCodegen.GENERATOR_NAME, 
generatePredictions);
-        overwritePropertyIfNeeded(context, DecisionCodegen.GENERATOR_NAME, 
generateDecisions);
-        overwritePropertyIfNeeded(context, 
PersistenceGenerator.GENERATOR_NAME, Boolean.toString(persistence));
-    }
-
-    static void overwritePropertyIfNeeded(KogitoBuildContext context, String 
generatorName, String propertyValue) {
-        if (propertyValue != null && !propertyValue.isEmpty()) {
-            context.setApplicationProperty(Generator.CONFIG_PREFIX + 
generatorName, propertyValue);
-        }
-    }
-
-    private KogitoBuildContext.Builder contextBuilder() {
-        switch (discoverFramework()) {
-            case QUARKUS:
-                return QuarkusKogitoBuildContext.builder();
-            case SPRING:
-                return SpringBootKogitoBuildContext.builder();
-            default:
-                return JavaKogitoBuildContext.builder();
-        }
-    }
-
-    private Optional<String> classToCheckForREST() {
-        switch (discoverFramework()) {
-            case QUARKUS:
-                return Optional.of(QuarkusKogitoBuildContext.QUARKUS_REST);
-            case SPRING:
-                return Optional.of(SpringBootKogitoBuildContext.SPRING_REST);
-            default:
-                return Optional.empty();
-        }
-    }
-
-    private Optional<String> classToCheckForDI() {
-        switch (discoverFramework()) {
-            case QUARKUS:
-                return Optional.of(QuarkusKogitoBuildContext.QUARKUS_DI);
-            case SPRING:
-                return Optional.of(SpringBootKogitoBuildContext.SPRING_DI);
-            default:
-                return Optional.empty();
-        }
-    }
-
-    private enum Framework {
-        QUARKUS,
-        SPRING,
-        NONE
-    }
-
-    private Framework discoverFramework() {
+    protected CodeGenManagerUtil.Framework discoverFramework() {
         if (hasDependency("quarkus")) {
-            return Framework.QUARKUS;
+            return CodeGenManagerUtil.Framework.QUARKUS;
         }
 
         if (hasDependency("spring")) {
-            return Framework.SPRING;
+            return CodeGenManagerUtil.Framework.SPRING;
         }
 
-        return Framework.NONE;
+        return CodeGenManagerUtil.Framework.NONE;
     }
 
     private boolean hasDependency(String dependency) {
         return project.getDependencies().stream().anyMatch(d -> 
d.getArtifactId().contains(dependency));
     }
 
-    private boolean hasClassOnClasspath(String className) {
-        try {
-            Set<Artifact> elements = project.getArtifacts();
-            URL[] urls = new URL[elements.size()];
-
-            int i = 0;
-            Iterator<Artifact> it = elements.iterator();
-            while (it.hasNext()) {
-                Artifact artifact = it.next();
-
-                urls[i] = artifact.getFile().toURI().toURL();
-                i++;
-            }
-            try (URLClassLoader cl = new URLClassLoader(urls)) {
-                cl.loadClass(className);
-            }
-            return true;
-        } catch (Exception e) {
-            return false;
-        }
-    }
-
-    protected File getSourcesPath() {
-        // using runtime BT instead of static AppPaths.MAVEN to allow
-        // invocation from GRADLE
-        return Path.of(baseDir.getAbsolutePath(), 
AppPaths.BT.GENERATED_SOURCES_PATH.toString()).toFile();
-    }
-
     protected GeneratedFileWriter getGeneratedFileWriter() {
-        return generatedFileWriterBuilder
-                .build(Path.of(baseDir.getAbsolutePath()));
+        return 
GENERATED_FILE_WRITER_BUILDER.build(Path.of(baseDir.getAbsolutePath()));
     }
 }
diff --git 
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/GenerateModelMojo.java
 
b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/GenerateModelMojo.java
index 50be9c2a7e..62cce9a250 100644
--- 
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/GenerateModelMojo.java
+++ 
b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/GenerateModelMojo.java
@@ -18,22 +18,14 @@
  */
 package org.kie.kogito.maven.plugin;
 
-import java.io.IOException;
-import java.io.UncheckedIOException;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.PathMatcher;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.stream.Stream;
 
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
@@ -41,15 +33,18 @@ import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.maven.project.MavenProject;
 import org.drools.codegen.common.GeneratedFile;
+import org.kie.kogito.KogitoGAV;
 import org.kie.kogito.codegen.api.context.KogitoBuildContext;
-import org.kie.kogito.maven.plugin.util.CompilerHelper;
-import org.kie.kogito.maven.plugin.util.GenerateModelHelper;
-import org.kie.kogito.maven.plugin.util.PersistenceGenerationHelper;
-import org.reflections.Reflections;
+import org.kie.kogito.codegen.manager.CompilerHelper;
+import org.kie.kogito.codegen.manager.GenerateModelHelper;
+import org.kie.kogito.codegen.manager.processes.PersistenceGenerationHelper;
+import org.kie.kogito.codegen.manager.util.CodeGenManagerUtil;
+import org.kie.kogito.maven.plugin.util.MojoUtil;
 
 import static 
org.kie.efesto.common.api.constants.Constants.INDEXFILE_DIRECTORY_PROPERTY;
-import static org.kie.kogito.maven.plugin.util.CompilerHelper.RESOURCES;
-import static org.kie.kogito.maven.plugin.util.CompilerHelper.SOURCES;
+import static org.kie.kogito.codegen.manager.CompilerHelper.RESOURCES;
+import static org.kie.kogito.codegen.manager.CompilerHelper.SOURCES;
+import static 
org.kie.kogito.codegen.manager.util.CodeGenManagerUtil.discoverKogitoRuntimeContext;
 
 @Mojo(name = "generateModel",
         requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME,
@@ -58,8 +53,6 @@ import static 
org.kie.kogito.maven.plugin.util.CompilerHelper.SOURCES;
         threadSafe = true)
 public class GenerateModelMojo extends AbstractKieMojo {
 
-    public static final PathMatcher drlFileMatcher = 
FileSystems.getDefault().getPathMatcher("glob:**.drl");
-
     /**
      * Partial generation can be used when reprocessing a pre-compiled project
      * for faster code-generation. It only generates code for rules and 
processes,
@@ -83,11 +76,17 @@ public class GenerateModelMojo extends AbstractKieMojo {
 
     /**
      * The <code>maven-compiler-plugin</code> version to use.
-     * Default to <b>3.8.1</b>
+     * Default to <b>3.10.2</b>
      */
-    @Parameter(defaultValue = "3.8.1", property = "version.compiler.plugin")
+    @Parameter(defaultValue = "3.10.2", property = "version.compiler.plugin")
     private String compilerPluginVersion;
 
+    @Parameter(defaultValue = "17", property = "maven.compiler.source")
+    private String compilerSourceJavaVersion;
+
+    @Parameter(defaultValue = "17", property = "maven.compiler.target")
+    private String compilerTargetJavaVersion;
+
     @Component
     private MavenProject mavenProject;
 
@@ -96,9 +95,12 @@ public class GenerateModelMojo extends AbstractKieMojo {
 
     @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
-        // TODO to be removed with DROOLS-7090
+        getLog().debug("Compiler Target Java Version:" + 
compilerTargetJavaVersion);
+        getLog().debug("Compiler Source Java Version:" + 
compilerSourceJavaVersion);
+        getLog().debug("Compiler Source Encoding:" + projectSourceEncoding);
+        getLog().debug("Targeting directory: " + outputDirectory);
+
         boolean indexFileDirectorySet = false;
-        getLog().debug("execute -> " + outputDirectory);
         if (outputDirectory == null) {
             throw new MojoExecutionException("${project.build.directory} is 
null");
         }
@@ -109,30 +111,44 @@ public class GenerateModelMojo extends AbstractKieMojo {
         addCompileSourceRoots();
         Map<String, Collection<GeneratedFile>> generatedModelFiles;
         ClassLoader projectClassLoader = projectClassLoader();
-        KogitoBuildContext kogitoBuildContext = 
discoverKogitoRuntimeContext(projectClassLoader);
+        KogitoBuildContext kogitoBuildContext = 
getKogitoBuildContext(projectClassLoader);
         if (isOnDemand()) {
             getLog().info("On-Demand Mode is On. Use mvn compile 
kogito:scaffold");
             generatedModelFiles = new HashMap<>();
         } else {
             generatedModelFiles = generateModel(kogitoBuildContext);
         }
-        // TODO to be removed with DROOLS-7090
         if (indexFileDirectorySet) {
             System.clearProperty(INDEXFILE_DIRECTORY_PROPERTY);
         }
 
         // Compile and write model files
-        compileAndDump(generatedModelFiles, projectClassLoader, getLog());
+        compileAndDump(generatedModelFiles, projectClassLoader);
 
-        Map<String, Collection<GeneratedFile>> generatedPersistenceFiles = 
generatePersistence(kogitoBuildContext, getReflections(projectClassLoader));
+        Map<String, Collection<GeneratedFile>> generatedPersistenceFiles = 
generatePersistence(kogitoBuildContext, projectClassLoader);
 
-        compileAndDump(generatedPersistenceFiles, projectClassLoader, 
getLog());
+        compileAndDump(generatedPersistenceFiles, projectClassLoader);
 
         if (!keepSources) {
-            deleteDrlFiles();
+            CodeGenManagerUtil.deleteDrlFiles(outputDirectory.toPath());
         }
     }
 
+    KogitoBuildContext getKogitoBuildContext(ClassLoader projectClassLoader) {
+        return discoverKogitoRuntimeContext(projectClassLoader,
+                projectBaseDir.toPath(),
+                new KogitoGAV(project.getGroupId(),
+                        project.getArtifactId(),
+                        project.getVersion()),
+                new CodeGenManagerUtil.ProjectParameters(discoverFramework(),
+                        generateDecisions,
+                        generatePredictions,
+                        generateProcesses,
+                        generateRules,
+                        persistence),
+                className -> MojoUtil.hasClassOnClasspath(project, className));
+    }
+
     protected boolean isOnDemand() {
         return onDemand;
     }
@@ -146,30 +162,24 @@ public class GenerateModelMojo extends AbstractKieMojo {
         return GenerateModelHelper.generateModelFiles(kogitoBuildContext, 
generatePartial);
     }
 
-    protected Map<String, Collection<GeneratedFile>> 
generatePersistence(KogitoBuildContext kogitoBuildContext, Reflections 
reflections) throws MojoExecutionException {
-        return 
PersistenceGenerationHelper.generatePersistenceFiles(kogitoBuildContext, 
reflections, schemaVersion);
-    }
-
-    protected void compileAndDump(Map<String, Collection<GeneratedFile>> 
generatedFiles, ClassLoader classloader, Log log) throws MojoExecutionException 
{
-        // Compile and write files
-        
CompilerHelper.dumpAndCompileGeneratedSources(generatedFiles.get(SOURCES), 
classloader, project, baseDir, log);
-        // Dump resources
-        CompilerHelper.dumpResources(generatedFiles.get(RESOURCES), baseDir, 
log);
+    protected Map<String, Collection<GeneratedFile>> 
generatePersistence(KogitoBuildContext kogitoBuildContext, ClassLoader 
projectClassloader) {
+        return 
PersistenceGenerationHelper.generatePersistenceFiles(kogitoBuildContext, 
projectClassloader, schemaVersion);
     }
 
-    private void deleteDrlFiles() throws MojoExecutionException {
-        // Remove drl files
-        try (final Stream<Path> drlFiles = 
Files.find(outputDirectory.toPath(), Integer.MAX_VALUE,
-                (p, f) -> drlFileMatcher.matches(p))) {
-            drlFiles.forEach(p -> {
-                try {
-                    Files.delete(p);
-                } catch (IOException e) {
-                    throw new UncheckedIOException(e);
-                }
-            });
-        } catch (IOException e) {
-            throw new MojoExecutionException("Unable to find .drl files");
+    protected void compileAndDump(Map<String, Collection<GeneratedFile>> 
generatedFiles, ClassLoader classloader) throws MojoExecutionException {
+        try {
+            // Compile and write files
+            
CompilerHelper.compileAndDumpGeneratedSources(generatedFiles.get(SOURCES),
+                    classloader,
+                    project.getRuntimeClasspathElements(),
+                    baseDir,
+                    projectSourceEncoding,
+                    compilerSourceJavaVersion,
+                    compilerTargetJavaVersion);
+            // Dump resources
+            CompilerHelper.dumpResources(generatedFiles.get(RESOURCES), 
baseDir);
+        } catch (Exception e) {
+            throw new MojoExecutionException("Error during processing model 
classes: " + e.getMessage(), e);
         }
     }
 }
diff --git 
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/ScaffoldMojo.java
 
b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/ScaffoldMojo.java
index 72c1b3e003..8bdd9d45b2 100644
--- 
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/ScaffoldMojo.java
+++ 
b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/ScaffoldMojo.java
@@ -42,7 +42,7 @@ public class ScaffoldMojo extends GenerateModelMojo {
     public void execute() throws MojoExecutionException {
         addCompileSourceRoots();
         ClassLoader projectClassLoader = projectClassLoader();
-        KogitoBuildContext kogitoBuildContext = 
discoverKogitoRuntimeContext(projectClassLoader);
+        KogitoBuildContext kogitoBuildContext = 
getKogitoBuildContext(projectClassLoader);
         generateModel(kogitoBuildContext);
     }
 
@@ -51,8 +51,4 @@ public class ScaffoldMojo extends GenerateModelMojo {
         return onDemand;
     }
 
-    @Override
-    protected File getSourcesPath() {
-        return customizableSources;
-    }
 }
diff --git 
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/MojoUtil.java
 
b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/MojoUtil.java
index 5700261014..94bc4cee80 100644
--- 
a/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/MojoUtil.java
+++ 
b/kogito-maven-plugin/src/main/java/org/kie/kogito/maven/plugin/util/MojoUtil.java
@@ -39,6 +39,7 @@ import org.drools.compiler.kie.builder.impl.ZipKieModule;
 import org.drools.compiler.kproject.models.KieModuleModelImpl;
 import org.kie.api.builder.ReleaseId;
 import org.kie.api.builder.model.KieModuleModel;
+import org.kie.kogito.codegen.manager.util.CodeGenManagerUtil;
 import org.kie.util.maven.support.ReleaseIdImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -107,6 +108,23 @@ public final class MojoUtil {
         return null;
     }
 
+    public static boolean hasClassOnClasspath(final MavenProject project, 
String className) {
+        try {
+            Set<Artifact> elements = project.getArtifacts();
+            URL[] urls = new URL[elements.size()];
+
+            int i = 0;
+            for (Artifact artifact : elements) {
+                urls[i] = artifact.getFile().toURI().toURL();
+                i++;
+            }
+
+            return CodeGenManagerUtil.isClassNameInUrlClassLoader(urls, 
className);
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
     private MojoUtil() {
         // Creating instances of util classes is forbidden.
     }
diff --git 
a/kogito-maven-plugin/src/test/java/org/kie/kogito/maven/plugin/AbstractKieMojoTest.java
 
b/kogito-maven-plugin/src/test/java/org/kie/kogito/maven/plugin/AbstractKieMojoTest.java
deleted file mode 100644
index 4ae94ebf39..0000000000
--- 
a/kogito-maven-plugin/src/test/java/org/kie/kogito/maven/plugin/AbstractKieMojoTest.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * 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.kie.kogito.maven.plugin;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Stream;
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.MethodSource;
-import org.kie.kogito.codegen.api.Generator;
-import org.kie.kogito.codegen.api.context.KogitoBuildContext;
-import org.kie.kogito.codegen.decision.DecisionCodegen;
-import org.kie.kogito.codegen.prediction.PredictionCodegen;
-import org.kie.kogito.codegen.process.ProcessCodegen;
-import org.kie.kogito.codegen.process.persistence.PersistenceGenerator;
-import org.kie.kogito.codegen.rules.RuleCodegen;
-
-import static 
org.kie.kogito.maven.plugin.AbstractKieMojo.overwritePropertyIfNeeded;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-class AbstractKieMojoTest {
-
-    private static final List<String> generatorNames;
-
-    static {
-        generatorNames = new ArrayList<>();
-        generatorNames.add(RuleCodegen.GENERATOR_NAME);
-        generatorNames.add(ProcessCodegen.GENERATOR_NAME);
-        generatorNames.add(PredictionCodegen.GENERATOR_NAME);
-        generatorNames.add(DecisionCodegen.GENERATOR_NAME);
-        generatorNames.add(PersistenceGenerator.GENERATOR_NAME);
-    }
-
-    @ParameterizedTest
-    @MethodSource("getGeneratorNamesStream")
-    void overwritePropertiesIfNeededWithNull(String generatorName) {
-        String expectedWrittenProperty = Generator.CONFIG_PREFIX + 
generatorName;
-        AbstractKieMojo abstractKieMojo = new AbstractKieMojo() {
-            @Override
-            public void execute() throws MojoExecutionException, 
MojoFailureException {
-            }
-        };
-        KogitoBuildContext kogitoBuildContextMocked = 
mock(KogitoBuildContext.class);
-        abstractKieMojo.overwritePropertiesIfNeeded(kogitoBuildContextMocked);
-        if (generatorName.equals(PersistenceGenerator.GENERATOR_NAME)) {
-            verify(kogitoBuildContextMocked, 
times(1)).setApplicationProperty(expectedWrittenProperty, "false"); // being a 
boolean property, it default to false
-        } else {
-            verify(kogitoBuildContextMocked, 
never()).setApplicationProperty(eq(expectedWrittenProperty), any());
-        }
-    }
-
-    @ParameterizedTest
-    @MethodSource("getGeneratorNamesStream")
-    void overwritePropertyIfNeededWithNotNull(String generatorName) {
-        String propertyValue = "notnull";
-        String expectedWrittenProperty = Generator.CONFIG_PREFIX + 
generatorName;
-        KogitoBuildContext kogitoBuildContextMocked = 
mock(KogitoBuildContext.class);
-        overwritePropertyIfNeeded(kogitoBuildContextMocked, generatorName, 
propertyValue);
-        verify(kogitoBuildContextMocked, 
times(1)).setApplicationProperty(expectedWrittenProperty, propertyValue);
-    }
-
-    @ParameterizedTest
-    @MethodSource("getGeneratorNamesStream")
-    void overwritePropertyIfNeededWithEmpty(String generatorName) {
-        String propertyValue = "";
-        String expectedWrittenProperty = Generator.CONFIG_PREFIX + 
generatorName;
-        KogitoBuildContext kogitoBuildContextMocked = 
mock(KogitoBuildContext.class);
-        overwritePropertyIfNeeded(kogitoBuildContextMocked, generatorName, 
propertyValue);
-        verify(kogitoBuildContextMocked, 
never()).setApplicationProperty(expectedWrittenProperty, propertyValue);
-    }
-
-    @ParameterizedTest
-    @MethodSource("getGeneratorNamesStream")
-    void overwritePropertyIfNeededWithNull(String generatorName) {
-        String propertyValue = null;
-        String expectedWrittenProperty = Generator.CONFIG_PREFIX + 
generatorName;
-        KogitoBuildContext kogitoBuildContextMocked = 
mock(KogitoBuildContext.class);
-        overwritePropertyIfNeeded(kogitoBuildContextMocked, generatorName, 
propertyValue);
-        verify(kogitoBuildContextMocked, 
never()).setApplicationProperty(expectedWrittenProperty, propertyValue);
-    }
-
-    static Stream<String> getGeneratorNamesStream() {
-        return generatorNames.stream();
-    }
-
-}
\ No newline at end of file
diff --git 
a/kogito-maven-plugin/src/test/java/org/kie/kogito/maven/plugin/GenerateModelMojoTest.java
 
b/kogito-maven-plugin/src/test/java/org/kie/kogito/maven/plugin/GenerateModelMojoTest.java
index fb009ed4e3..ddeb07214f 100644
--- 
a/kogito-maven-plugin/src/test/java/org/kie/kogito/maven/plugin/GenerateModelMojoTest.java
+++ 
b/kogito-maven-plugin/src/test/java/org/kie/kogito/maven/plugin/GenerateModelMojoTest.java
@@ -24,21 +24,19 @@ import java.util.HashSet;
 import java.util.Map;
 
 import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.plugin.testing.junit5.InjectMojo;
 import org.apache.maven.plugin.testing.junit5.MojoTest;
 import org.drools.codegen.common.GeneratedFile;
 import org.junit.jupiter.api.Test;
 import org.kie.kogito.codegen.api.context.KogitoBuildContext;
-import org.kie.kogito.maven.plugin.util.CompilerHelper;
-import org.kie.kogito.maven.plugin.util.GenerateModelHelper;
-import org.kie.kogito.maven.plugin.util.PersistenceGenerationHelper;
+import org.kie.kogito.codegen.manager.CompilerHelper;
+import org.kie.kogito.codegen.manager.GenerateModelHelper;
+import org.kie.kogito.codegen.manager.processes.PersistenceGenerationHelper;
 import org.mockito.MockedStatic;
-import org.reflections.Reflections;
 
 import static org.assertj.core.api.Fail.fail;
-import static org.kie.kogito.maven.plugin.util.CompilerHelper.RESOURCES;
-import static org.kie.kogito.maven.plugin.util.CompilerHelper.SOURCES;
+import static org.kie.kogito.codegen.manager.CompilerHelper.RESOURCES;
+import static org.kie.kogito.codegen.manager.CompilerHelper.SOURCES;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockStatic;
 import static org.mockito.Mockito.times;
@@ -48,8 +46,6 @@ class GenerateModelMojoTest {
 
     private static final KogitoBuildContext kogitoBuildContextMocked = 
mock(KogitoBuildContext.class);
     private static final ClassLoader classLoaderMocked = 
mock(ClassLoader.class);
-    private static final Reflections reflectionsMocked = 
mock(Reflections.class);
-    private static final Log logMocked = mock(Log.class);
 
     @Test
     @InjectMojo(goal = "generateModel", pom = 
"src/test/resources/unit/generate-model/pom.xml")
@@ -66,9 +62,9 @@ class GenerateModelMojoTest {
     void generatePersistence(GenerateModelMojo mojo) {
         commonSetup(mojo);
         try (MockedStatic<PersistenceGenerationHelper> 
persistenceGenerationHelperMockedStatic = 
mockStatic(PersistenceGenerationHelper.class)) {
-            mojo.generatePersistence(kogitoBuildContextMocked, 
reflectionsMocked);
-            persistenceGenerationHelperMockedStatic.verify(() -> 
PersistenceGenerationHelper.generatePersistenceFiles(kogitoBuildContextMocked, 
reflectionsMocked, mojo.schemaVersion), times(1));
-        } catch (MojoExecutionException e) {
+            mojo.generatePersistence(kogitoBuildContextMocked, 
classLoaderMocked);
+            persistenceGenerationHelperMockedStatic.verify(() -> 
PersistenceGenerationHelper.generatePersistenceFiles(kogitoBuildContextMocked, 
classLoaderMocked, mojo.schemaVersion), times(1));
+        } catch (Exception e) {
             fail(e.getMessage(), e);
         }
     }
@@ -81,9 +77,11 @@ class GenerateModelMojoTest {
             Collection<GeneratedFile> generatedSources = new HashSet<>();
             Collection<GeneratedFile> generatedResources = new HashSet<>();
             Map<String, Collection<GeneratedFile>> generatedFiles = 
Map.of(SOURCES, generatedSources, RESOURCES, generatedResources);
-            mojo.compileAndDump(generatedFiles, classLoaderMocked, logMocked);
-            compilerHelperMockedStatic.verify(() -> 
CompilerHelper.dumpAndCompileGeneratedSources(generatedSources, 
classLoaderMocked, mojo.project, mojo.baseDir, logMocked), times(1));
-            compilerHelperMockedStatic.verify(() -> 
CompilerHelper.dumpResources(generatedResources, mojo.baseDir, logMocked), 
times(1));
+            mojo.compileAndDump(generatedFiles, classLoaderMocked);
+            compilerHelperMockedStatic.verify(
+                    () -> 
CompilerHelper.compileAndDumpGeneratedSources(generatedSources, 
classLoaderMocked, mojo.project.getRuntimeClasspathElements(), mojo.baseDir, 
"UTF-8", "17", "17"),
+                    times(1));
+            compilerHelperMockedStatic.verify(() -> 
CompilerHelper.dumpResources(generatedResources, mojo.baseDir), times(1));
         } catch (MojoExecutionException e) {
             fail(e.getMessage(), e);
         }
@@ -92,6 +90,7 @@ class GenerateModelMojoTest {
     private void commonSetup(GenerateModelMojo mojo) {
         mojo.outputDirectory = new 
File(mojo.project.getModel().getBuild().getOutputDirectory());
         mojo.baseDir = mojo.project.getBasedir();
-        mojo.projectDir = mojo.project.getBasedir();
+        mojo.projectBaseDir = mojo.project.getBasedir();
+        mojo.projectSourceEncoding = "UTF-8";
     }
-}
\ No newline at end of file
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to