mirror of
https://github.com/JetBrains/JetBrainsRuntime.git
synced 2025-12-06 09:29:38 +01:00
8293667: Align jlink's --compress option with jmod's --compress option
Reviewed-by: mchung
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user