Skip to content

Commit d86040b

Browse files
committed
Add filter for multi-release jar files.
1 parent de561d0 commit d86040b

10 files changed

Lines changed: 199 additions & 38 deletions

File tree

.mvn/checksums.sha256

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,7 @@ net.bytebuddy:byte-buddy-agent:jar:1.14.8 f7c60fd229df2b0f4e390f50e0582a23ac1d89
647647
net.bytebuddy:byte-buddy-agent:jar:1.14.9 11ed107d4b78e55f8c3d34250494375081a29bc125a1f5c56db582ccdd48835f
648648
net.bytebuddy:byte-buddy-agent:jar:1.15.0 3399a0fdf7ba3f1386ebf831a706037428f1b1af81d653c25cf8a8fde2e4d2ea
649649
net.bytebuddy:byte-buddy-agent:jar:1.15.1 77a39846b42110eb50e49e4ff6137e3f0a92eb3bb6f59ce52dc4095c8b901005
650+
net.bytebuddy:byte-buddy-agent:jar:1.15.2 f8673a2dec2a4c2b0a910d92b4b332bb9622890332138e4c401364cba74eda77
650651
net.bytebuddy:byte-buddy-android:jar:1.12.19 bb73d3b9ace5a60a9a9aa1701761073b3df3baf79ff463aed6cd94b724fd3ba9
651652
net.bytebuddy:byte-buddy-android:jar:1.12.20 f43b8b7eb840f6140135066224f0e6b565b9becb05345fdc572a66bfb92df0aa
652653
net.bytebuddy:byte-buddy-android:jar:1.12.21 bf4ad1405c2fcaa8b179929f9a64c8ee66d04f34b0e3fe8a90b28c738f883fe9
@@ -675,6 +676,7 @@ net.bytebuddy:byte-buddy-android:jar:1.14.8 9c1ea03f4b06c85a30800b810b196806a480
675676
net.bytebuddy:byte-buddy-android:jar:1.14.9 3cdbdaaf439bce36b94dd27782b86fb1d92bbbedcd527dbf2ee14e0412f6b80e
676677
net.bytebuddy:byte-buddy-android:jar:1.15.0 3874728750cd8917f70190eb0d004ccef4c3e00652b42d89d97e5d890e97c5af
677678
net.bytebuddy:byte-buddy-android:jar:1.15.1 b8724a3372f76dbbe01ea3385baad0c325c583f637a87d32428b612be70b5b32
679+
net.bytebuddy:byte-buddy-android:jar:1.15.2 a19d628dee90c74e96a321e9814e2c5f3fe4e6404b05a7b25ec407e227e25e7e
678680
net.bytebuddy:byte-buddy-dep:jar:1.12.19 a85bb853ec6ec156b10ea0b5b0e38ac0f89c6c2bc89dd0358772a0dff2eb85c9
679681
net.bytebuddy:byte-buddy-dep:jar:1.12.20 d7e15d3ccc0508e78a146f1be420779eb3e2e9a537e3c8add3cd6d802c9a615e
680682
net.bytebuddy:byte-buddy-dep:jar:1.12.21 116b320c1f3f8539978ea67989d94e9bfed3e9422beb5a76749d967439ec8f9d
@@ -703,6 +705,7 @@ net.bytebuddy:byte-buddy-dep:jar:1.14.8 149957aaeb4c069864cad647c8f8680d8f939350
703705
net.bytebuddy:byte-buddy-dep:jar:1.14.9 e9affd66effe9857856b5948463893c02ad7a91e37cf3d8c07930e73cc8c282f
704706
net.bytebuddy:byte-buddy-dep:jar:1.15.0 5b4840406be9f761d39f314bc1b5d0574b55c163140fcfe7b6f670e82fb0738c
705707
net.bytebuddy:byte-buddy-dep:jar:1.15.1 ade2ebcc897db4ecc13ab61188d8251665314cbf8f3268e558e75f9728380fc6
708+
net.bytebuddy:byte-buddy-dep:jar:1.15.2 50f05dad8a626e588b2f89de7eefc9212515d45d6a03fb87870f946f0bab56f7
706709
net.bytebuddy:byte-buddy-maven-plugin:jar:1.12.19 3419e2afbfac4f21ef709ee3f8f08fc1d71001e07ba2524a0bb2a3c28f3e1087
707710
net.bytebuddy:byte-buddy-maven-plugin:jar:1.12.20 48a36e2e8c2dbe2b3673ef8bf6be22b021cfca35d6205a3d5e722f74db42d52b
708711
net.bytebuddy:byte-buddy-maven-plugin:jar:1.12.21 cb3332f89cc6502e3637dbe509c08c55cb5ad528c675131858dda89eabf7c9fc
@@ -728,6 +731,7 @@ net.bytebuddy:byte-buddy-maven-plugin:jar:1.14.6 d30844d8955cc7d9bba051bb5509166
728731
net.bytebuddy:byte-buddy-maven-plugin:jar:1.14.9 2bc8809f83aed11a531f093da593c52e3b572b7ee7359c1e3eff3796061db44e
729732
net.bytebuddy:byte-buddy-maven-plugin:jar:1.15.0 e14df4a925a628f3f7b937005eba803b1e9d320ee7a8172f734691dfa58bd432
730733
net.bytebuddy:byte-buddy-maven-plugin:jar:1.15.1 9cb4a37d5bb17cd55ea52e9f660a87b7b9fdae56bfe886f9588b09929207f7e3
734+
net.bytebuddy:byte-buddy-maven-plugin:jar:1.15.2 1cda61087db3b8159f77be5f74e04f816a24ea1d9cd54ba0b537c6573c6d118e
731735
net.bytebuddy:byte-buddy-maven-plugin:pom:1.12.19 c2051f8cbdf328692f36077627be07168334ee9167b72e5bf608eae624163b4f
732736
net.bytebuddy:byte-buddy-maven-plugin:pom:1.12.20 2d112ff342e7db7da484d038807749c1a87c81419b789a86b950a37bdd65b207
733737
net.bytebuddy:byte-buddy-maven-plugin:pom:1.12.21 13576ca6b9c44ab9789ada11ee400dcd3f4bcc22a7cab6f7052aeeb49a8c02e1
@@ -753,6 +757,7 @@ net.bytebuddy:byte-buddy-maven-plugin:pom:1.14.6 e301c83e77f6b8da2e2090c9eb6288f
753757
net.bytebuddy:byte-buddy-maven-plugin:pom:1.14.9 75c6d50a8cf6d528eb09b198e54035b6bbc10d0653655194ae697b971334fdd2
754758
net.bytebuddy:byte-buddy-maven-plugin:pom:1.15.0 cc233d43805a7e9756c8a94c4751a18cb938ac3ccf83f0691604206157130bd0
755759
net.bytebuddy:byte-buddy-maven-plugin:pom:1.15.1 d8f649ffa066009efc71e967a45cca915c6ffb1c4a4508b0718f4a51d4437197
760+
net.bytebuddy:byte-buddy-maven-plugin:pom:1.15.2 11d71812ac7ea9f397967f984750d4484dd9c027a4a64f5730d840bb3542aa15
756761
net.bytebuddy:byte-buddy-parent:pom:1.12.19 72ab6fef409e812921f4728b3c4b6ef4fa53bc25fabb0488fc2cae367368b54d
757762
net.bytebuddy:byte-buddy-parent:pom:1.12.20 ac59dd7bc0316c51ab29e7c44ae7941ba8c7bf84789edb1dc8fbef2f16535b99
758763
net.bytebuddy:byte-buddy-parent:pom:1.12.21 ff66d886607137e2095f20c90ee093f3c80329164eff091a0688bdce37e3e6b2
@@ -778,6 +783,7 @@ net.bytebuddy:byte-buddy-parent:pom:1.14.6 f889394b9e576a1e7a3ce13efd47b5cb2e62e
778783
net.bytebuddy:byte-buddy-parent:pom:1.14.9 66b8342251d35f2063e69316f63bafcb056342fe75e921c0f465c2d96593535e
779784
net.bytebuddy:byte-buddy-parent:pom:1.15.0 8ec247e077cdf76e72ad2b9919576cf2a477811935b56c8a27958e7297b4f18b
780785
net.bytebuddy:byte-buddy-parent:pom:1.15.1 7bb21259d04796865f0d83dd3344fcffdd34c94515c00a6525a8996acb1c413f
786+
net.bytebuddy:byte-buddy-parent:pom:1.15.2 3be68060e65990669555e02f4cf7826e10122462c14cb14c1b2db78447795bfd
781787
net.bytebuddy:byte-buddy:jar:1.12.19 030704139e46f32c38d27060edee9e0676b0a0fff8a8be53461515154ba8a7be
782788
net.bytebuddy:byte-buddy:jar:1.12.20 0a9b2795e0e2391117062f0fc7f6ae98fa3c2a7c927847ff1e01bb7cffcd9167
783789
net.bytebuddy:byte-buddy:jar:1.12.21 f6f45c2237a7f132c16745ad2a52c4cdde58028b11ee80b09f0d422f4930d685
@@ -803,6 +809,7 @@ net.bytebuddy:byte-buddy:jar:1.14.6 6eaf0190ee02731820e9925a544e7cfb48f6dfc3bf29
803809
net.bytebuddy:byte-buddy:jar:1.14.9 377352e253282bf86f731ac90ed88348e8f40a63ce033c00a85982de7e790e6f
804810
net.bytebuddy:byte-buddy:jar:1.15.0 c743cfb4db1e6c67af6297fbe32a3ad94710884cde4c7eecb1bad7d820d4f2ba
805811
net.bytebuddy:byte-buddy:jar:1.15.1 cc5f178f37ef83339b7ec93e8d0bed6b0730871cdb39c663527ddeae4a54a825
812+
net.bytebuddy:byte-buddy:jar:1.15.2 c754a34c3bf9cc7efbe9c229a2ad185504f017b1c255100a4d3023b38e1e14d5
806813
net.bytebuddy:byte-buddy:pom:1.12.19 435fb8664aa9b7e120c8dd6c707d4eafa642fa262dff6d5e3f71dc25c69e89eb
807814
net.bytebuddy:byte-buddy:pom:1.12.20 46353d5c52659c40f0f54d05c757665552e492be36087c19307598d1bf07bbfb
808815
net.bytebuddy:byte-buddy:pom:1.12.21 95eb42c89fd04f62187dd33b9cdf04d2df1b876b375c16ad32c0a5a1cc1a070b
@@ -828,6 +835,7 @@ net.bytebuddy:byte-buddy:pom:1.14.6 444380f496a38a2b0b7325a4d0f223e3b07f2a2347bc
828835
net.bytebuddy:byte-buddy:pom:1.14.9 2d6772910d16169bd4c9229e8a365cf54e192bc620cbcfa7f84271f5d115e815
829836
net.bytebuddy:byte-buddy:pom:1.15.0 ed4d27216401c5cb6e8f16c09fbfd460679b90c43a033d8d0e7b11e45cfb4e58
830837
net.bytebuddy:byte-buddy:pom:1.15.1 e358152bf7abff7b763a9670c79e798e14aed9a1b07f83476a909e3eaa222f21
838+
net.bytebuddy:byte-buddy:pom:1.15.2 2d72568104ae6c61368aede1864519a2a233ecf0a7aee3c52eed2d046fc4fb2f
831839
net.i2p.crypto:eddsa:jar:0.3.0 4dda1120db856640dbec04140ed23242215a075fe127bdefa0dcfa29fb31267d
832840
net.i2p.crypto:eddsa:pom:0.3.0 b6b13878e4bae8b768d7ea5732cb4d66ab2f5e9fe707c0a1a776cde9de52051b
833841
net.java.dev.jna:jna-platform:jar:5.12.1 8ce969116cac95bd61b07a8d5e07174b352e63301473caac72c395e3c08488d2

