You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2023/05/28 16:23:53 UTC

[jena] branch main updated: GH-1880: Use jar manifest info for version information

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 086ae2fa21 GH-1880: Use jar manifest info for version information
     new d1b54c534b Merge pull request #1885 from afs/version
086ae2fa21 is described below

commit 086ae2fa21746252193ed94e7b4950cb40b766b1
Author: Andy Seaborne <an...@apache.org>
AuthorDate: Fri May 26 11:03:51 2023 +0100

    GH-1880: Use jar manifest info for version information
---
 jena-arq/pom.xml                                   |  16 ---
 .../org/apache/jena/arq/arq-properties.xml         |   8 --
 .../java/org/apache/jena/sparql/util/TS_Util.java  |   1 -
 .../org/apache/jena/sparql/util/TestVersion.java   |  81 -------------
 .../java/org/apache/jena/atlas/lib/Version.java    | 131 ++++-----------------
 .../java/org/apache/jena/atlas/lib/TS_Lib.java     |   1 +
 .../org/apache/jena/atlas/lib/TestVersion.java     |  30 ++---
 jena-cmds/src/main/java/arq/cmdline/CmdARQ.java    |   2 -
 jena-cmds/src/main/java/arq/query.java             |   4 +-
 .../main/java/org/apache/jena/cmd/ModVersion.java  |  34 +++++-
 jena-cmds/src/main/java/riotcmd/CmdLangParse.java  |   5 +-
 jena-cmds/src/main/java/shacl/shacl.java           |  16 +--
 jena-cmds/src/main/java/shex/shex.java             |  16 +--
 jena-cmds/src/main/java/tdb/cmdline/CmdTDB.java    |   6 +-
 jena-cmds/src/main/java/tdb/tdbconfig.java         |   2 +-
 jena-cmds/src/main/java/tdb2/cmdline/CmdTDB.java   |   4 -
 jena-cmds/src/test/java/arq/rdftests.java          |   3 +-
 jena-core/pom.xml                                  |   8 --
 .../resources/org/apache/jena/jena-properties.xml  |  11 --
 jena-fuseki2/jena-fuseki-core/pom.xml              |  18 +--
 .../org/apache/jena/fuseki/fuseki-properties.xml   |   8 --
 .../apache/jena/fuseki/main/cmds/FusekiMain.java   |   2 +-
 .../java/org/apache/jena/fuseki/cmd/FusekiCmd.java |   2 -
 .../jena/jdbc/mem/metadata/MemDatasetMetadata.java |  14 +--
 .../remote/metadata/RemoteEndpointMetadata.java    |   9 +-
 .../jena/jdbc/tdb/metadata/TDBDatasetMetadata.java |  18 +--
 jena-tdb1/pom.xml                                  |  18 ---
 .../org/apache/jena/tdb/tdb-properties.xml         |   8 --
 jena-tdb2/pom.xml                                  |  19 +--
 .../org/apache/jena/tdb2/tdb2-properties.xml       |   8 --
 30 files changed, 100 insertions(+), 403 deletions(-)

diff --git a/jena-arq/pom.xml b/jena-arq/pom.xml
index 3d6a7f3362..d0904424ac 100644
--- a/jena-arq/pom.xml
+++ b/jena-arq/pom.xml
@@ -172,22 +172,6 @@
   </dependencies>
 
   <build>
-    <resources>
-      <resource>
-        <filtering>true</filtering>
-        <directory>src/main/resources</directory>
-        <includes>
-          <include>org/apache/jena/arq/arq-properties.xml</include>
-        </includes>
-      </resource>
-      <resource>
-        <filtering>false</filtering>
-        <directory>src/main/resources</directory>
-        <excludes>
-          <exclude>org/apache/jena/arq/arq-properties.xml</exclude>
-        </excludes>
-      </resource>
-    </resources>
 
     <plugins>
 
diff --git a/jena-arq/src/main/resources/org/apache/jena/arq/arq-properties.xml b/jena-arq/src/main/resources/org/apache/jena/arq/arq-properties.xml
deleted file mode 100644
index 8cf2bccddb..0000000000
--- a/jena-arq/src/main/resources/org/apache/jena/arq/arq-properties.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-<!--  Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0 -->
-<properties version="1.0">
-  <comment>ARQ System Properties</comment>
-  <entry key="org.apache.jena.arq.version">${project.version}</entry>
-  <entry key="org.apache.jena.arq.build.datetime">${build.time.xsd}</entry>
-</properties>
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/util/TS_Util.java b/jena-arq/src/test/java/org/apache/jena/sparql/util/TS_Util.java
index f473459759..ce1137c561 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/util/TS_Util.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/util/TS_Util.java
@@ -27,7 +27,6 @@ import org.junit.runners.Suite.SuiteClasses ;
     TestDateTimeParsing.class ,
     TestList.class ,
     TestFmtUtils.class,
