提交 361de486 编写于 作者: A alanb

8003256: (profiles) Add support for profile identification

Reviewed-by: dholmes, mchung, ksrini
上级 a08d1d42
#
# Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
......@@ -40,6 +40,7 @@ $(GENSRCDIR)/sun/misc/Version.java: \
-e 's/@@java_version@@/$(RELEASE)/g' \
-e 's/@@java_runtime_version@@/$(FULL_VERSION)/g' \
-e 's/@@java_runtime_name@@/$(RUNTIME_NAME)/g' \
-e 's/@@java_profile_name@@//g' \
$< > $@.temp
@$(MV) $@.temp $@
......
......@@ -23,24 +23,29 @@
# questions.
#
include ProfileNames.gmk
##########################################################################################
# Install the launcher name, release version string, full version
# string and the runtime name into the Version.java file.
# To be printed by java -version
$(JDK_OUTPUTDIR)/gensrc/sun/misc/Version.java: \
$(JDK_TOPDIR)/src/share/classes/sun/misc/Version.java.template
$(JDK_OUTPUTDIR)/gensrc/sun/misc/Version.java \
$(PROFILE_VERSION_JAVA_TARGETS): \
$(JDK_TOPDIR)/src/share/classes/sun/misc/Version.java.template
$(MKDIR) -p $(@D)
$(RM) $@ $@.tmp
$(ECHO) $(LOG_INFO) Generating sun/misc/Version.java
$(ECHO) Generating sun/misc/Version.java $(call profile_version_name, $@)
$(SED) -e 's/@@launcher_name@@/$(LAUNCHER_NAME)/g' \
-e 's/@@java_version@@/$(RELEASE)/g' \
-e 's/@@java_runtime_version@@/$(FULL_VERSION)/g' \
-e 's/@@java_runtime_name@@/$(RUNTIME_NAME)/g' \
-e 's/@@java_profile_name@@/$(call profile_version_name, $@)/g' \
$< > $@.tmp
$(MV) $@.tmp $@
GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc/sun/misc/Version.java
GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc/sun/misc/Version.java \
$(PROFILE_VERSION_JAVA_TARGETS)
##########################################################################################
# Version file for jconsole
......
/*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -36,8 +36,11 @@ public class Version {
"@@java_version@@";
private static final String java_runtime_name =
"@@java_runtime_name@@";
"@@java_runtime_name@@";
private static final String java_profile_name =
"@@java_profile_name@@";
private static final String java_runtime_version =
"@@java_runtime_version@@";
......@@ -49,6 +52,8 @@ public class Version {
System.setProperty("java.version", java_version);
System.setProperty("java.runtime.version", java_runtime_version);
System.setProperty("java.runtime.name", java_runtime_name);
if (java_profile_name.length() > 0)
System.setProperty("java.runtime.profile", java_profile_name);
}
private static boolean versionsInitialized = false;
......@@ -90,23 +95,28 @@ public class Version {
boolean isHeadless = false;
/* Report that we're running headless if the property is true */
String headless = System.getProperty("java.awt.headless");
if ( (headless != null) && (headless.equalsIgnoreCase("true")) ) {
String headless = System.getProperty("java.awt.headless");
if ( (headless != null) && (headless.equalsIgnoreCase("true")) ) {
isHeadless = true;
}
}
/* First line: platform version. */
ps.println(launcher_name + " version \"" + java_version + "\"");
/* Second line: runtime version (ie, libraries). */
ps.print(java_runtime_name + " (build " + java_runtime_version);
ps.print(java_runtime_name + " (build " + java_runtime_version);
if (java_profile_name.length() > 0) {
// profile name
ps.print(", profile " + java_profile_name);
}
if (java_runtime_name.indexOf("Embedded") != -1 && isHeadless) {
// embedded builds report headless state
ps.print(", headless");
}
ps.println(')');
if (java_runtime_name.indexOf("Embedded") != -1 && isHeadless) {
// embedded builds report headless state
ps.print(", headless");
}
ps.println(')');
/* Third line: JVM information. */
String java_vm_name = System.getProperty("java.vm.name");
......@@ -332,6 +342,67 @@ public class Version {
private static native boolean getJvmVersionInfo();
private static native void getJdkVersionInfo();
// Possible runtime profiles, ordered from small to large
private final static String[] PROFILES = { "compact1", "compact2", "compact3" };
/**
* Returns the name of the profile that this runtime implements. The empty
* string is returned for the full Java Runtime.
*/
public static String profileName() {
return java_profile_name;
}
/**
* Indicates if this runtime implements the full Java Runtime.
*/
public static boolean isFullJre() {
return java_profile_name.length() == 0;
}
// cached index of this profile's name in PROFILES (1-based)
private static int thisRuntimeIndex;
/**
* Indicates if this runtime supports the given profile. Profile names are
* case sensitive.
*
* @return {@code true} if the given profile is supported
*/
public static boolean supportsProfile(String requiredProfile) {
int x = thisRuntimeIndex - 1;
if (x < 0) {
String profile = profileName();
if (profile.length() > 0) {
x = 0;
while (x < PROFILES.length) {
if (PROFILES[x].equals(profile))
break;
x++;
}
if (x >= PROFILES.length)
throw new InternalError(profile + " not known to sun.misc.Version");
// okay if another thread has already set it
thisRuntimeIndex = x + 1;
}
// else we are a full JRE
}
int y = 0;
while (y < PROFILES.length) {
if (PROFILES[y].equals(requiredProfile))
break;
y++;
}
if (y >= PROFILES.length) {
// profile not found so caller has requested something that is not defined
return false;
}
return x < 0 || x >= y;
}
}
// Help Emacs a little because this file doesn't end in .java.
......
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 8003256
* @compile -XDignore.symbol.file VersionCheck.java
* @run main VersionCheck
* @summary Tests that "java -version" includes the name of the profile and that
* it matches the name in the release file
*/
import java.nio.file.*;
import java.io.*;
import java.util.Properties;
public class VersionCheck {
static final String JAVA_HOME = System.getProperty("java.home");
static final String OS_NAME = System.getProperty("os.name");
static final String OS_ARCH = System.getProperty("os.arch");
static final String JAVA_CMD =
OS_NAME.startsWith("Windows") ? "java.exe" : "java";
static final boolean NEED_D64 =
OS_NAME.equals("SunOS") &&
(OS_ARCH.equals("sparcv9") || OS_ARCH.equals("amd64"));
/**
* Returns {@code true} if the given class is present.
*/
static boolean isPresent(String cn) {
try {
Class.forName(cn);
return true;
} catch (ClassNotFoundException ignore) {
return false;
}
}
/**
* Determines the profile by checking whether specific classes are present.
* Returns the empty string if this runtime does not appear to be a profile
* of Java SE.
*/
static String probeProfile() {
if (isPresent("java.awt.Window"))
return "";
if (isPresent("java.lang.management.ManagementFactory"))
return "compact3";
if (isPresent("java.sql.DriverManager"))
return "compact2";
return "compact1";
}
/**
* Execs java with the given parameters. The method blocks until the
* process terminates. Returns a {@code ByteArrayOutputStream} with any
* stdout or stderr from the process.
*/
static ByteArrayOutputStream execJava(String... args)
throws IOException
{
StringBuilder sb = new StringBuilder();
sb.append(Paths.get(JAVA_HOME, "bin", JAVA_CMD).toString());
if (NEED_D64)
sb.append(" -d64");
for (String arg: args) {
sb.append(' ');
sb.append(arg);
}
String[] cmd = sb.toString().split(" ");
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.redirectErrorStream(true);
Process p = pb.start();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int n;
do {
n = p.getInputStream().read(buf);
if (n > 0)
baos.write(buf, 0, n);
} while (n > 0);
try {
int exitCode = p.waitFor();
if (exitCode != 0)
throw new RuntimeException("Exit code: " + exitCode);
} catch (InterruptedException e) {
throw new RuntimeException("Should not happen");
}
return baos;
}
public static void main(String[] args) throws IOException {
String reported = sun.misc.Version.profileName();
String probed = probeProfile();
if (!reported.equals(probed)) {
throw new RuntimeException("sun.misc.Version reports: " + reported
+ ", but probing reports: " + probed);
}
String profile = probed;
boolean isFullJre = (profile.length() == 0);
// check that java -version includes "profile compactN"
String expected = "profile " + profile;
System.out.println("Checking java -version ...");
ByteArrayOutputStream baos = execJava("-version");
ByteArrayInputStream bain = new ByteArrayInputStream(baos.toByteArray());
BufferedReader reader = new BufferedReader(new InputStreamReader(bain));
boolean found = false;
String line;
while ((line = reader.readLine()) != null) {
if (line.contains(expected)) {
found = true;
break;
}
}
if (found && isFullJre)
throw new RuntimeException(expected + " found in java -version output");
if (!found && !isFullJre)
throw new RuntimeException("java -version did not include " + expected);
// check that the profile name matches the release file
System.out.println("Checking release file ...");
Properties props = new Properties();
Path home = Paths.get(JAVA_HOME);
if (home.getFileName().toString().equals("jre"))
home = home.getParent();
Path release = home.resolve("release");
try (InputStream in = Files.newInputStream(release)) {
props.load(in);
}
String value = props.getProperty("JAVA_PROFILE");
if (isFullJre) {
if (value != null)
throw new RuntimeException("JAVA_PROFILE should not be present");
} else {
if (value == null)
throw new RuntimeException("JAVA_PROFILE not present in release file");
if (!value.equals("\"" + profile + "\""))
throw new RuntimeException("Unexpected value of JAVA_PROFILE: " + value);
}
System.out.println("Test passed.");
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册