byte-buddy-agent/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
<dependency>
7070
<groupId>net.bytebuddy</groupId>
7171
<artifactId>byte-buddy</artifactId>
72-
<version>1.15.1</version>
72+
<version>1.15.2</version>
7373
<scope>test</scope>
7474
</dependency>
7575
</dependencies>

byte-buddy-dep/pom.xml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@
127127
<plugin>
128128
<groupId>net.bytebuddy</groupId>
129129
<artifactId>byte-buddy-maven-plugin</artifactId>
130-
<version>1.15.1</version>
130+
<version>1.15.2</version>
131131
<executions>
132132
<execution>
133133
<phase>compile</phase>
@@ -142,7 +142,7 @@
142142
<transformation>
143143
<groupId>net.bytebuddy</groupId>
144144
<artifactId>byte-buddy</artifactId>
145-
<version>1.15.1</version>
145+
<version>1.15.2</version>
146146
<plugin>net.bytebuddy.build.HashCodeAndEqualsPlugin$WithNonNullableFields</plugin>
147147
<arguments>
148148
<argument>
@@ -154,13 +154,13 @@
154154
<transformation>
155155
<groupId>net.bytebuddy</groupId>
156156
<artifactId>byte-buddy</artifactId>
157-
<version>1.15.1</version>
157+
<version>1.15.2</version>
158158
<plugin>net.bytebuddy.build.CachedReturnPlugin</plugin>
159159
</transformation>
160160
<transformation>
161161
<groupId>net.bytebuddy</groupId>
162162
<artifactId>byte-buddy</artifactId>
163-
<version>1.15.1</version>
163+
<version>1.15.2</version>
164164
<plugin>net.bytebuddy.build.AccessControllerPlugin</plugin>
165165
<arguments>
166166
<argument>
@@ -172,13 +172,13 @@
172172
<transformation>
173173
<groupId>net.bytebuddy</groupId>
174174
<artifactId>byte-buddy</artifactId>
175-
<version>1.15.1</version>
175+
<version>1.15.2</version>
176176
<plugin>net.bytebuddy.build.DispatcherAnnotationPlugin</plugin>
177177
</transformation>
178178
<transformation>
179179
<groupId>net.bytebuddy</groupId>
180180
<artifactId>byte-buddy</artifactId>
181-
<version>1.15.1</version>
181+
<version>1.15.2</version>
182182
<plugin>net.bytebuddy.build.RepeatedAnnotationPlugin</plugin>
183183
</transformation>
184184
</transformations>

