8154090: Remove support for jimage recreate
Reviewed-by: alanb
This commit is contained in:
parent
58b1ba941e
commit
c20a95b52d
@ -1,78 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package jdk.tools.jimage;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.function.Consumer;
|
||||
import jdk.tools.jlink.internal.ImageFileCreator;
|
||||
import jdk.tools.jlink.internal.Archive;
|
||||
import jdk.tools.jlink.internal.ImagePluginStack;
|
||||
import jdk.tools.jlink.internal.DirArchive;
|
||||
/**
|
||||
*
|
||||
* Support for extracted image.
|
||||
*/
|
||||
public final class ExtractedImage {
|
||||
|
||||
private Set<Archive> archives = new HashSet<>();
|
||||
private final ImagePluginStack plugins;
|
||||
|
||||
ExtractedImage(Path dirPath, ImagePluginStack plugins, PrintWriter log,
|
||||
boolean verbose) throws IOException {
|
||||
if (!Files.isDirectory(dirPath)) {
|
||||
throw new IOException("Not a directory");
|
||||
}
|
||||
Consumer<String> cons = (String t) -> {
|
||||
if (verbose) {
|
||||
log.println(t);
|
||||
}
|
||||
};
|
||||
this.plugins = plugins;
|
||||
Files.walk(dirPath, 1).forEach((p) -> {
|
||||
if (!dirPath.equals(p)) {
|
||||
if (Files.isDirectory(p)) {
|
||||
Archive a = new DirArchive(p, cons);
|
||||
archives.add(a);
|
||||
}
|
||||
}
|
||||
});
|
||||
archives = Collections.unmodifiableSet(archives);
|
||||
}
|
||||
|
||||
void recreateJImage(Path path) throws IOException {
|
||||
ImageFileCreator.recreateJimage(path, archives, plugins);
|
||||
}
|
||||
|
||||
private static String getPathName(Path path) {
|
||||
return path.toString().replace(File.separatorChar, '/');
|
||||
}
|
||||
}
|
@ -32,7 +32,6 @@ import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.nio.channels.FileChannel;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import static java.nio.file.StandardOpenOption.READ;
|
||||
import static java.nio.file.StandardOpenOption.WRITE;
|
||||
import java.util.LinkedList;
|
||||
@ -44,8 +43,6 @@ import static jdk.internal.jimage.ImageHeader.MAJOR_VERSION;
|
||||
import static jdk.internal.jimage.ImageHeader.MINOR_VERSION;
|
||||
import jdk.internal.jimage.ImageLocation;
|
||||
import jdk.tools.jlink.internal.ImageResourcesTree;
|
||||
import jdk.tools.jlink.internal.ImagePluginConfiguration;
|
||||
import jdk.tools.jlink.internal.ImagePluginStack;
|
||||
import jdk.tools.jlink.internal.TaskHelper;
|
||||
import jdk.tools.jlink.internal.TaskHelper.BadArgs;
|
||||
import static jdk.tools.jlink.internal.TaskHelper.JIMAGE_BUNDLE;
|
||||
@ -97,7 +94,6 @@ class JImageTask {
|
||||
EXTRACT,
|
||||
INFO,
|
||||
LIST,
|
||||
RECREATE,
|
||||
SET,
|
||||
VERIFY
|
||||
};
|
||||
@ -160,18 +156,20 @@ class JImageTask {
|
||||
try {
|
||||
List<String> unhandled = optionsHelper.handleOptions(this, args);
|
||||
if(!unhandled.isEmpty()) {
|
||||
options.task = Enum.valueOf(Task.class, unhandled.get(0).toUpperCase());
|
||||
try {
|
||||
options.task = Enum.valueOf(Task.class, unhandled.get(0).toUpperCase());
|
||||
} catch (IllegalArgumentException ex) {
|
||||
throw taskHelper.newBadArgs("err.not.a.task", unhandled.get(0));
|
||||
}
|
||||
for(int i = 1; i < unhandled.size(); i++) {
|
||||
options.jimages.add(new File(unhandled.get(i)));
|
||||
}
|
||||
} else {
|
||||
throw taskHelper.newBadArgs("err.not.a.task", "<unspecified>");
|
||||
}
|
||||
if (options.help) {
|
||||
optionsHelper.showHelp(PROGNAME);
|
||||
}
|
||||
if(optionsHelper.listPlugins()) {
|
||||
optionsHelper.listPlugins(true);
|
||||
return EXIT_OK;
|
||||
}
|
||||
if (options.version || options.fullVersion) {
|
||||
taskHelper.showVersion(options.fullVersion);
|
||||
}
|
||||
@ -191,30 +189,6 @@ class JImageTask {
|
||||
}
|
||||
}
|
||||
|
||||
private void recreate() throws Exception, BadArgs {
|
||||
File directory = new File(options.directory);
|
||||
if (!directory.isDirectory()) {
|
||||
throw taskHelper.newBadArgs("err.not.a.dir", directory.getAbsolutePath());
|
||||
}
|
||||
Path dirPath = directory.toPath();
|
||||
if (options.jimages.isEmpty()) {
|
||||
throw taskHelper.newBadArgs("err.jimage.not.specified");
|
||||
} else if (options.jimages.size() != 1) {
|
||||
throw taskHelper.newBadArgs("err.only.one.jimage");
|
||||
}
|
||||
|
||||
Path jimage = options.jimages.get(0).toPath();
|
||||
|
||||
if (jimage.toFile().createNewFile()) {
|
||||
ImagePluginStack pc = ImagePluginConfiguration.parseConfiguration(taskHelper.
|
||||
getPluginsConfig(null, false));
|
||||
ExtractedImage img = new ExtractedImage(dirPath, pc, log, options.verbose);
|
||||
img.recreateJImage(jimage);
|
||||
} else {
|
||||
throw taskHelper.newBadArgs("err.jimage.already.exists", jimage.getFileName());
|
||||
}
|
||||
}
|
||||
|
||||
private void title(File file, BasicImageReader reader) {
|
||||
log.println("jimage: " + file.getName());
|
||||
}
|
||||
@ -379,9 +353,6 @@ class JImageTask {
|
||||
case LIST:
|
||||
iterate(this::listTitle, this::list);
|
||||
break;
|
||||
case RECREATE:
|
||||
recreate();
|
||||
break;
|
||||
case SET:
|
||||
iterate(this::set, null);
|
||||
break;
|
||||
|
@ -1,30 +1,25 @@
|
||||
main.usage.summary=\
|
||||
Usage: {0} <extract|info|list|recreate|set|verify> <options> jimage...\n\
|
||||
Usage: {0} <extract|info|list|set|verify> <options> jimage...\n\
|
||||
use --help for a list of possible options
|
||||
|
||||
main.usage=\
|
||||
Usage: {0} <extract|info|list|recreate|set|verify> <options> jimage...\n\
|
||||
Usage: {0} <extract|info|list|set|verify> <options> jimage...\n\
|
||||
\n\
|
||||
\ extract - Extract all jimage entries into separate files into the directory\n\
|
||||
\ specified by --dir=<directory> (default='.')\n\
|
||||
\ info - Prints information specified in the jimage header.\n\
|
||||
\ list - Prints the names of all the entries in the jimage. When used with\n\
|
||||
\ --verbose will also print entry attributes ex. size and offset.\n\
|
||||
\ recreate - Reconstructs a jimage from an extracted directory (--dir)\n\
|
||||
\ set - sets the value of specific jimage header entries\n\
|
||||
\ verify - Reports errors on any .class entries that don't verify as classes.\n\
|
||||
\n\
|
||||
Possible options include:
|
||||
|
||||
main.extended.help=\
|
||||
jimage recreate is extensible by the main of plugins. Following plugins have been discovered \
|
||||
thanks to ServiceLoader and can be used when re-creating a jimage.
|
||||
|
||||
error.prefix=Error:
|
||||
warn.prefix=Warning:
|
||||
|
||||
main.opt.dir=\
|
||||
\ --dir Target directory for extract/recreate
|
||||
\ --dir Target directory for extract
|
||||
|
||||
main.opt.flags=\
|
||||
\ --flags=value Set the jimage flags to value
|
||||
@ -38,14 +33,8 @@ main.opt.verbose=\
|
||||
main.opt.version=\
|
||||
\ --version Version information
|
||||
|
||||
main.opt.configuration=\
|
||||
\ --configuration <path> Path to properties file containing defaults\
|
||||
\ options for recreate
|
||||
|
||||
main.command.files=\
|
||||
\ @<filename> Read options from file
|
||||
|
||||
err.cannot.create.dir=cannot create directory: {0}
|
||||
err.cannot.read.file=cannot read file: {0}
|
||||
err.cannot.update.file=cannot update file: {0}
|
||||
err.file.not.found=cannot find file: {0}
|
||||
@ -53,12 +42,10 @@ err.file.error=cannot access file: {0}
|
||||
err.flags.not.int=--flags value not integer: {0}
|
||||
err.internal.error=internal error: {0} {1} {2}
|
||||
err.invalid.arg.for.option=invalid argument for option: {0}
|
||||
err.invalid.task=task must be extract|recreate|info|list|verify: {0}
|
||||
err.jimage.already.exists=jimage already exists: {0}
|
||||
err.jimage.not.specified=no jimage specified
|
||||
err.invalid.task=task must be extract|info|list|verify: {0}
|
||||
err.missing.arg=no value given for {0}
|
||||
err.not.a.dir=not a directory: {0}
|
||||
err.not.a.jimage=not a jimage file: {0}
|
||||
err.only.one.jimage=only one jimage should be specified
|
||||
err.not.a.task=not a valid task: {0}
|
||||
err.option.unsupported={0} not supported: {1}
|
||||
err.unknown.option=unknown option: {0}
|
||||
|
@ -110,54 +110,5 @@ public class JImageTest {
|
||||
.dir(helper.createNewExtractedDir("modules"))
|
||||
.image(image.resolve("lib").resolve("modules"))
|
||||
.extract().assertSuccess();
|
||||
|
||||
Path recreatedImage = JImageGenerator.getJImageTask()
|
||||
.dir(extractedDir)
|
||||
.image(helper.createNewRecreatedDir(extractedDir.getFileName().toString()))
|
||||
.recreate().assertSuccess();
|
||||
JImageValidator.validate(recreatedImage, bootClasses, Collections.emptyList());
|
||||
|
||||
// Check replacing the boot image by recreated one
|
||||
Path destFile = image.resolve("lib").resolve("modules");
|
||||
Files.copy(recreatedImage, destFile, REPLACE_EXISTING);
|
||||
JImageValidator validator = new JImageValidator(module, Collections.emptyList(),
|
||||
image.toFile(), Collections.emptyList(), Collections.emptyList());
|
||||
validator.validate();
|
||||
|
||||
Path recreatedImage2 = JImageGenerator.getJImageTask()
|
||||
.dir(extractedDir)
|
||||
.option("--compress").option("2")
|
||||
.image(helper.createNewRecreatedDir(extractedDir.getFileName().toString()))
|
||||
.recreate().assertSuccess();
|
||||
JImageValidator.validate(recreatedImage2, bootClasses, Collections.emptyList());
|
||||
|
||||
Path recreatedImage3 = JImageGenerator.getJImageTask()
|
||||
.dir(extractedDir)
|
||||
.option("--strip-debug")
|
||||
.image(helper.createNewRecreatedDir(extractedDir.getFileName().toString()))
|
||||
.recreate().assertSuccess();
|
||||
JImageValidator.validate(recreatedImage3, bootClasses, Collections.emptyList());
|
||||
|
||||
Path recreatedImage4 = JImageGenerator.getJImageTask()
|
||||
.dir(extractedDir)
|
||||
.option("--exclude-resources")
|
||||
.option("*.jcov, */META-INF/*")
|
||||
.image(helper.createNewRecreatedDir(extractedDir.getFileName().toString()))
|
||||
.recreate().assertSuccess();
|
||||
List<String> unexpectedPaths = new ArrayList<>();
|
||||
unexpectedPaths.add(".jcov");
|
||||
unexpectedPaths.add("/META-INF/");
|
||||
JImageValidator.validate(recreatedImage4, bootClasses, unexpectedPaths);
|
||||
|
||||
Path recreatedImage5 = JImageGenerator.getJImageTask()
|
||||
.dir(extractedDir)
|
||||
.option("--compress")
|
||||
.option("2")
|
||||
.option("--strip-debug")
|
||||
.option("--exclude-resources")
|
||||
.option("*.jcov, */META-INF/*")
|
||||
.image(helper.createNewRecreatedDir(extractedDir.getFileName().toString()))
|
||||
.recreate().assertSuccess();
|
||||
JImageValidator.validate(recreatedImage5, bootClasses, unexpectedPaths);
|
||||
}
|
||||
}
|
||||
|
@ -63,11 +63,7 @@ public class JImageToolTest {
|
||||
String jimage = jimagePath.toAbsolutePath().toString();
|
||||
String bootimage = modulesimagePath.toAbsolutePath().toString();
|
||||
String extractDir = Paths.get(".", "extract").toAbsolutePath().toString();
|
||||
String recreateImage = Paths.get(".", "recreate").toAbsolutePath().toString();
|
||||
String relativeRecreateImage = Paths.get(".", "recreate2").toString();
|
||||
jimage("extract", "--dir", extractDir, bootimage);
|
||||
jimage("recreate", "--dir", extractDir, recreateImage);
|
||||
jimage("recreate", "--dir", extractDir, relativeRecreateImage);
|
||||
System.out.println("Test successful");
|
||||
} else {
|
||||
System.out.println("Test skipped, not an images build");
|
||||
|
@ -553,10 +553,6 @@ public class JImageGenerator {
|
||||
public Result extract() {
|
||||
return cmd("extract", dir);
|
||||
}
|
||||
|
||||
public Result recreate() {
|
||||
return cmd("recreate", image);
|
||||
}
|
||||
}
|
||||
|
||||
public static class JLinkTask {
|
||||
|
Loading…
Reference in New Issue
Block a user