8293667: Align jlink's --compress option with jmod's --compress option

Reviewed-by: mchung
This commit is contained in:
Ian Graves
2023-02-27 21:05:36 +00:00
parent 54603aa1b7
commit 784f7b1462
6 changed files with 129 additions and 38 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2023, 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
@@ -92,16 +92,26 @@ public final class DefaultCompressPlugin extends AbstractPlugin implements Resou
if (level != null) {
switch (level) {
case LEVEL_0:
System.err.println(getMessage("compress.warn.argumentdeprecated", LEVEL_0));
ss = null;
zip = null;
break;
case LEVEL_1:
System.err.println(getMessage("compress.warn.argumentdeprecated", LEVEL_1));
ss = new StringSharingPlugin(resFilter);
break;
case LEVEL_2:
System.err.println(getMessage("compress.warn.argumentdeprecated", LEVEL_2));
zip = new ZipPlugin(resFilter);
break;
default:
if (level.length() == 5 && level.startsWith("zip-")) {
try {
int zipLevel = Integer.parseInt(level.substring(4));
zip = new ZipPlugin(resFilter, zipLevel);
break;
} catch (NumberFormatException ignored) {}
}
throw new IllegalArgumentException("Invalid compression level " + level);
}
} else {

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2023, 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
@@ -45,6 +45,9 @@ public final class ZipPlugin extends AbstractPlugin {
private Predicate<String> predicate;
private static final int DEFAULT_COMPRESSION = 6;
private final int compressionLevel;
public ZipPlugin() {
this((Predicate<String>) null);
}
@@ -54,8 +57,13 @@ public final class ZipPlugin extends AbstractPlugin {
}
ZipPlugin(Predicate<String> predicate) {
this(predicate, DEFAULT_COMPRESSION);
}
ZipPlugin(Predicate<String> predicate, int compressionLevel) {
super("zip");
this.predicate = predicate;
this.compressionLevel = compressionLevel;
}
@Override
@@ -73,8 +81,8 @@ public final class ZipPlugin extends AbstractPlugin {
predicate = ResourceFilter.includeFilter(config.get(getName()));
}
static byte[] compress(byte[] bytesIn) {
Deflater deflater = new Deflater();
static byte[] compress(byte[] bytesIn, int compressionLevel) {
Deflater deflater = new Deflater(compressionLevel);
deflater.setInput(bytesIn);
ByteArrayOutputStream stream = new ByteArrayOutputStream(bytesIn.length);
byte[] buffer = new byte[1024];
@@ -104,7 +112,7 @@ public final class ZipPlugin extends AbstractPlugin {
if (resource.type().equals(ResourcePoolEntry.Type.CLASS_OR_RESOURCE)
&& predicate.test(resource.path())) {
byte[] compressed;
compressed = compress(resource.contentBytes());
compressed = compress(resource.contentBytes(), this.compressionLevel);
res = ResourcePoolManager.newCompressedResource(resource,
ByteBuffer.wrap(compressed), getName(), null,
((ResourcePoolImpl)in).getStringTable(), in.byteOrder());

View File

@@ -59,38 +59,20 @@ Class optimization: convert Class.forName calls to constant loads.
class-for-name.usage=\
\ --class-for-name Class optimization: convert Class.forName calls to constant loads.
compress.argument=<0|1|2>[:filter=<pattern-list>]
compress.argument=<zip-[0-9]>[:filter=<pattern-list>]
compress.description=\
Compress all resources in the output image.\n\
Level 0: No compression\n\
Level 1: Constant string sharing\n\
Level 2: ZIP.\n\
An optional <pattern-list> filter can be specified to list the pattern of\n\
files to be included.
compress.description= Compression to use in compressing resources.
compress.usage=\
\ --compress <0|1|2>[:filter=<pattern-list>]\n\
\ Compress all resources in the output image.\n\
\ Level 0: No compression\n\
\ Level 1: Constant string sharing\n\
\ Level 2: ZIP.\n\
\ An optional <pattern-list> filter can be\n\
\ specified to list the pattern of \n\
\ files to be included.
\ --compress <compress> Compression to use in compressing resources:\n\
\ Accepted values are:\n\
\ zip-[0-9], where zip-0 provides no compression,\n\
\ and zip-9 provides the best compression.\n\
\ Default is zip-6.
compact-cp.argument=<resource paths>
compress.warn.argumentdeprecated=\
Warning: The {0} argument for --compress is deprecated and may be removed in a future release
compact-cp.description=Constant Pool strings sharing.\n\
By default, all resources are compressed. You can express the set \n\
of resources to compress or not compress (use ^ for negation).
compact-cp.usage=\
\ --compact-cp <resource paths>\n\
\ Constant Pool strings sharing.\n\
\ By default, all resources are compressed.\n\
\ You can express the set of resources to\n\
\ compress or not compress (use ^ for negation).
dedup-legal-notices.argument=[error-if-not-same-content]
@@ -323,10 +305,15 @@ plugin.opt.disable-plugin=\
\ --disable-plugin <pluginname> Disable the plugin mentioned
plugin.opt.compress=\
\ -c, --compress=<0|1|2> Enable compression of resources:\n\
\ Level 0: No compression\n\
\ Level 1: Constant string sharing\n\
\ Level 2: ZIP
\ --compress <compress> Compression to use in compressing resources:\n\
\ Accepted values are:\n\
\ zip-[0-9], where zip-0 provides no compression,\n\
\ and zip-9 provides the best compression.\n\
\ Default is zip-6.\n\
\ Deprecated values to be removed in a future release:\n\
\ 0: No compression. Equivalent to zip-0.\n\
\ 1: Constant String Sharing\n\
\ 2: Equivalent to zip-6.
plugin.opt.strip-debug=\
\ -G, --strip-debug Strip debug information

View File

@@ -82,5 +82,4 @@ module jdk.jlink {
jdk.tools.jlink.internal.plugins.VendorVersionPlugin,
jdk.tools.jlink.internal.plugins.CDSPlugin,
jdk.tools.jlink.internal.plugins.SaveJlinkArgfilesPlugin;
}

View File

@@ -309,6 +309,15 @@ public class JLinkTest {
"--compress=2:filter=^/java.base/java/lang/*");
}
// Unix style compression arguments
{
testCompress(helper, "compresscmdcompositezip6", "--compress", "zip-6");
}
{
testCompress(helper, "compresscmdcompositezip0", "--compress", "zip-0");
}
// compress 0
{
testCompress(helper, "compress0filtercmdcomposite2",
@@ -326,6 +335,23 @@ public class JLinkTest {
testCompress(helper, "compress2filtercmdcomposite2",
"--compress=2:filter=^/java.base/java/lang/*");
}
// compress zip-0 with filter
{
testCompress(helper, "compresszip0filtercmdcomposite2",
"--compress=zip-0:filter=^/java.base/java/lang/*");
}
// compress zip-6 with filter
{
testCompress(helper, "compresszip6filtercmdcomposite2",
"--compress=zip-6:filter=^/java.base/java/lang/*");
}
// compress zip-9 with filter
{
testCompress(helper, "compresszip9filtercmdcomposite2",
"--compress=zip-9:filter=^/java.base/java/lang/*");
}
// invalid compress level
{

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2023, 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
@@ -146,6 +146,67 @@ public class CompressorPluginTest {
new ResourceDecompressorFactory[]{
new ZipDecompressorFactory(),
}, Collections.singletonList(".*Exception.class"));
// compress level zip-0 == no compression
Properties optionsZip0 = new Properties();
DefaultCompressPlugin compressPluginZip0 = new DefaultCompressPlugin();
optionsZip0.setProperty(compressPluginZip0.getName(), "zip-0");
checkCompress(classes, compressPluginZip0,
optionsZip0,
new ResourceDecompressorFactory[]{
});
// compress level zip-[1-9] == varied compression levels
for(int i = 1; i < 10; i++) {
Properties optionsZip = new Properties();
compressPlugin = new DefaultCompressPlugin();
optionsZip.setProperty(compressPlugin.getName(), "zip-" + i);
checkCompress(classes, compressPlugin,
optionsZip,
new ResourceDecompressorFactory[]{
new ZipDecompressorFactory(),
});
}
// compress level zip-[1-9] == varied compression levels + filter
for(int i = 1; i < 10; i++) {
Properties optionsZip = new Properties();
compressPlugin = new DefaultCompressPlugin();
optionsZip.setProperty(DefaultCompressPlugin.FILTER, "**Exception.class");
optionsZip.setProperty(compressPlugin.getName(), "zip-" + i);
checkCompress(classes, compressPlugin,
optionsZip,
new ResourceDecompressorFactory[]{
new ZipDecompressorFactory(),
}, Collections.singletonList(".*Exception.class"));
}
testBadCompressProps(classes, "zip-10");
testBadCompressProps(classes, "zip-badarg");
testBadCompressProps(classes, "zip-10000000");
}
private void testBadCompressProps(ResourcePool classes, String compressArg) throws Exception {
Properties badProps = new Properties();
DefaultCompressPlugin compressPlugin = new DefaultCompressPlugin();
badProps.setProperty(compressPlugin.getName(), compressArg);
try {
checkCompress(classes, compressPlugin,
badProps,
new ResourceDecompressorFactory[]{
new ZipDecompressorFactory(),
});
} catch (IllegalArgumentException e) {
if (e.getMessage().contains("Invalid compression level")) {
return;
} else {
throw e;
}
}
throw new Exception("Expected compression IAE with " + compressArg + " but didn't get one.");
}
private ResourcePool gatherResources(Path module) throws Exception {