/* * Copyright (c) 2016, 2020, 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. */ import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import jdk.test.lib.apps.LingeredApp; public class LingeredAppForJps extends LingeredApp { // if set, the app is run from jar file private File jarFile; @Override protected void runAddAppName(List cmd) { if (jarFile != null) { cmd.add("-Xdiag"); cmd.add("-jar"); cmd.add(jarFile.getAbsolutePath()); } else { super.runAddAppName(cmd); } } /** * The jps output should contain processes' names * (except when jps is started in quite mode). * The expected name of the test process is prepared here. */ public String getProcessName() { return jarFile == null ? getClass().getSimpleName() : jarFile.getName(); } // full package name for the application's main class or the full path // name to the application's JAR file: public String getFullProcessName() { return jarFile == null ? getClass().getCanonicalName() : jarFile.getAbsolutePath(); } public void buildJar() throws IOException { String className = LingeredAppForJps.class.getName(); File jar = new File(className + ".jar"); String testClassPath = System.getProperty("test.class.path", "?"); // Classpath contains test class dir, libraries class dir(s), and // may contains some additional dirs. // We need to add to jar only classes from the test class directory. // Main class (this class) should only be found in one directory // from the classpath (test class dir), therefore only added once. // Libraries class dir(s) and any additional classpath directories // are written the jar manifest. File manifestFile = new File(className + ".mf"); String nl = System.getProperty("line.separator"); String manifestClasspath = ""; List jarArgs = new ArrayList<>(); jarArgs.add("-cfm"); jarArgs.add(jar.getAbsolutePath()); jarArgs.add(manifestFile.getAbsolutePath()); for (String path : testClassPath.split(File.pathSeparator)) { String classFullName = path + File.separator + className + ".class"; File f = new File(classFullName); if (f.exists()) { jarArgs.add("-C"); jarArgs.add(path); jarArgs.add("."); System.out.println("INFO: scheduled to jar " + path); } else { manifestClasspath += " " + new File(path).toURI(); } } try (BufferedWriter output = new BufferedWriter(new FileWriter(manifestFile))) { output.write("Main-Class: " + className + nl); if (!manifestClasspath.isEmpty()) { output.write("Class-Path: " + manifestClasspath + nl); } } System.out.println("Running jar " + jarArgs.toString()); sun.tools.jar.Main jarTool = new sun.tools.jar.Main(System.out, System.err, "jar"); if (!jarTool.run(jarArgs.toArray(new String[jarArgs.size()]))) { throw new IOException("jar failed: args=" + jarArgs.toString()); } manifestFile.delete(); jar.deleteOnExit(); // Print content of jar file System.out.println("Content of jar file" + jar.getAbsolutePath()); jarArgs = new ArrayList<>(); jarArgs.add("-tvf"); jarArgs.add(jar.getAbsolutePath()); jarTool = new sun.tools.jar.Main(System.out, System.err, "jar"); if (!jarTool.run(jarArgs.toArray(new String[jarArgs.size()]))) { throw new IOException("jar failed: args=" + jarArgs.toString()); } jarFile = jar; } public static void main(String args[]) { LingeredApp.main(args); } }