diff --git a/CHANGELOG.md b/CHANGELOG.md
index ad582a5..57c84cc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,8 @@ Following [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [Semantic
### Changed
+- Derive qbit metadata version from the Maven artifact version, keeping release metadata and help bundle versions in sync.
+
- Require QQQ 4.1.0-RC.7 for core help-bundle registration and coverage validation.
- X12 routing and sending honor identity `isActive`, matching EDIFACT.
diff --git a/pom.xml b/pom.xml
index 1ba5774..1323f06 100644
--- a/pom.xml
+++ b/pom.xml
@@ -133,6 +133,7 @@
true
help/*.yaml
+ qbit-edi.properties
@@ -140,6 +141,7 @@
false
help/*.yaml
+ qbit-edi.properties
diff --git a/src/main/java/com/kingsrook/qbits/edi/EdiQBitProducer.java b/src/main/java/com/kingsrook/qbits/edi/EdiQBitProducer.java
index 1cb0f62..8ebe205 100644
--- a/src/main/java/com/kingsrook/qbits/edi/EdiQBitProducer.java
+++ b/src/main/java/com/kingsrook/qbits/edi/EdiQBitProducer.java
@@ -21,6 +21,9 @@
package com.kingsrook.qbits.edi;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.metadata.MetaDataProducerMultiOutput;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
@@ -37,13 +40,41 @@ public class EdiQBitProducer implements QBitMetaDataProducer
{
public static final String GROUP_ID = "com.kingsrook.qbits";
public static final String ARTIFACT_ID = "qbit-edi";
- public static final String VERSION = "0.1.0";
+ public static final String VERSION = loadVersion();
private EdiQBitConfig qBitConfig;
private String namespace;
+ /*******************************************************************************
+ ** Read the artifact version from the Maven-filtered resource.
+ *******************************************************************************/
+ private static String loadVersion()
+ {
+ try(InputStream inputStream = EdiQBitProducer.class.getClassLoader().getResourceAsStream("qbit-edi.properties"))
+ {
+ if(inputStream == null)
+ {
+ throw new IllegalStateException("Missing qbit-edi.properties; build with Maven to supply the artifact version");
+ }
+ Properties properties = new Properties();
+ properties.load(inputStream);
+ String version = properties.getProperty("version");
+ if(version == null || version.isBlank() || version.contains("${"))
+ {
+ throw new IllegalStateException("Missing or unfiltered version in qbit-edi.properties; build with Maven");
+ }
+ return (version);
+ }
+ catch(IOException e)
+ {
+ throw new IllegalStateException("Could not read the artifact version from qbit-edi.properties", e);
+ }
+ }
+
+
+
/*******************************************************************************
** Fluent configuration setter.
*******************************************************************************/
diff --git a/src/main/resources/qbit-edi.properties b/src/main/resources/qbit-edi.properties
new file mode 100644
index 0000000..defbd48
--- /dev/null
+++ b/src/main/resources/qbit-edi.properties
@@ -0,0 +1 @@
+version=${project.version}
diff --git a/src/test/java/com/kingsrook/qbits/edi/EdiHelpBundleTest.java b/src/test/java/com/kingsrook/qbits/edi/EdiHelpBundleTest.java
index 540e1d3..67c09de 100644
--- a/src/test/java/com/kingsrook/qbits/edi/EdiHelpBundleTest.java
+++ b/src/test/java/com/kingsrook/qbits/edi/EdiHelpBundleTest.java
@@ -49,7 +49,7 @@ class EdiHelpBundleTest
assertThat(HelpBundles.of(instance).getBundles()).singleElement().satisfies(bundle ->
{
assertThat(bundle.getId()).isEqualTo("qbit-edi");
- assertThat(bundle.getVersion()).as("the help bundle carries the artifact version").isEqualTo(System.getProperty("qbit.artifactVersion"));
+ assertThat(bundle.getVersion()).as("the help bundle carries the artifact version").isEqualTo(System.getProperty("qbit.artifactVersion")).isEqualTo(EdiQBitProducer.VERSION);
});
HelpBundles.syncOnStartup(instance);
HelpBundleAssertions.forInstance(instance)
diff --git a/src/test/java/com/kingsrook/qbits/edi/EdiQBitProducerTest.java b/src/test/java/com/kingsrook/qbits/edi/EdiQBitProducerTest.java
index 042c2ef..357020f 100644
--- a/src/test/java/com/kingsrook/qbits/edi/EdiQBitProducerTest.java
+++ b/src/test/java/com/kingsrook/qbits/edi/EdiQBitProducerTest.java
@@ -65,6 +65,8 @@ class EdiQBitProducerTest
assertThat(producer.getQBitConfig()).isSameAs(config);
assertThat(producer.getNamespace()).isEqualTo("ns");
assertThat(producer.getQBitMetaData().getArtifactId()).isEqualTo("qbit-edi");
+ assertThat(System.getProperty("qbit.artifactVersion")).isNotBlank();
+ assertThat(producer.getQBitMetaData().getVersion()).isEqualTo(System.getProperty("qbit.artifactVersion")).isEqualTo(EdiQBitProducer.VERSION);
assertThat(producer.getPackageNameForFindingMetaDataProducers()).isEqualTo("com.kingsrook.qbits.edi.metadata");
assertThat(config.getAppName()).isEqualTo("edi");
assertThat(config.getAppLabel()).isEqualTo("EDI");