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

snazy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git


The following commit(s) were added to refs/heads/main by this push:
     new 5faadbdb Add `polaris-version` artifact (#591)
5faadbdb is described below

commit 5faadbdb27497cb897b5fd211a6402721e8a2783
Author: Robert Stupp <[email protected]>
AuthorDate: Thu Dec 26 20:20:19 2024 +0100

    Add `polaris-version` artifact (#591)
    
    Utility artifact that provides static resources containing the version and 
NOTICE + LICENSE* files, which can be directly served by Quarkus as static web 
resources, for example `http://127.0.0.1:19120/apache-polaris/NOTICE.txt`.
    
    Utility class that provides above mentioned resources programmatically, 
plus information for release-builds like the Git tag, Git commit ID, build 
system.
    
    Fixes #557
---
 build.gradle.kts                                   |   3 +
 gradle/projects.main.properties                    |   1 +
 tools/version/build.gradle.kts                     | 104 +++++++++
 .../apache/polaris/version/TestPolarisVersion.java | 114 ++++++++++
 .../jarTest/resources/META-INF/FAKE_MANIFEST.MF    |   9 +
 .../org/apache/polaris/version/PolarisVersion.java | 246 +++++++++++++++++++++
 .../src/main/version/polaris-version.properties    |  11 +-
 7 files changed, 478 insertions(+), 10 deletions(-)

diff --git a/build.gradle.kts b/build.gradle.kts
index e4863012..e5fadafd 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -67,6 +67,9 @@ tasks.named<RatTask>("rat").configure {
   excludes.add("LICENSE")
   excludes.add("NOTICE")
 
+  // Manifest files do not allow comments
+  excludes.add("tools/version/src/jarTest/resources/META-INF/FAKE_MANIFEST.MF")
+
   excludes.add("ide-name.txt")
   excludes.add("version.txt")
   excludes.add(".git")
diff --git a/gradle/projects.main.properties b/gradle/projects.main.properties
index 0d09894a..bf7feec1 100644
--- a/gradle/projects.main.properties
+++ b/gradle/projects.main.properties
@@ -27,3 +27,4 @@ polaris-dropwizard-service=dropwizard/service
 polaris-eclipselink=extension/persistence/eclipselink
 polaris-jpa-model=extension/persistence/jpa-model
 aggregated-license-report=aggregated-license-report
+polaris-version=tools/version
diff --git a/tools/version/build.gradle.kts b/tools/version/build.gradle.kts
new file mode 100644
index 00000000..1ebb5bc3
--- /dev/null
+++ b/tools/version/build.gradle.kts
@@ -0,0 +1,104 @@
+/*
+ * 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 org.apache.tools.ant.filters.ReplaceTokens
+
+plugins {
+  id("polaris-client")
+  `java-library`
+  `java-test-fixtures`
+  `jvm-test-suite`
+}
+
+dependencies { testFixturesApi(libs.assertj.core) }
+
+description =
+  "Provides Polaris version information programmatically, includes the 
NOTICE/LICENSE* files"
+
+val syncNoticeAndLicense by
+  tasks.registering(Sync::class) {
+    // Have to manually declare the inputs of this task here on top of the 
from/include below
+    inputs.files(rootProject.layout.files("NOTICE*", "LICENSE*", 
"version.txt"))
+    inputs.property("version", project.version)
+    destinationDir = 
project.layout.buildDirectory.dir("notice-licenses").get().asFile
+    from(rootProject.rootDir) {
+      include("NOTICE*", "LICENSE*")
+      // Put NOTICE/LICENSE* files under META-INF/resources/ so those files 
can be directly
+      // accessed as static web resources in Quarkus.
+      eachFile { path = "META-INF/resources/apache-polaris/${file.name}.txt" }
+    }
+    from(rootProject.rootDir) {
+      include("version.txt")
+      // Put NOTICE/LICENSE* files under META-INF/resources/ so those files 
can be directly
+      // accessed as static web resources in Quarkus.
+      eachFile { path = "META-INF/resources/apache-polaris/${file.name}" }
+    }
+  }
+
+val versionProperties by
+  tasks.registering(Sync::class) {
+    destinationDir = project.layout.buildDirectory.dir("version").get().asFile
+    from(project.layout.files("src/main/version"))
+    eachFile { path = "org/apache/polaris/version/$path" }
+    inputs.property("projectVersion", project.version)
+    filter(ReplaceTokens::class, mapOf("tokens" to mapOf("projectVersion" to 
project.version)))
+  }
+
+sourceSets.main.configure {
+  resources {
+    srcDir(syncNoticeAndLicense)
+    srcDir(versionProperties)
+  }
+}
+
+// Build a jar for `jarTest` having both the production and test sources 
including the "fake
+// manifest" - the production implementation expects all resources to be in 
the jar containing
+// the `polaris-version.properties` file.
+val jarTestJar by
+  tasks.registering(Jar::class) {
+    archiveClassifier.set("jarTest")
+    from(sourceSets.main.get().output)
+    from(sourceSets.getByName("jarTest").output)
+  }
+
+// Add a test-suite to run against the built polaris-version*.jar, not the 
classes/, because we
+// need to test the `jar:` scheme/protocol resolution.
+testing {
+  suites {
+    withType<JvmTestSuite> { useJUnitJupiter(libs.junit.bom.map { it.version!! 
}) }
+
+    register<JvmTestSuite>("jarTest") {
+      dependencies {
+        compileOnly(project())
+        runtimeOnly(files(jarTestJar.get().archiveFile.get().asFile))
+        implementation(libs.assertj.core)
+      }
+
+      targets.all {
+        testTask.configure {
+          dependsOn("jar", jarTestJar)
+          systemProperty("rootProjectDir", 
rootProject.rootDir.relativeTo(project.projectDir))
+          systemProperty("polarisVersion", project.version)
+        }
+      }
+    }
+  }
+}
+
+tasks.named("test") { dependsOn("jarTest") }
diff --git 
a/tools/version/src/jarTest/java/org/apache/polaris/version/TestPolarisVersion.java
 
b/tools/version/src/jarTest/java/org/apache/polaris/version/TestPolarisVersion.java
new file mode 100644
index 00000000..f50a779f
--- /dev/null
+++ 
b/tools/version/src/jarTest/java/org/apache/polaris/version/TestPolarisVersion.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.polaris.version;
+
+import static java.lang.String.format;
+import static org.apache.polaris.version.PolarisVersion.getBuildGitTag;
+import static org.apache.polaris.version.PolarisVersion.getBuildGitHead;
+import static org.apache.polaris.version.PolarisVersion.getBuildJavaVersion;
+import static 
org.apache.polaris.version.PolarisVersion.getBuildReleasedVersion;
+import static org.apache.polaris.version.PolarisVersion.getBuildSystem;
+import static org.apache.polaris.version.PolarisVersion.getBuildTimestamp;
+import static org.apache.polaris.version.PolarisVersion.isReleaseBuild;
+import static org.apache.polaris.version.PolarisVersion.polarisVersionString;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.function.Supplier;
+import java.util.stream.Stream;
+import org.assertj.core.api.SoftAssertions;
+import org.assertj.core.api.junit.jupiter.InjectSoftAssertions;
+import org.assertj.core.api.junit.jupiter.SoftAssertionsExtension;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+@ExtendWith(SoftAssertionsExtension.class)
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+public class TestPolarisVersion {
+  @InjectSoftAssertions private SoftAssertions soft;
+
+  /**
+   * Test runs using a "non release" build, so the MANIFEST.MF file has no 
release version
+   * information.
+   */
+  @Test
+  @Order(1)
+  public void versionAvailable() {
+    
soft.assertThat(polarisVersionString()).isEqualTo(System.getProperty("polarisVersion"));
+    soft.assertThat(isReleaseBuild()).isFalse();
+    soft.assertThat(getBuildReleasedVersion()).isEmpty();
+    soft.assertThat(getBuildTimestamp()).isEmpty();
+    soft.assertThat(getBuildGitHead()).isEmpty();
+    soft.assertThat(getBuildGitTag()).isEmpty();
+    soft.assertThat(getBuildSystem()).isEmpty();
+    soft.assertThat(getBuildJavaVersion()).isEmpty();
+  }
+
+  /**
+   * Test runs using a static "release" build manifest, {@link
+   * 
org.apache.polaris.version.PolarisVersion.PolarisVersionJarInfo#loadManifest(String)}
+   * overwrites the already loaded build-info, so this test has to run 
<em>after</em> {@link
+   * #versionAvailable()}.
+   */
+  @Test
+  @Order(2)
+  public void fakeReleaseManifest() {
+    PolarisVersion.PolarisVersionJarInfo.loadManifest("FAKE_MANIFEST.MF");
+
+    
soft.assertThat(polarisVersionString()).isEqualTo(System.getProperty("polarisVersion"));
+    soft.assertThat(isReleaseBuild()).isTrue();
+    
soft.assertThat(getBuildReleasedVersion()).contains("0.1.2-incubating-SNAPSHOT");
+    soft.assertThat(getBuildTimestamp()).contains("2024-12-26-10:31:19+01:00");
+    
soft.assertThat(getBuildGitHead()).contains("27cf81929cbb08e545c8fcb1ed27a53d7ef1af79");
+    soft.assertThat(getBuildGitTag()).contains("foo-tag-bar");
+    soft.assertThat(getBuildSystem())
+        .contains(
+            "Linux myawesomehost 6.12.6 #81 SMP PREEMPT_DYNAMIC Fri Dec 20 
09:22:38 CET 2024 x86_64 x86_64 x86_64 GNU/Linux");
+    soft.assertThat(getBuildJavaVersion()).contains("21.0.5");
+  }
+
+  @Test
+  public void versionTxtResource() {
+    soft.assertThat(PolarisVersion.readResource("version").trim())
+        .isEqualTo(System.getProperty("polarisVersion"));
+  }
+
+  @ParameterizedTest
+  @MethodSource
+  public void noticeLicense(String name, Supplier<String> supplier) throws 
Exception {
+    var supplied = supplier.get();
+    var expected =
+        Files.readString(Paths.get(format("%s/%s", 
System.getProperty("rootProjectDir"), name)));
+    soft.assertThat(supplied).isEqualTo(expected);
+  }
+
+  static Stream<Arguments> noticeLicense() {
+    return Stream.of(
+        Arguments.arguments("NOTICE", (Supplier<String>) 
PolarisVersion::readNoticeFile),
+        Arguments.arguments("LICENSE", (Supplier<String>) 
PolarisVersion::readSourceLicenseFile),
+        Arguments.arguments(
+            "LICENSE-BINARY-DIST", (Supplier<String>) 
PolarisVersion::readBinaryLicenseFile));
+  }
+}
diff --git a/tools/version/src/jarTest/resources/META-INF/FAKE_MANIFEST.MF 
b/tools/version/src/jarTest/resources/META-INF/FAKE_MANIFEST.MF
new file mode 100644
index 00000000..beebc06d
--- /dev/null
+++ b/tools/version/src/jarTest/resources/META-INF/FAKE_MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Apache-Polaris-Version: 0.1.2-incubating-SNAPSHOT
+Apache-Polaris-Is-Release: true
+Apache-Polaris-Build-Git-Head: 27cf81929cbb08e545c8fcb1ed27a53d7ef1af79
+Apache-Polaris-Build-Git-Describe: foo-tag-bar
+Apache-Polaris-Build-Timestamp: 2024-12-26-10:31:19+01:00
+Apache-Polaris-Build-System: Linux myawesomehost 6.12.6 #81 SMP PREEMPT_DY
+ NAMIC Fri Dec 20 09:22:38 CET 2024 x86_64 x86_64 x86_64 GNU/Linux
+Apache-Polaris-Build-Java-Version: 21.0.5
diff --git 
a/tools/version/src/main/java/org/apache/polaris/version/PolarisVersion.java 
b/tools/version/src/main/java/org/apache/polaris/version/PolarisVersion.java
new file mode 100644
index 00000000..8c4ebc8d
--- /dev/null
+++ b/tools/version/src/main/java/org/apache/polaris/version/PolarisVersion.java
@@ -0,0 +1,246 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.polaris.version;
+
+import static java.lang.String.format;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+/**
+ * Utility class to retrieve the current Polaris version and the contents of 
the {@code NOTICE} and
+ * {@code LICENSE*} files.
+ *
+ * <p>If built as a release using the Gradle {@code -Prelease} project 
property, more information
+ * like the Git tag, Git commit ID, build system and more is available as well.
+ */
+public final class PolarisVersion {
+  private PolarisVersion() {}
+
+  /** The version string as in the file {@code version.txt} in the project's 
root directory. */
+  public static String polarisVersionString() {
+    return PolarisVersionNumber.POLARIS_VERSION;
+  }
+
+  /**
+   * Flag whether the build is a released version, when Polaris has been built 
with the Gradle
+   * {@code -Prelease} project property. If {@code true}, the {@code 
getBuild*} functions return
+   * meaningful values.
+   */
+  public static boolean isReleaseBuild() {
+    return 
"true".equals(PolarisVersionJarInfo.buildInfo(MF_IS_RELEASE).orElse("false"));
+  }
+
+  /**
+   * Returns the version as in the jar manifest, if {@linkplain 
#isReleaseBuild() build-time Git
+   * information} is available, when Polaris has been built with the Gradle 
{@code -Prelease}
+   * project property..
+   *
+   * <p>Example values: {@code 1.0.0-incubating-SNAPSHOT}, {@code 
1.0.0-incubating}, {@code 1.0.0}
+   *
+   * @see #isReleaseBuild()
+   */
+  public static Optional<String> getBuildReleasedVersion() {
+    return PolarisVersionJarInfo.buildInfo(MF_VERSION);
+  }
+
+  /**
+   * Returns the commit ID as in the jar manifest, if {@linkplain 
#isReleaseBuild() build-time Git
+   * information} is available, when Polaris has been built with the Gradle 
{@code -Prelease}
+   * project property.
+   *
+   * <p>Example value: {@code d417725ec7c88c1ee8f940ffb2ce72aec7fb2a17}
+   *
+   * @see #isReleaseBuild()
+   */
+  public static Optional<String> getBuildGitHead() {
+    return PolarisVersionJarInfo.buildInfo(MF_BUILD_GIT_HEAD);
+  }
+
+  /**
+   * Returns the output of {@code git describe --tags} as in the jar manifest, 
if {@linkplain
+   * #isReleaseBuild() build-time Git information} is available, when Polaris 
has been built with
+   * the Gradle {@code -Prelease} project property.
+   *
+   * <p>Example value: {@code apache-polaris-0.1.2}
+   *
+   * @see #isReleaseBuild()
+   */
+  public static Optional<String> getBuildGitTag() {
+    return PolarisVersionJarInfo.buildInfo(MF_BUILD_GIT_DESCRIBE);
+  }
+
+  /**
+   * Returns the Java version used during the build as in the jar manifest, if 
{@linkplain
+   * #isReleaseBuild() build-time Git information} is available, when Polaris 
has been built with
+   * the Gradle {@code -Prelease} project property.
+   *
+   * <p>Example value: {@code 21.0.5}
+   *
+   * @see #isReleaseBuild()
+   */
+  public static Optional<String> getBuildJavaVersion() {
+    return PolarisVersionJarInfo.buildInfo(MF_BUILD_JAVA_VERSION);
+  }
+
+  /**
+   * Returns information about the system that performed the build, if 
{@linkplain #isReleaseBuild()
+   * build-time Git information} is available, when Polaris has been built 
with the Gradle {@code
+   * -Prelease} project property.
+   *
+   * <p>Example value: {@code Linux myawesomehost 6.12.6 #81 SMP 
PREEMPT_DYNAMIC Fri Dec 20 09:22:38
+   * CET 2024 x86_64 x86_64 x86_64 GNU/Linux}
+   *
+   * @see #isReleaseBuild()
+   */
+  public static Optional<String> getBuildSystem() {
+    return PolarisVersionJarInfo.buildInfo(MF_BUILD_SYSTEM);
+  }
+
+  /**
+   * Returns the build timestamp as in the jar manifest, if {@linkplain 
#isReleaseBuild() build-time
+   * Git information} is available, when Polaris has been built with the 
Gradle {@code -Prelease}
+   * project property.
+   *
+   * <p>Example value: {@code 2024-12-16-11:54:05+01:00}
+   *
+   * @see #isReleaseBuild()
+   */
+  public static Optional<String> getBuildTimestamp() {
+    return PolarisVersionJarInfo.buildInfo(MF_BUILD_TIMESTAMP);
+  }
+
+  public static String readNoticeFile() {
+    return readResource("NOTICE");
+  }
+
+  public static String readSourceLicenseFile() {
+    return readResource("LICENSE");
+  }
+
+  public static String readBinaryLicenseFile() {
+    return readResource("LICENSE-BINARY-DIST");
+  }
+
+  private static final String MF_VERSION = "Apache-Polaris-Version";
+  private static final String MF_IS_RELEASE = "Apache-Polaris-Is-Release";
+  private static final String MF_BUILD_GIT_HEAD = 
"Apache-Polaris-Build-Git-Head";
+  private static final String MF_BUILD_GIT_DESCRIBE = 
"Apache-Polaris-Build-Git-Describe";
+  private static final String MF_BUILD_TIMESTAMP = 
"Apache-Polaris-Build-Timestamp";
+  private static final String MF_BUILD_SYSTEM = "Apache-Polaris-Build-System";
+  private static final String MF_BUILD_JAVA_VERSION = 
"Apache-Polaris-Build-Java-Version";
+  private static final List<String> MF_ALL =
+      List.of(
+          MF_VERSION,
+          MF_IS_RELEASE,
+          MF_BUILD_GIT_HEAD,
+          MF_BUILD_GIT_DESCRIBE,
+          MF_BUILD_TIMESTAMP,
+          MF_BUILD_SYSTEM,
+          MF_BUILD_JAVA_VERSION);
+
+  static String readResource(String resource) {
+    var fullResource = format("/META-INF/resources/apache-polaris/%s.txt", 
resource);
+    var resourceUrl =
+        requireNonNull(
+            PolarisVersion.class.getResource(fullResource),
+            "Resource " + fullResource + " does not exist");
+    try (InputStream in = resourceUrl.openConnection().getInputStream()) {
+      return new String(in.readAllBytes(), UTF_8);
+    } catch (IOException e) {
+      throw new RuntimeException("Failed to load resource " + fullResource, e);
+    }
+  }
+
+  // Couple inner classes to leverage Java's class loading mechanism as 
singletons and for
+  // initialization. Package-protected for testing.
+
+  static final class PolarisVersionJarInfo {
+    static final Map<String, String> BUILD_INFO = new HashMap<>();
+
+    static Optional<String> buildInfo(String key) {
+      return Optional.ofNullable(BUILD_INFO.get(key));
+    }
+
+    static {
+      loadManifest("MANIFEST.MF");
+    }
+
+    static void loadManifest(String manifestFile) {
+      var polarisVersionResource = 
PolarisVersionResource.POLARIS_VERSION_RESOURCE;
+      if ("jar".equals(polarisVersionResource.getProtocol())) {
+        var path = polarisVersionResource.toString();
+        var jarSep = path.lastIndexOf('!');
+        if (jarSep == -1) {
+          throw new IllegalStateException(
+              "Could not determine the jar of the Apache Polaris version 
artifact: " + path);
+        }
+        var manifestPath = path.substring(0, jarSep + 1) + "/META-INF/" + 
manifestFile;
+        try {
+          try (InputStream in =
+              
URI.create(manifestPath).toURL().openConnection().getInputStream()) {
+            var manifest = new Manifest(in);
+            var attributes = manifest.getMainAttributes();
+            MF_ALL.stream()
+                .map(Attributes.Name::new)
+                .filter(attributes::containsKey)
+                .forEach(k -> BUILD_INFO.put(k.toString(), 
attributes.getValue(k)));
+          }
+        } catch (IOException e) {
+          throw new RuntimeException(e);
+        }
+      }
+    }
+  }
+
+  static final class PolarisVersionNumber {
+    static final String POLARIS_VERSION;
+
+    static {
+      try (InputStream in =
+          
PolarisVersionResource.POLARIS_VERSION_RESOURCE.openConnection().getInputStream())
 {
+        Properties p = new Properties();
+        p.load(in);
+        POLARIS_VERSION = p.getProperty("polaris.version");
+      } catch (IOException e) {
+        throw new RuntimeException(
+            "Failed to load Apache Polaris version from 
org/apache/polaris/version/polaris-version.properties resource",
+            e);
+      }
+    }
+  }
+
+  static final class PolarisVersionResource {
+    static final URL POLARIS_VERSION_RESOURCE =
+        requireNonNull(
+            PolarisVersion.class.getResource("polaris-version.properties"),
+            "Resource org/apache/polaris/version/polaris-version.properties 
containing the Apache Polaris version does not exist");
+  }
+}
diff --git a/gradle/projects.main.properties 
b/tools/version/src/main/version/polaris-version.properties
similarity index 65%
copy from gradle/projects.main.properties
copy to tools/version/src/main/version/polaris-version.properties
index 0d09894a..5a1bc8be 100644
--- a/gradle/projects.main.properties
+++ b/tools/version/src/main/version/polaris-version.properties
@@ -16,14 +16,5 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-#
 
-polaris-core=polaris-core
-polaris-api-iceberg-service=api/iceberg-service
-polaris-api-management-model=api/management-model
-polaris-api-management-service=api/management-service
-polaris-service-common=service/common
-polaris-dropwizard-service=dropwizard/service
-polaris-eclipselink=extension/persistence/eclipselink
-polaris-jpa-model=extension/persistence/jpa-model
-aggregated-license-report=aggregated-license-report
+polaris.version=@projectVersion@

Reply via email to