diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml
index 75e9146..a099855 100644
--- a/.github/workflows/main-build.yml
+++ b/.github/workflows/main-build.yml
@@ -31,4 +31,4 @@ jobs:
distribution: 'temurin'
cache: maven
- name: Build with Maven
- run: mvn -B package --file pom.xml
+ run: mvn -B install --file pom.xml
diff --git a/.github/workflows/pr-builds.yml b/.github/workflows/pr-builds.yml
index 122656c..1e9f5bd 100644
--- a/.github/workflows/pr-builds.yml
+++ b/.github/workflows/pr-builds.yml
@@ -52,4 +52,4 @@ jobs:
distribution: 'temurin'
cache: maven
- name: Build with Maven
- run: mvn -B package --file pom.xml
+ run: mvn -B install --file pom.xml
diff --git a/capabilities-archetypes/capabilities-archetypes-java-tool/pom.xml b/capabilities-archetypes/capabilities-archetypes-java-tool/pom.xml
index 9b75b6f..0e2af14 100644
--- a/capabilities-archetypes/capabilities-archetypes-java-tool/pom.xml
+++ b/capabilities-archetypes/capabilities-archetypes-java-tool/pom.xml
@@ -21,6 +21,13 @@
+
+
+ src/test/resources
+ true
+
+
+
@@ -30,5 +37,23 @@
+
+
+
+ org.apache.maven.plugins
+ maven-archetype-plugin
+
+ ${skipTests}
+
+
+
+ integration-test
+
+ integration-test
+
+
+
+
+
\ No newline at end of file
diff --git a/capabilities-archetypes/capabilities-archetypes-java-tool/src/main/resources/archetype-resources/pom.xml b/capabilities-archetypes/capabilities-archetypes-java-tool/src/main/resources/archetype-resources/pom.xml
index 69fac23..0ca515f 100644
--- a/capabilities-archetypes/capabilities-archetypes-java-tool/src/main/resources/archetype-resources/pom.xml
+++ b/capabilities-archetypes/capabilities-archetypes-java-tool/src/main/resources/archetype-resources/pom.xml
@@ -10,8 +10,8 @@
21
UTF-8
- 2.0.16
- 2.21.1
+ 2.0.17
+ 2.25.2
4.7.6
3.7.1
${wanaku-sdk-version}
@@ -37,10 +37,22 @@
+
+ ai.wanaku.sdk
+ capabilities-api
+
ai.wanaku.sdk
capabilities-common
+
+ ai.wanaku.sdk
+ capabilities-config-provider-api
+
+
+ ai.wanaku.sdk
+ capabilities-config-provider-file
+
ai.wanaku.sdk
capabilities-discovery
diff --git a/capabilities-archetypes/capabilities-archetypes-java-tool/src/main/resources/archetype-resources/src/main/java/App.java b/capabilities-archetypes/capabilities-archetypes-java-tool/src/main/resources/archetype-resources/src/main/java/App.java
index 43d87f9..bd8e9ee 100644
--- a/capabilities-archetypes/capabilities-archetypes-java-tool/src/main/resources/archetype-resources/src/main/java/App.java
+++ b/capabilities-archetypes/capabilities-archetypes-java-tool/src/main/resources/archetype-resources/src/main/java/App.java
@@ -1,17 +1,16 @@
package ${package};
-import java.util.concurrent.Callable;
import java.util.concurrent.Callable;
-import ai.wanaku.api.discovery.RegistrationManager;
-import ai.wanaku.api.types.providers.ServiceTarget;
+import ai.wanaku.capabilities.sdk.api.discovery.RegistrationManager;
+import ai.wanaku.capabilities.sdk.api.types.providers.ServiceTarget;
import ai.wanaku.capabilities.sdk.common.ServicesHelper;
+import ai.wanaku.capabilities.sdk.common.config.DefaultServiceConfig;
+import ai.wanaku.capabilities.sdk.common.serializer.JacksonSerializer;
import ai.wanaku.capabilities.sdk.discovery.DiscoveryServiceHttpClient;
import ai.wanaku.capabilities.sdk.discovery.ZeroDepRegistrationManager;
import ai.wanaku.capabilities.sdk.discovery.config.DefaultRegistrationConfig;
-import ai.wanaku.capabilities.sdk.discovery.config.DefaultServiceConfig;
import ai.wanaku.capabilities.sdk.discovery.deserializer.JacksonDeserializer;
-import ai.wanaku.capabilities.sdk.discovery.serializer.JacksonSerializer;
import ai.wanaku.capabilities.sdk.discovery.util.DiscoveryHelper;
import io.grpc.Grpc;
import io.grpc.InsecureServerCredentials;
@@ -21,8 +20,7 @@
import picocli.CommandLine;
/**
- * Hello world!
- *
+ * Main application class that handles service registration and gRPC server lifecycle.
*/
public class App implements Callable {
@CommandLine.Option(names = { "-h", "--help" }, usageHelp = true, description = "display a help message")
diff --git a/capabilities-archetypes/capabilities-archetypes-java-tool/src/main/resources/archetype-resources/src/main/java/ProvisionBase.java b/capabilities-archetypes/capabilities-archetypes-java-tool/src/main/resources/archetype-resources/src/main/java/ProvisionBase.java
index c7badd1..c2764da 100644
--- a/capabilities-archetypes/capabilities-archetypes-java-tool/src/main/resources/archetype-resources/src/main/java/ProvisionBase.java
+++ b/capabilities-archetypes/capabilities-archetypes-java-tool/src/main/resources/archetype-resources/src/main/java/ProvisionBase.java
@@ -1,9 +1,9 @@
package ${package};
+import ai.wanaku.capabilities.sdk.config.provider.api.ConfigProvisioner;
+import ai.wanaku.capabilities.sdk.config.provider.api.ProvisionedConfig;
import ai.wanaku.capabilities.sdk.runtime.provisioners.FileProvisionerLoader;
import ai.wanaku.capabilities.sdk.util.ProvisioningHelper;
-import ai.wanaku.core.config.provider.api.ProvisionedConfig;
-import ai.wanaku.core.config.provider.api.ConfigProvisioner;
import ai.wanaku.core.exchange.PropertySchema;
import ai.wanaku.core.exchange.ProvisionReply;
import ai.wanaku.core.exchange.ProvisionRequest;
diff --git a/capabilities-archetypes/capabilities-archetypes-java-tool/src/test/resources/projects/basic/archetype.properties b/capabilities-archetypes/capabilities-archetypes-java-tool/src/test/resources/projects/basic/archetype.properties
new file mode 100644
index 0000000..30022bb
--- /dev/null
+++ b/capabilities-archetypes/capabilities-archetypes-java-tool/src/test/resources/projects/basic/archetype.properties
@@ -0,0 +1,11 @@
+# Test properties for archetype integration test
+# These properties are passed to the archetype:generate goal
+
+# Required archetype properties
+groupId=ai.wanaku.test
+artifactId=test-tool
+version=1.0.0-SNAPSHOT
+package=ai.wanaku.test
+
+# Custom required property for this archetype
+wanaku-sdk-version=@project.version@
diff --git a/capabilities-archetypes/capabilities-archetypes-java-tool/src/test/resources/projects/basic/goal.txt b/capabilities-archetypes/capabilities-archetypes-java-tool/src/test/resources/projects/basic/goal.txt
new file mode 100644
index 0000000..ba3bd78
--- /dev/null
+++ b/capabilities-archetypes/capabilities-archetypes-java-tool/src/test/resources/projects/basic/goal.txt
@@ -0,0 +1 @@
+package
diff --git a/capabilities-archetypes/capabilities-archetypes-java-tool/src/test/resources/projects/basic/verify.groovy b/capabilities-archetypes/capabilities-archetypes-java-tool/src/test/resources/projects/basic/verify.groovy
new file mode 100644
index 0000000..0afe300
--- /dev/null
+++ b/capabilities-archetypes/capabilities-archetypes-java-tool/src/test/resources/projects/basic/verify.groovy
@@ -0,0 +1,93 @@
+/*
+ * 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.
+ */
+
+import java.io.File
+
+// Verify that the project was generated correctly
+// The archetype plugin generates projects in the 'project' subdirectory
+def projectDir = new File(basedir, "project/test-tool")
+
+// Check that the project directory exists
+assert projectDir.exists() : "Project directory was not created"
+assert projectDir.isDirectory() : "Project path is not a directory"
+
+// Check pom.xml exists
+def pomFile = new File(projectDir, "pom.xml")
+assert pomFile.exists() : "pom.xml was not created"
+assert pomFile.isFile() : "pom.xml is not a file"
+
+// Verify pom.xml content
+def pomContent = pomFile.text
+assert pomContent.contains("ai.wanaku.test") : "pom.xml does not contain correct groupId"
+assert pomContent.contains("test-tool") : "pom.xml does not contain correct artifactId"
+assert pomContent.contains("capabilities-bom") : "pom.xml does not reference capabilities-bom"
+assert pomContent.contains("capabilities-api") : "pom.xml does not include capabilities-api dependency"
+assert pomContent.contains("capabilities-common") : "pom.xml does not include capabilities-common dependency"
+assert pomContent.contains("capabilities-discovery") : "pom.xml does not include capabilities-discovery dependency"
+assert pomContent.contains("capabilities-exchange") : "pom.xml does not include capabilities-exchange dependency"
+assert pomContent.contains("capabilities-runtime") : "pom.xml does not include capabilities-runtime dependency"
+assert pomContent.contains("capabilities-config-provider-api") : "pom.xml does not include capabilities-config-provider-api dependency"
+assert pomContent.contains("capabilities-config-provider-file") : "pom.xml does not include capabilities-config-provider-file dependency"
+
+// Verify correct dependency versions
+assert pomContent.contains("2.0.17") : "pom.xml has outdated slf4j version"
+assert pomContent.contains("2.25.2") : "pom.xml has outdated log4j version"
+
+// Check source directory structure
+def srcMainJava = new File(projectDir, "src/main/java/ai/wanaku/test")
+assert srcMainJava.exists() : "Source directory was not created"
+assert srcMainJava.isDirectory() : "Source path is not a directory"
+
+// Check that Java files were generated
+def appFile = new File(srcMainJava, "App.java")
+assert appFile.exists() : "App.java was not created"
+assert appFile.isFile() : "App.java is not a file"
+
+def appToolFile = new File(srcMainJava, "AppTool.java")
+assert appToolFile.exists() : "AppTool.java was not created"
+assert appToolFile.isFile() : "AppTool.java is not a file"
+
+def provisionBaseFile = new File(srcMainJava, "ProvisionBase.java")
+assert provisionBaseFile.exists() : "ProvisionBase.java was not created"
+assert provisionBaseFile.isFile() : "ProvisionBase.java is not a file"
+
+// Verify App.java has correct package and imports
+def appContent = appFile.text
+assert appContent.contains("package ai.wanaku.test;") : "App.java has wrong package"
+assert appContent.contains("import ai.wanaku.capabilities.sdk.api.discovery.RegistrationManager;") : "App.java has wrong RegistrationManager import"
+assert appContent.contains("import ai.wanaku.capabilities.sdk.api.types.providers.ServiceTarget;") : "App.java has wrong ServiceTarget import"
+assert appContent.contains("import ai.wanaku.capabilities.sdk.common.config.DefaultServiceConfig;") : "App.java has wrong DefaultServiceConfig import"
+assert appContent.contains("import ai.wanaku.capabilities.sdk.common.serializer.JacksonSerializer;") : "App.java has wrong JacksonSerializer import"
+assert !appContent.contains("import java.util.concurrent.Callable;\nimport java.util.concurrent.Callable;") : "App.java has duplicate imports"
+
+// Verify ProvisionBase.java has correct imports
+def provisionContent = provisionBaseFile.text
+assert provisionContent.contains("package ai.wanaku.test;") : "ProvisionBase.java has wrong package"
+assert provisionContent.contains("import ai.wanaku.capabilities.sdk.config.provider.api.ConfigProvisioner;") : "ProvisionBase.java has wrong ConfigProvisioner import"
+assert provisionContent.contains("import ai.wanaku.capabilities.sdk.config.provider.api.ProvisionedConfig;") : "ProvisionBase.java has wrong ProvisionedConfig import"
+
+// Check that the target directory exists (build was successful)
+def targetDir = new File(projectDir, "target")
+assert targetDir.exists() : "Target directory does not exist - build may have failed"
+
+// Check that the fat JAR was created
+def jarFile = new File(targetDir, "test-tool-app.jar")
+assert jarFile.exists() : "Fat JAR was not created: ${jarFile.absolutePath}"
+
+println "All archetype verification checks passed!"