-    TestVersion.class,
     TestContextUtils.class,
     TestIsoMatcher.class
 })
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/util/TestVersion.java b/jena-arq/src/test/java/org/apache/jena/sparql/util/TestVersion.java
deleted file mode 100644
index 03589e9557..0000000000
--- a/jena-arq/src/test/java/org/apache/jena/sparql/util/TestVersion.java
+++ /dev/null
@@ -1,81 +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.apache.jena.sparql.util;
-
-import org.apache.jena.atlas.io.IndentedLineBuffer ;
-import org.apache.jena.atlas.lib.Version ;
-import org.apache.jena.query.ARQ ;
-import org.apache.jena.riot.RIOT ;
-import org.junit.Assert ;
-import org.junit.Test ;
-
-/**
- * Tests for the {@link org.apache.jena.atlas.lib.Version} utility class
- * Done here so there is something to test.
- */
-public class TestVersion {
-
-    @Test
-    public void test_version_print_01() {
-        Version ver = new Version();
-        ver.addClass(ARQ.class);
-        
-        IndentedLineBuffer buffer = new IndentedLineBuffer();
-        ver.print(buffer);
-        
-        String info = buffer.asString();
-        Assert.assertNotNull(info);
-        Assert.assertTrue(info.contains("ARQ"));
-    }
-    
-    @Test
-    public void test_version_string_01() {
-        Version ver = new Version();
-        ver.addClass(ARQ.class);
-        ver.addClass(RIOT.class);
-        
-        String info = ver.toString();
-        Assert.assertNotNull(info);
-        Assert.assertTrue(info.contains("ARQ"));
-        Assert.assertTrue(info.contains("\n"));
-    }
-    
-    @Test
-    public void test_version_string_02() {
-        Version ver = new Version();
-        ver.addClass(ARQ.class);
-        ver.addClass(RIOT.class);
-        
-        String info = ver.toString(false);
-        Assert.assertNotNull(info);
-        Assert.assertTrue(info.contains("ARQ"));
-        Assert.assertTrue(info.contains("\n"));
-    }
-    
-    @Test
-    public void test_version_string_03() {
-        Version ver = new Version();
-        ver.addClass(ARQ.class);
-        
-        String info = ver.toString(true);
-        Assert.assertNotNull(info);
-        Assert.assertTrue(info.contains("ARQ"));
-        Assert.assertFalse(info.contains("\n"));
-    }
-}
diff --git a/jena-base/src/main/java/org/apache/jena/atlas/lib/Version.java b/jena-base/src/main/java/org/apache/jena/atlas/lib/Version.java
index 2337605176..81e8379092 100644
--- a/jena-base/src/main/java/org/apache/jena/atlas/lib/Version.java
+++ b/jena-base/src/main/java/org/apache/jena/atlas/lib/Version.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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
@@ -18,122 +18,35 @@
 
 package org.apache.jena.atlas.lib;
 
-import java.lang.reflect.Field ;
-import java.util.ArrayList ;
-import java.util.Iterator ;
-import java.util.List ;
+import java.io.PrintStream;
+import java.util.Optional;
 
