diff --git a/jetty-start/pom.xml b/jetty-start/pom.xml index 99999d1cd4d0..520843da97ff 100644 --- a/jetty-start/pom.xml +++ b/jetty-start/pom.xml @@ -13,7 +13,30 @@ org.eclipse.jetty.start.* + + + src/main/resources + true + + + + org.codehaus.mojo + buildnumber-maven-plugin + + + create-buildnumber + + create + + + false + false + ${nonCanonicalRevision} + + + + maven-jar-plugin diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/Props.java b/jetty-start/src/main/java/org/eclipse/jetty/start/Props.java index dcd70002048a..a88e8452b328 100644 --- a/jetty-start/src/main/java/org/eclipse/jetty/start/Props.java +++ b/jetty-start/src/main/java/org/eclipse/jetty/start/Props.java @@ -19,7 +19,9 @@ package org.eclipse.jetty.start; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; +import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -365,4 +367,32 @@ public String toString() { return props.toString(); } + + public static Props load(ClassLoader classLoader, String resourceName) + { + StartLog.debug("Looking for classloader resource: %s", resourceName); + return load(classLoader.getResource(resourceName)); + } + + public static Props load(URL url) + { + Props props = new Props(); + if (url != null) + { + StartLog.debug("Loading Props: %s", url.toExternalForm()); + try (InputStream in = url.openStream()) + { + Properties properties = new Properties(); + properties.load(in); + String urlStr = url.toExternalForm(); + properties.stringPropertyNames().forEach((name) -> + props.setProperty(name, properties.getProperty(name), urlStr)); + } + catch (IOException x) + { + StartLog.debug(x); + } + } + return props; + } } diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/StartArgs.java b/jetty-start/src/main/java/org/eclipse/jetty/start/StartArgs.java index f1040ec8b462..9aa254ea5628 100644 --- a/jetty-start/src/main/java/org/eclipse/jetty/start/StartArgs.java +++ b/jetty-start/src/main/java/org/eclipse/jetty/start/StartArgs.java @@ -21,9 +21,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; -import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -40,6 +38,7 @@ import java.util.Properties; import java.util.Set; import java.util.StringTokenizer; +import java.util.jar.Attributes; import java.util.jar.Manifest; import java.util.stream.Collectors; import java.util.stream.StreamSupport; @@ -66,61 +65,51 @@ public class StartArgs public static final Set ARG_PARTS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList( "args"))); + private static final String JETTY_VERSION_KEY = "jetty.version"; + private static final String JETTY_TAG_NAME_KEY = "jetty.tag.version"; + private static final String JETTY_BUILDNUM_KEY = "jetty.build"; + static { // Use command line versions - String ver = System.getProperty("jetty.version", null); - String tag = System.getProperty("jetty.tag.version", "master"); + String ver = System.getProperty(JETTY_VERSION_KEY); + String tag = System.getProperty(JETTY_TAG_NAME_KEY); // Use META-INF/MANIFEST.MF versions if (ver == null) { ver = ManifestUtils.getManifest(StartArgs.class) .map(Manifest::getMainAttributes) - .filter(attributes -> "Eclipse Jetty Project".equals(attributes.getValue("Implementation-Vendor"))) - .map(attributes -> attributes.getValue("Implementation-Version")) + .filter(attributes -> "Eclipse Jetty Project".equals(attributes.getValue(Attributes.Name.IMPLEMENTATION_VENDOR))) + .map(attributes -> attributes.getValue(Attributes.Name.IMPLEMENTATION_VERSION)) .orElse(null); } - // Use jetty-version.properties values - if (ver == null) + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + // use old jetty-version.properties (as seen within various linux distro repackaging of Jetty) + Props jettyVerProps = Props.load(classLoader, "jetty-version.properties"); + // use build-time properties (included in start.jar) to pull version and buildNumber + Props buildProps = Props.load(classLoader, "org/eclipse/jetty/start/build.properties"); + + String sha = buildProps.getString("buildNumber", System.getProperty(JETTY_BUILDNUM_KEY)); + if (Utils.isNotBlank(sha)) { - URL url = Thread.currentThread().getContextClassLoader().getResource("jetty-version.properties"); - if (url != null) - { - try (InputStream in = url.openStream()) - { - Properties props = new Properties(); - props.load(in); - ver = props.getProperty("jetty.version"); - } - catch (IOException x) - { - StartLog.debug(x); - } - } + System.setProperty(JETTY_BUILDNUM_KEY, sha); } - // Default values - if (ver == null) + if (Utils.isBlank(ver)) { - ver = "0.0"; - if (tag == null) - tag = "master"; + ver = jettyVerProps.getString("version", buildProps.getString("version", "0.0")); } - else + + if (Utils.isBlank(tag)) { - if (tag == null) - tag = "jetty-" + ver; + tag = jettyVerProps.getString("tag", buildProps.getString("tag", "jetty-" + ver)); } - // Set Tag Defaults - if (tag.contains("-SNAPSHOT")) - tag = "master"; - VERSION = ver; - System.setProperty("jetty.version", VERSION); - System.setProperty("jetty.tag.version", tag); + System.setProperty(JETTY_VERSION_KEY, VERSION); + System.setProperty(JETTY_TAG_NAME_KEY, tag); } private static final String MAIN_CLASS = "org.eclipse.jetty.xml.XmlConfiguration"; @@ -323,8 +312,9 @@ public void dumpEnvironment() System.out.println(); System.out.println("Jetty Environment:"); System.out.println("-----------------"); - dumpProperty("jetty.version"); - dumpProperty("jetty.tag.version"); + dumpProperty(JETTY_VERSION_KEY); + dumpProperty(JETTY_TAG_NAME_KEY); + dumpProperty(JETTY_BUILDNUM_KEY); dumpProperty("jetty.home"); dumpProperty("jetty.base"); diff --git a/jetty-start/src/main/resources/org/eclipse/jetty/start/build.properties b/jetty-start/src/main/resources/org/eclipse/jetty/start/build.properties new file mode 100644 index 000000000000..c9d20227f6c1 --- /dev/null +++ b/jetty-start/src/main/resources/org/eclipse/jetty/start/build.properties @@ -0,0 +1,4 @@ +buildNumber=${buildNumber} +timestamp=${timestamp} +version=${project.version} +scmUrl=${project.scm.connection} \ No newline at end of file