byte-buddy-dep/src/main/java/net/bytebuddy/build/Plugin.java

Lines changed: 62 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -809,10 +809,11 @@ interface Engine {
809809
/**
810810
* Uses the supplied {@link ClassFileVersion} as a base for resolving multi-release jars, or {@code null}
811811
* if multi-release jars should not be resolved but be treated as regular jar files. This property might
812-
* not be applied if the underlying location mechanism does not supply manual resource resolution.
812+
* not be applied if the underlying location mechanism does not supply manual resource resolution. Note that
813+
* classes that are of newer class file versions than the specified version are not resolved and simply copied.
813814
*
814-
* @param classFileVersion The class file version to use or {@code null}.
815-
* @return A new plugin engine that is equal to this engine but with the supplied class file verion being used.
815+
* @param classFileVersion The class file version to use or {@code null} if multi-release jars should be ignored.
816+
* @return A new plugin engine that is equal to this engine but with the supplied class file version being used.
816817
*/
817818
Engine with(@MaybeNull ClassFileVersion classFileVersion);
818819

@@ -2421,15 +2422,15 @@ public ClassFileLocator toClassFileLocator(@MaybeNull ClassFileVersion classFile
24212422
/**
24222423
* {@inheritDoc}
24232424
*/
2424-
public void close() throws IOException {
2425-
delegate.close();
2425+
public Iterator<Element> iterator() {
2426+
return new FilteringIterator(delegate.iterator(), matcher);
24262427
}
24272428

24282429
/**
24292430
* {@inheritDoc}
24302431
*/
2431-
public Iterator<Element> iterator() {
2432-
return new FilteringIterator(delegate.iterator(), matcher);
2432+
public void close() throws IOException {
2433+
delegate.close();
24332434
}
24342435

24352436
/**
@@ -3304,12 +3305,66 @@ public Filtering(Source delegate, ElementMatcher<Element> matcher, boolean manif
33043305
this.manifest = manifest;
33053306
}
33063307

3308+
/**
3309+
* Wraps a source to exclude elements that are above the specified Java version.
3310+
*
3311+
* @param delegate The delegate source.
3312+
* @param classFileVersion The latest multi-release Java version to retain from the source.
3313+
* @return A source that applies an appropriate filter.
3314+
*/
3315+
public static Source dropMultiReleaseClassFilesAbove(Source delegate, ClassFileVersion classFileVersion) {
3316+
return new Filtering(delegate, new MultiReleaseVersionMatcher(classFileVersion), true);
3317+
}
3318+
33073319
/**
33083320
* {@inheritDoc}
33093321
*/
33103322
public Origin read() throws IOException {
33113323
return new Origin.Filtering(delegate.read(), matcher, manifest);
33123324
}
3325+
3326+
/**
3327+
* An element matcher that filters multi-release files above a given version.
3328+
*/
3329+
@HashCodeAndEqualsPlugin.Enhance
3330+
protected static class MultiReleaseVersionMatcher implements ElementMatcher<Element> {
3331+
3332+
/**
3333+
* The latest version to consider.
3334+
*/
3335+
private final ClassFileVersion classFileVersion;
3336+
3337+
/**
3338+
* Creates a multi-release version matcher.
3339+
*
3340+
* @param classFileVersion The latest class file version to consider.
3341+
*/
3342+
protected MultiReleaseVersionMatcher(ClassFileVersion classFileVersion) {
3343+
this.classFileVersion = classFileVersion;
3344+
}
3345+
3346+
/**
3347+
* {@inheritDoc}
3348+
*/
3349+
public boolean matches(Element target) {
3350+
String name = target.getName();
3351+
if (name.startsWith("/")) {
3352+
name = name.substring(1);
3353+
}
3354+
if (name.startsWith(ClassFileLocator.META_INF_VERSIONS)) {
3355+
int version;
3356+
try {
3357+
version = Integer.parseInt(name.substring(
3358+
ClassFileLocator.META_INF_VERSIONS.length(),
3359+
name.indexOf('/', ClassFileLocator.META_INF_VERSIONS.length())));
3360+
} catch (NumberFormatException ignored) {
3361+
return true;
3362+
}
3363+
return version <= classFileVersion.getJavaVersion();
3364+
}
3365+
return true;
3366+
}
3367+
}
33133368
}
33143369
}
33153370

byte-buddy-dep/src/test/java/net/bytebuddy/build/PluginEngineSourceFilteringTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.bytebuddy.build;
22

3+
import net.bytebuddy.ClassFileVersion;
34
import net.bytebuddy.dynamic.ClassFileLocator;
45
import net.bytebuddy.matcher.ElementMatcher;
56
import org.junit.Rule;
@@ -84,4 +85,22 @@ public void testClassFileLocator() throws Exception {
8485

8586
assertThat(new Plugin.Engine.Source.Filtering(source, matcher).read().toClassFileLocator(null), is(classFileLocator));
8687
}
88+
89+
@Test
90+
public void testMultiReleaseFilter() throws Exception {
91+
when(source.read()).thenReturn(origin);
92+
when(origin.iterator()).thenReturn(Arrays.asList(first, second, third).iterator());
93+
94+
when(first.getName()).thenReturn("foo/Bar.class");
95+
when(second.getName()).thenReturn(ClassFileLocator.META_INF_VERSIONS + "17/foo/Bar.class");
96+
when(third.getName()).thenReturn(ClassFileLocator.META_INF_VERSIONS + "11/foo/Bar.class");
97+
98+
Plugin.Engine.Source.Origin origin = Plugin.Engine.Source.Filtering.dropMultiReleaseClassFilesAbove(this.source, ClassFileVersion.JAVA_V11).read();
99+
Iterator<Plugin.Engine.Source.Element> iterator = origin.iterator();
100+
assertThat(iterator.hasNext(), is(true));
101+
assertThat(iterator.next(), is(first));
102+
assertThat(iterator.hasNext(), is(true));
103+
assertThat(iterator.next(), is(third));
104+
assertThat(iterator.hasNext(), is(false));
105+
}
87106
}

byte-buddy-gradle-plugin/android-plugin/src/main/java/net/bytebuddy/build/gradle/android/ByteBuddyLocalClassesEnhancerTask.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ public void execute() throws IOException {
235235
Iterable.class,
236236
EntryPoint.class,
237237
ClassFileVersion.class,
238+
ClassFileVersion.class,
238239
Plugin.Factory.UsingReflection.ArgumentResolver.class,
239240
String.class,
240241
int.class,
@@ -253,6 +254,7 @@ public void execute() throws IOException {
253254
getDiscoverySet().getFiles(),
254255
getEntryPoint().get(),
255256
classFileVersion,
257+
classFileVersion,
256258
Plugin.Factory.UsingReflection.ArgumentResolver.ForType.of(AndroidDescriptor.class, androidDescriptor),
257259
getSuffix().get(),
258260
getThreads().get(),

0 commit comments

Comments
 (0)