-import org.apache.jena.atlas.io.IndentedLineBuffer ;
-import org.apache.jena.atlas.io.IndentedWriter ;
+/** In support of version information. */
+public class Version {
 
-/** Manage version information for subsystems */
-public class Version
-{
-    private List<Class< ? >> classes = new ArrayList<>() ;
-    
-    /**
-     * Add a class to the version information
-     * @param c Class
-     */
-    public void addClass(Class< ? > c)
-    {
-        if ( ! classes.contains(c) ) 
-            classes.add(c) ;
-    }
-    
-    private static String FIELD_VERSION = "VERSION";
-    
-    private static String FIELD_BUILD_DATE = "BUILD_DATE";
-    
-    private static String[] fields = { /*"NAME",*/ FIELD_VERSION, FIELD_BUILD_DATE } ;
+    private Version() {}
 
     /**
-     * Prints version information for all registered classes to the given writer
-     * @param writer Writer to print version information to
+     * Return the version of a class.
+     * <p>
+     * This depends on the class being in a jar with a
+     * manifest that has the version field.
+     * <p>
+     * Otherwise return {@link Optional#empty()}.
      */
-    public void print(IndentedWriter writer) {
-        for ( Class<?> c : classes ) {
-            String x = Lib.classShortName( c );
-            fields( writer, x, c );
-        }
+    public static Optional<String> versionForClass(Class<?> cls) {
+        String x = cls.getPackage().getImplementationVersion();
+        return Optional.ofNullable(x);
     }
 
-    private static void fields(IndentedWriter writer, String prefix, Class< ? > cls)
-    {
-        for ( String field : fields )
-            printField( writer, prefix, field, cls );
-    }
-    
-    private static String field(String fieldName, Class<? > cls) {
-        try {
-            Field f = cls.getDeclaredField(fieldName) ;
-            Object val = f.get(null) ;
-            if ( val == null )
-                return null ;
-            return val.toString() ;
-        }
-        catch (IllegalArgumentException ex) {
-            ex.printStackTrace() ;
-        }
-        catch (IllegalAccessException ex) {
-            ex.printStackTrace() ;
-        }
-        catch (SecurityException ex) {
-            ex.printStackTrace() ;
-        }
-        catch (NoSuchFieldException ex) {
-            ex.printStackTrace() ;
-        }
-        return "<error>" ;
+    public static void printVersion(PrintStream out, String system, Optional<String> versionString) {
+        printVersion(out, system, versionString.orElse("<development>"));
     }
 
-    private static void printField(IndentedWriter out, String prefix, String fieldName, Class<? > cls) {
-        String str = field(fieldName, cls) ;
-        if ( str == null )
-            return ;
-        out.print(prefix) ;
-        out.print(": ") ;
-        out.pad(12) ;
-        out.print(fieldName) ;
-        out.print(": ") ;
-        out.print(field(fieldName, cls)) ;
-        out.println() ;
-        out.flush() ;
-    }
-    
-    /**
-     * Gets user friendly version information for all registered classes as a string
-     * @param singleLine Whether to print to a single line
-     * @return Version information
-     */
-    public String toString(boolean singleLine) {
-        try ( IndentedLineBuffer buffer = new IndentedLineBuffer(false) ) {
-            Iterator<Class<?>> iter = classes.iterator();
-            while (iter.hasNext())
-            {
-                Class<?> c = iter.next();
-                String component = Lib.classShortName(c) ;
-                String version = field(FIELD_VERSION, c);
-                String timestamp = field(FIELD_BUILD_DATE, c);
-                buffer.append("%s Version %s (Built %s)", component, version, timestamp);
-                if (iter.hasNext()) {
-                    if (!singleLine) {
-                        buffer.println();
-                    } else {
-                        buffer.print(", ");
-                    }
-                }
-            }
-
-            return buffer.asString();
-        }
-    }
-    
-    /**
-     * Gets user friendly version information for all registered classes as a string
-     */
-    @Override
-    public String toString() {
-        return this.toString(false);
+    public static void printVersion(PrintStream out, String system, String versionString) {
+        if ( system == null )
+            out.printf("Apache Jena version %s\n", versionString);
+        else
+            out.printf("Apache Jena %s version %s\n", system, versionString);
     }
 }
diff --git a/jena-base/src/test/java/org/apache/jena/atlas/lib/TS_Lib.java b/jena-base/src/test/java/org/apache/jena/atlas/lib/TS_Lib.java
index 87abe6eba7..9352e9553a 100644
--- a/jena-base/src/test/java/org/apache/jena/atlas/lib/TS_Lib.java
+++ b/jena-base/src/test/java/org/apache/jena/atlas/lib/TS_Lib.java
@@ -50,6 +50,7 @@ import org.junit.runners.Suite ;
     , TestDateTimeUtils.class
     , TestCacheSimple.class
     , TestRefCountingMap.class
+    , TestVersion.class
 } )
 
 public class TS_Lib
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/util/TS_Util.java b/jena-base/src/test/java/org/apache/jena/atlas/lib/TestVersion.java
similarity index 60%
copy from jena-arq/src/test/java/org/apache/jena/sparql/util/TS_Util.java
copy to jena-base/src/test/java/org/apache/jena/atlas/lib/TestVersion.java
index f473459759..a8e9b610a6 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/util/TS_Util.java
+++ b/jena-base/src/test/java/org/apache/jena/atlas/lib/TestVersion.java
@@ -16,20 +16,20 @@
  * limitations under the License.
  */
 
-package org.apache.jena.sparql.util;
+package org.apache.jena.atlas.lib;
 
-import org.junit.runner.RunWith ;
-import org.junit.runners.Suite ;
-import org.junit.runners.Suite.SuiteClasses ;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
-@RunWith(Suite.class)
-@SuiteClasses( {
-    TestDateTimeParsing.class ,
-    TestList.class ,
-    TestFmtUtils.class,
-    TestVersion.class,
-    TestContextUtils.class,
-    TestIsoMatcher.class
-})
-public class TS_Util
-{ }
+import java.util.Optional;
+
+import org.junit.Test;
+
+public class TestVersion {
+    @Test public void version_01() {
+        // This can not be a Jena class (jar probably does not exist during tests)
+        Optional<String> x = Version.versionForClass(org.slf4j.Logger.class);
+        assertNotNull("Optional<String> version info is null", x);
+        assertTrue("Version info is null", x.isPresent());
+    }
+}
diff --git a/jena-cmds/src/main/java/arq/cmdline/CmdARQ.java b/jena-cmds/src/main/java/arq/cmdline/CmdARQ.java
index 3ce0eca650..fd6362c10b 100644
--- a/jena-cmds/src/main/java/arq/cmdline/CmdARQ.java
+++ b/jena-cmds/src/main/java/arq/cmdline/CmdARQ.java
@@ -18,7 +18,6 @@
 
 package arq.cmdline;
 
-import org.apache.jena.Jena;
 import org.apache.jena.atlas.lib.Lib;
 import org.apache.jena.cmd.ArgDecl;
 import org.apache.jena.cmd.CmdGeneral;
@@ -37,7 +36,6 @@ public abstract class CmdARQ extends CmdGeneral {
 
     protected CmdARQ(String[] argv) {
         super(argv);
-        modVersion.addClass(Jena.class);
         super.add(strictDecl, "--strict", "Operate in strict SPARQL mode (no extensions of any kind)");
         addModule(modContext);
     }
diff --git a/jena-cmds/src/main/java/arq/query.java b/jena-cmds/src/main/java/arq/query.java
index b34bdc5556..c827fcdca2 100644
--- a/jena-cmds/src/main/java/arq/query.java
+++ b/jena-cmds/src/main/java/arq/query.java
@@ -22,6 +22,7 @@ import java.io.PrintStream;
 
 import arq.cmdline.* ;
 import org.apache.commons.io.output.NullPrintStream;
+import org.apache.jena.Jena;
 import org.apache.jena.atlas.io.IO;
 import org.apache.jena.atlas.io.IndentedWriter ;
 import org.apache.jena.atlas.lib.Lib ;
@@ -70,6 +71,7 @@ public class query extends CmdARQ
         super(argv) ;
         modQuery = new ModQueryIn(getDefaultSyntax()) ;
         modDataset = setModDataset() ;
+        modVersion.addClass(null, Jena.class);
 
         super.addModule(modQuery) ;
         super.addModule(modResults) ;
@@ -150,7 +152,7 @@ public class query extends CmdARQ
 
         // Warm up.
         for ( int i = 0 ; i < warmupCount ; i++ )
-            // Include the results format so that is warmed up as well. 
+            // Include the results format so that is warmed up as well.
             queryExec(false, modResults.getResultsFormat(), NullPrintStream.NULL_PRINT_STREAM) ;
 
         for ( int i = 0 ; i < repeatCount ; i++ )
diff --git a/jena-cmds/src/main/java/org/apache/jena/cmd/ModVersion.java b/jena-cmds/src/main/java/org/apache/jena/cmd/ModVersion.java
index 725ce8c2ea..e7127ce318 100644
--- a/jena-cmds/src/main/java/org/apache/jena/cmd/ModVersion.java
+++ b/jena-cmds/src/main/java/org/apache/jena/cmd/ModVersion.java
@@ -18,21 +18,43 @@
 
 package org.apache.jena.cmd;
 
-import org.apache.jena.atlas.io.IndentedWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+import org.apache.jena.Jena;
+import org.apache.jena.atlas.lib.Pair;
 import org.apache.jena.atlas.lib.Version;
+
+/**
+ * Version information.
+ * <p>
+ * The version is the manifest entry in the jar file for a
+ * class. It is not available if the class comes from a development tree where the
+ * class file is from "target" (maven).
+ */
 public class ModVersion extends ModBase
 {
     protected final ArgDecl versionDecl = new ArgDecl(ArgDecl.NoValue, "version");
     protected boolean version = false;
     protected boolean printAndExit = false;
-    private Version versionMgr = new Version();
+
+    // (system name, version string)
+    private List<Pair<String, Optional<String>>> descriptions = new ArrayList<>();
 
     public ModVersion(boolean printAndExit) {
         this.printAndExit = printAndExit;
     }
 
+    /** Add a class for the version number */
     public void addClass(Class<? > c) {
-        versionMgr.addClass(c);
+        addClass(c.getSimpleName(), c);
+    }
+
+    /** Add a label and a class for the version number */
+    public void addClass(String name, Class<? > cls) {
+        Pair<String, Optional<String>> desc = Pair.create(name, Version.versionForClass(cls));
+        descriptions.add(desc);
     }
 
     @Override
@@ -54,7 +76,11 @@ public class ModVersion extends ModBase
     }
 
     public void printVersion() {
-        versionMgr.print(IndentedWriter.stdout);
+        if ( descriptions.isEmpty() ) {
+            Version.printVersion(System.out, null, Version.versionForClass(Jena.class));
+            return;
+        }
+        descriptions.forEach(p->Version.printVersion(System.out, p.getLeft(), p.getRight()));
     }
 
     public void printVersionAndExit() {
diff --git a/jena-cmds/src/main/java/riotcmd/CmdLangParse.java b/jena-cmds/src/main/java/riotcmd/CmdLangParse.java
index 75ee678a6f..3e36b052dc 100644
--- a/jena-cmds/src/main/java/riotcmd/CmdLangParse.java
+++ b/jena-cmds/src/main/java/riotcmd/CmdLangParse.java
@@ -29,7 +29,6 @@ import arq.cmdline.ModContext;
 import arq.cmdline.ModLangOutput;
 import arq.cmdline.ModLangParse;
 import arq.cmdline.ModTime;
-import org.apache.jena.Jena;
 import org.apache.jena.atlas.io.IO;
 import org.apache.jena.atlas.lib.IRILib;
 import org.apache.jena.atlas.lib.Pair;
@@ -74,9 +73,7 @@ public abstract class CmdLangParse extends CmdGeneral {
         addModule(modTime);
         addModule(modLangOutput);
         addModule(modLangParse);
-
-        super.modVersion.addClass(Jena.class);
-        // super.modVersion.addClass(RIOT.class) ;
+        super.modVersion.addClass(RIOT.class);
     }
 
     @Override
diff --git a/jena-cmds/src/main/java/shacl/shacl.java b/jena-cmds/src/main/java/shacl/shacl.java
index 37c4c762d9..d81f179c58 100644
--- a/jena-cmds/src/main/java/shacl/shacl.java
+++ b/jena-cmds/src/main/java/shacl/shacl.java
@@ -19,9 +19,8 @@
 package shacl;
 
 import java.util.Arrays;
+import java.util.Optional;
 
-import org.apache.jena.Jena;
-import org.apache.jena.atlas.io.IndentedWriter;
 import org.apache.jena.atlas.lib.Version;
 import org.apache.jena.atlas.logging.LogCtl;
 import org.apache.jena.sys.JenaSystem;
@@ -32,13 +31,6 @@ public class shacl {
         JenaSystem.init();
     }
 
-    private static void version() {
-        Version version = new Version();
-        version.addClass(Jena.class) ;
-        version.print(IndentedWriter.stdout);
-        System.exit(0) ;
-    }
-    
     public static void main(String...args) {
         if ( args.length == 0 ) {
             System.err.println("Usage: shacl SUB ARGS...");
@@ -60,9 +52,11 @@ public class shacl {
                 return;
             case "version":
             case "--version":
-            case "-version":
-                version();
+            case "-version": {
+                Optional<String> ver = Version.versionForClass(shacl.class);
+                Version.printVersion(System.err, "SHACL",  ver);
                 System.exit(0);
+            }
         }
 
         // Map to full name.
diff --git a/jena-cmds/src/main/java/shex/shex.java b/jena-cmds/src/main/java/shex/shex.java
index f449ba4be9..5fa8284a13 100644
--- a/jena-cmds/src/main/java/shex/shex.java
+++ b/jena-cmds/src/main/java/shex/shex.java
@@ -19,9 +19,8 @@
 package shex;
 
 import java.util.Arrays;
+import java.util.Optional;
 
-import org.apache.jena.Jena;
-import org.apache.jena.atlas.io.IndentedWriter;
 import org.apache.jena.atlas.lib.Version;
 import org.apache.jena.atlas.logging.LogCtl;
 import org.apache.jena.sys.JenaSystem;
@@ -32,13 +31,6 @@ public class shex {
         JenaSystem.init();
     }
 
-    private static void version() {
-        Version version = new Version();
-        version.addClass(Jena.class) ;
-        version.print(IndentedWriter.stdout);
-        System.exit(0) ;
-    }
-
     public static void main(String...args) {
         if ( args.length == 0 ) {
             System.err.println("Usage: shex SUB ARGS...");
@@ -59,9 +51,11 @@ public class shex {
                 return;
             case "version":
             case "--version":
-            case "-version":
-                version();
+            case "-version": {
+                Optional<String> ver = Version.versionForClass(shex.class);
+                Version.printVersion(System.err, "ShEx",  ver);
                 System.exit(0);
+            }
         }
 
         // Map to full name.
diff --git a/jena-cmds/src/main/java/tdb/cmdline/CmdTDB.java b/jena-cmds/src/main/java/tdb/cmdline/CmdTDB.java
index 59c59b4574..bb67f65ae2 100644
--- a/jena-cmds/src/main/java/tdb/cmdline/CmdTDB.java
+++ b/jena-cmds/src/main/java/tdb/cmdline/CmdTDB.java
@@ -19,9 +19,7 @@
 package tdb.cmdline;
 
 import arq.cmdline.CmdARQ;
-import org.apache.jena.Jena;
 import org.apache.jena.atlas.lib.Lib;
-import org.apache.jena.query.ARQ;
 import org.apache.jena.query.Dataset;
 import org.apache.jena.sparql.core.DatasetGraph;
 import org.apache.jena.sys.JenaSystem;
@@ -40,9 +38,7 @@ public abstract class CmdTDB extends CmdARQ {
         super(argv);
         init();
         super.addModule(tdbDatasetAssembler);
-        super.modVersion.addClass(Jena.class);
-        super.modVersion.addClass(ARQ.class);
-        super.modVersion.addClass(TDB.class);
+        super.modVersion.addClass("TDB1", TDB.class);
     }
 
     public static synchronized void init() {
diff --git a/jena-cmds/src/main/java/tdb/tdbconfig.java b/jena-cmds/src/main/java/tdb/tdbconfig.java
index 41f07dd85a..38f1e7e61c 100644
--- a/jena-cmds/src/main/java/tdb/tdbconfig.java
+++ b/jena-cmds/src/main/java/tdb/tdbconfig.java
@@ -216,7 +216,7 @@ public class tdbconfig extends CmdSub
         protected void exec() {
             System.out.println("-- " + DateTimeUtils.nowAsString() + " --");
             ModVersion v = new ModVersion(true);
-            v.addClass(TDB.class);
+            v.addClass("TDB1", TDB.class);
             v.printVersionAndExit();
         }
 
diff --git a/jena-cmds/src/main/java/tdb2/cmdline/CmdTDB.java b/jena-cmds/src/main/java/tdb2/cmdline/CmdTDB.java
index a69423d81d..3ae546e596 100644
--- a/jena-cmds/src/main/java/tdb2/cmdline/CmdTDB.java
+++ b/jena-cmds/src/main/java/tdb2/cmdline/CmdTDB.java
@@ -19,11 +19,9 @@
 package tdb2.cmdline;
 
 import arq.cmdline.CmdARQ ;
-import org.apache.jena.Jena ;
 import org.apache.jena.atlas.lib.Lib ;
 import org.apache.jena.atlas.logging.LogCtl ;
 import org.apache.jena.dboe.base.file.Location;
-import org.apache.jena.query.ARQ ;
 import org.apache.jena.query.Dataset ;
 import org.apache.jena.sparql.core.DatasetGraph ;
 import org.apache.jena.sys.JenaSystem ;
@@ -41,8 +39,6 @@ public abstract class CmdTDB extends CmdARQ
         super(argv) ;
         init() ;
         super.addModule(tdbDatasetAssembler) ;
-        super.modVersion.addClass(Jena.class) ;
-        super.modVersion.addClass(ARQ.class) ;
         super.modVersion.addClass(TDB2.class) ;
     }
 
diff --git a/jena-cmds/src/test/java/arq/rdftests.java b/jena-cmds/src/test/java/arq/rdftests.java
index faad7ff22f..748da7a472 100644
--- a/jena-cmds/src/test/java/arq/rdftests.java
+++ b/jena-cmds/src/test/java/arq/rdftests.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.function.Function;
 
 import arq.cmdline.ModContext;
+import org.apache.jena.Jena;
 import org.apache.jena.arq.junit.SurpressedTest;
 import org.apache.jena.arq.junit.TextTestRunner;
 import org.apache.jena.arq.junit.manifest.ManifestEntry;
@@ -108,7 +109,7 @@ public class rdftests extends CmdGeneral
     protected rdftests(String[] argv) {
         super(argv);
 //        super.add(baseDecl, "--base=URI", "Set the base URI");
-        super.modVersion.addClass(ARQ.class);
+        super.modVersion.addClass(Jena.class);
         getUsage().startCategory("Tests (execute test manifest)");
         getUsage().addUsage("<manifest>", "run the tests specified in the given manifest");
         add(arqDecl, "--arq",       "Operate with ARQ syntax");
diff --git a/jena-core/pom.xml b/jena-core/pom.xml
index 8308f58be3..37b7adfe85 100644
--- a/jena-core/pom.xml
+++ b/jena-core/pom.xml
@@ -127,14 +127,6 @@
         <directory>src/main/resources</directory>
       </resource>
 
-      <resource>
-        <directory>src/main/resources</directory>
-        <includes>
-          <include>org/apache/jena/jena-properties.xml</include>
-        </includes>
-        <filtering>true</filtering>
-      </resource>
-
     </resources>
 
     <plugins>
diff --git a/jena-core/src/main/resources/org/apache/jena/jena-properties.xml b/jena-core/src/main/resources/org/apache/jena/jena-properties.xml
deleted file mode 100644
index a231611ea2..0000000000
--- a/jena-core/src/main/resources/org/apache/jena/jena-properties.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-
-<!-- Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0 -->
-<properties version="1.0">
-  <comment>Jena System Properties</comment>
-  <entry key="org.apache.jena.name">${project.name}</entry>
-  <entry key="org.apache.jena.website">${project.url}</entry>
-  <entry key="org.apache.jena.version">${project.version}</entry>
-  <entry key="org.apache.jena.build.datetime">${build.time.xsd}</entry>
-</properties>
diff --git a/jena-fuseki2/jena-fuseki-core/pom.xml b/jena-fuseki2/jena-fuseki-core/pom.xml
index 9cd6e99738..54b3dbd750 100644
--- a/jena-fuseki2/jena-fuseki-core/pom.xml
+++ b/jena-fuseki2/jena-fuseki-core/pom.xml
@@ -113,24 +113,8 @@
   </dependencies>
 
   <build>
-    <resources>
-      <resource>
-        <filtering>false</filtering>
-        <directory>src/main/resources</directory>
-        <excludes>
-          <exclude>org/apache/jena/fuseki/fuseki-properties.xml</exclude>
-        </excludes>
-      </resource>
-      <resource>
-        <filtering>true</filtering>
-        <directory>src/main/resources</directory>
-        <includes>
-          <include>org/apache/jena/fuseki/fuseki-properties.xml</include>
-        </includes>
-      </resource>
-    </resources>
-
     <plugins>
+
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/resources/org/apache/jena/fuseki/fuseki-properties.xml b/jena-fuseki2/jena-fuseki-core/src/main/resources/org/apache/jena/fuseki/fuseki-properties.xml
deleted file mode 100644
index 34082ebfed..0000000000
--- a/jena-fuseki2/jena-fuseki-core/src/main/resources/org/apache/jena/fuseki/fuseki-properties.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-<!-- Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0" -->
-<properties version="1.0">
-  <comment>Fuseki System Properties</comment>
-  <entry key="org.apache.jena.fuseki.version">${project.version}</entry>
-  <entry key="org.apache.jena.fuseki.build.datetime">${build.time.xsd}</entry>
-</properties>
diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java
index d898adac4e..87c24d74a6 100644
--- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java
+++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java
@@ -206,7 +206,7 @@ public class FusekiMain extends CmdARQ {
         add(argWithMetrics, "--metrics",    "Enable /$/metrics");
         add(argWithCompact, "--compact",    "Enable /$/compact/*");
 
-        super.modVersion.addClass(Fuseki.class);
+        super.modVersion.addClass("Fuseki", Fuseki.class);
     }
 
     static String argUsage = "[--config=FILE] [--mem|--desc=AssemblerFile|--file=FILE] [--port PORT] /DatasetPathName";
diff --git a/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/cmd/FusekiCmd.java b/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/cmd/FusekiCmd.java
index a0c03fbbf0..ef137b7fde 100644
--- a/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/cmd/FusekiCmd.java
+++ b/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/cmd/FusekiCmd.java
@@ -43,7 +43,6 @@ import org.apache.jena.riot.RiotException;
 import org.apache.jena.sparql.core.DatasetGraphFactory;
 import org.apache.jena.sys.JenaSystem;
 import org.apache.jena.system.Txn;
-import org.apache.jena.tdb.TDB;
 import org.apache.jena.tdb.sys.Names;
 import org.slf4j.Logger;
 
@@ -154,7 +153,6 @@ public class FusekiCmd {
             add(argGZip, "--gzip=on|off",
                 "Enable GZip compression (HTTP Accept-Encoding) if request header set");
 
-            super.modVersion.addClass(TDB.class);
             super.modVersion.addClass(Fuseki.class);
         }
 
diff --git a/jena-jdbc/jena-jdbc-driver-mem/src/main/java/org/apache/jena/jdbc/mem/metadata/MemDatasetMetadata.java b/jena-jdbc/jena-jdbc-driver-mem/src/main/java/org/apache/jena/jdbc/mem/metadata/MemDatasetMetadata.java
index 531abe5081..588cba7428 100644
--- a/jena-jdbc/jena-jdbc-driver-mem/src/main/java/org/apache/jena/jdbc/mem/metadata/MemDatasetMetadata.java
+++ b/jena-jdbc/jena-jdbc-driver-mem/src/main/java/org/apache/jena/jdbc/mem/metadata/MemDatasetMetadata.java
@@ -24,16 +24,12 @@ import org.apache.jena.atlas.lib.Version ;
 import org.apache.jena.jdbc.JenaJDBC ;
 import org.apache.jena.jdbc.connections.DatasetConnection ;
 import org.apache.jena.jdbc.metadata.DatasetMetadata ;
-import org.apache.jena.query.ARQ ;
 
 /**
  * Connection metadata for in-memory datasets
  *
  */
 public class MemDatasetMetadata extends DatasetMetadata {
-    
-    private Version arq;
-    private Version jdbc;
 
     /**
      * Creates new metadata
@@ -42,10 +38,6 @@ public class MemDatasetMetadata extends DatasetMetadata {
      */
     public MemDatasetMetadata(DatasetConnection connection) throws SQLException {
         super(connection);
-        arq = new Version();
-        arq.addClass(ARQ.class);
-        jdbc = new Version();
-        jdbc.addClass(JenaJDBC.class);
     }
 
     @Override
@@ -65,7 +57,7 @@ public class MemDatasetMetadata extends DatasetMetadata {
 
     @Override
     public String getDatabaseProductVersion() {
-        return arq.toString();
+        return Version.versionForClass(JenaJDBC.class, "<development>");
     }
 
     @Override
@@ -85,12 +77,12 @@ public class MemDatasetMetadata extends DatasetMetadata {
 
     @Override
     public String getDriverVersion() {
-        return jdbc.toString();
+        return getDatabaseProductVersion();
     }
 
     @Override
     public String getURL() {
-        return "http://jena.apache.org";
+        return "https://jena.apache.org";
     }
 
     @Override
diff --git a/jena-jdbc/jena-jdbc-driver-remote/src/main/java/org/apache/jena/jdbc/remote/metadata/RemoteEndpointMetadata.java b/jena-jdbc/jena-jdbc-driver-remote/src/main/java/org/apache/jena/jdbc/remote/metadata/RemoteEndpointMetadata.java
index 5fde4ca6e3..4fd0887562 100644
--- a/jena-jdbc/jena-jdbc-driver-remote/src/main/java/org/apache/jena/jdbc/remote/metadata/RemoteEndpointMetadata.java
+++ b/jena-jdbc/jena-jdbc-driver-remote/src/main/java/org/apache/jena/jdbc/remote/metadata/RemoteEndpointMetadata.java
@@ -28,24 +28,21 @@ import org.apache.jena.jdbc.remote.connections.RemoteEndpointConnection ;
 
 /**
  * Represents metadata about connections to remote endpoints
- * 
+ *
  */
 public class RemoteEndpointMetadata extends JenaMetadata {
 
-    private Version jdbc;
     private RemoteEndpointConnection remoteConn;
 
     /**
      * Creates new metadata
-     * 
+     *
      * @param connection
      *            Remote Endpoint connection
      * @throws SQLException
      */
     public RemoteEndpointMetadata(RemoteEndpointConnection connection) throws SQLException {
         super(connection);
-        this.jdbc = new Version();
-        this.jdbc.addClass(JenaJDBC.class);
         this.remoteConn = connection;
     }
 
@@ -100,7 +97,7 @@ public class RemoteEndpointMetadata extends JenaMetadata {
 
     @Override
     public String getDriverVersion() {
-        return jdbc.toString();
+        return Version.versionForClass(JenaJDBC.class, "<development>");
     }
 
     @Override
diff --git a/jena-jdbc/jena-jdbc-driver-tdb/src/main/java/org/apache/jena/jdbc/tdb/metadata/TDBDatasetMetadata.java b/jena-jdbc/jena-jdbc-driver-tdb/src/main/java/org/apache/jena/jdbc/tdb/metadata/TDBDatasetMetadata.java
index 800ef6d5ed..ce343cd1c9 100644
--- a/jena-jdbc/jena-jdbc-driver-tdb/src/main/java/org/apache/jena/jdbc/tdb/metadata/TDBDatasetMetadata.java
+++ b/jena-jdbc/jena-jdbc-driver-tdb/src/main/java/org/apache/jena/jdbc/tdb/metadata/TDBDatasetMetadata.java
@@ -25,16 +25,12 @@ import org.apache.jena.atlas.lib.Version ;
 import org.apache.jena.jdbc.JenaJDBC ;
 import org.apache.jena.jdbc.connections.DatasetConnection ;
 import org.apache.jena.jdbc.metadata.DatasetMetadata ;
-import org.apache.jena.tdb.TDB ;
 
 /**
  * Connection metadata for TDB datasets
  *
  */
 public class TDBDatasetMetadata extends DatasetMetadata {
-    
-    private Version tdb;
-    private Version jdbc;
 
     /**
      * Creates new metadata
@@ -43,10 +39,6 @@ public class TDBDatasetMetadata extends DatasetMetadata {
      */
     public TDBDatasetMetadata(DatasetConnection connection) throws SQLException {
         super(connection);
-        tdb = new Version();
-        tdb.addClass(TDB.class);
-        jdbc = new Version();
-        jdbc.addClass(JenaJDBC.class);
     }
 
     @Override
@@ -66,9 +58,9 @@ public class TDBDatasetMetadata extends DatasetMetadata {
 
     @Override
     public String getDatabaseProductVersion() {
-        return tdb.toString(true);
+        return Version.versionForClass(JenaJDBC.class, "<development>");
     }
-    
+
     @Override
     public int getDefaultTransactionIsolation() {
         return Connection.TRANSACTION_SERIALIZABLE;
@@ -86,17 +78,17 @@ public class TDBDatasetMetadata extends DatasetMetadata {
 
     @Override
     public String getDriverName() {
-        return "Apache Jena - JDBC - TDB Driver";
+        return "Apache Jena - JDBC - TDB1 Driver";
     }
 
     @Override
     public String getDriverVersion() {
-        return jdbc.toString(true);
+        return Version.versionForClass(JenaJDBC.class, "<development>");
     }
 
     @Override
     public String getURL() {
-        return "http://jena.apache.org";
+        return "https://jena.apache.org";
     }
 
     @Override
diff --git a/jena-tdb1/pom.xml b/jena-tdb1/pom.xml
index 7837991523..a3fd638032 100644
--- a/jena-tdb1/pom.xml
+++ b/jena-tdb1/pom.xml
@@ -83,25 +83,7 @@
   </dependencies>
 
   <build>
-    <resources>
-      <resource>
-        <filtering>false</filtering>
-        <directory>src/main/resources</directory>
-        <excludes>
-          <exclude>org/apache/jena/tdb/tdb-properties.xml</exclude>
-        </excludes>
-      </resource>
-      <resource>
-        <filtering>true</filtering>
-        <directory>src/main/resources</directory>
-        <includes>
-          <include>org/apache/jena/tdb/tdb-properties.xml</include>
-        </includes>
-      </resource>
-    </resources>
-
     <plugins>
-
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-resources-plugin</artifactId>
diff --git a/jena-tdb1/src/main/resources/org/apache/jena/tdb/tdb-properties.xml b/jena-tdb1/src/main/resources/org/apache/jena/tdb/tdb-properties.xml
deleted file mode 100644
index 67d82551cf..0000000000
--- a/jena-tdb1/src/main/resources/org/apache/jena/tdb/tdb-properties.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-<!-- Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0 -->
-<properties version="1.0">
-  <comment>TDB System Properties</comment>
-  <entry key="org.apache.jena.tdb.version">${project.version}</entry>
-  <entry key="org.apache.jena.tdb.build.datetime">${build.time.xsd}</entry>
-</properties>
diff --git a/jena-tdb2/pom.xml b/jena-tdb2/pom.xml
index 287298e0b5..bdfc93e8c7 100644
--- a/jena-tdb2/pom.xml
+++ b/jena-tdb2/pom.xml
@@ -76,24 +76,7 @@
   </dependencies>
 
   <build>
-    <resources>
-      <resource>
-        <filtering>false</filtering>
-        <directory>src/main/resources</directory>
-        <excludes>
-          <exclude>org/apache/jena/tdb2/tdb2-properties.xml</exclude>
-        </excludes>
-      </resource>
-      <resource>
-        <filtering>true</filtering>
-        <directory>src/main/resources</directory>
-        <includes>
-          <include>org/apache/jena/tdb2/tdb2-properties.xml</include>
-        </includes>
-      </resource>
-    </resources>
-
-    <plugins> 
+    <plugins>
 
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
diff --git a/jena-tdb2/src/main/resources/org/apache/jena/tdb2/tdb2-properties.xml b/jena-tdb2/src/main/resources/org/apache/jena/tdb2/tdb2-properties.xml
deleted file mode 100644
index e494352b5c..0000000000
--- a/jena-tdb2/src/main/resources/org/apache/jena/tdb2/tdb2-properties.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-<!-- Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0 -->
-<properties version="1.0">
-  <comment>TDB2 System Properties</comment>
-  <entry key="org.apache.jena.tdb2.version">${project.version}</entry>
-  <entry key="org.apache.jena.tdb2.build.datetime">${build.time.xsd}</entry>
-</properties>