From 55c8d1452a30cb2cc0ca25980e3b52d79ab4bf09 Mon Sep 17 00:00:00 2001 From: Julien Ponge Date: Wed, 29 May 2024 18:06:16 +0200 Subject: [PATCH 1/2] feat: produce a no-dependencies shaded Mutiny jar Ref: #1577 --- no-deps/pom.xml | 133 ++++++++++++++++++ .../java/io/smallrye/mutiny/nodeps/Empty.java | 8 ++ .../io/smallrye/mutiny/nodeps/ShadingIT.java | 64 +++++++++ pom.xml | 3 + 4 files changed, 208 insertions(+) create mode 100644 no-deps/pom.xml create mode 100644 no-deps/src/main/java/io/smallrye/mutiny/nodeps/Empty.java create mode 100644 no-deps/src/test/java/io/smallrye/mutiny/nodeps/ShadingIT.java diff --git a/no-deps/pom.xml b/no-deps/pom.xml new file mode 100644 index 000000000..6d7867f5f --- /dev/null +++ b/no-deps/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + + io.smallrye.reactive + mutiny-project + 999-SNAPSHOT + + + mutiny-no-deps + SmallRye Mutiny - Shaded library + Variant of Mutiny with shaded dependencies + + + true + + + + + io.smallrye.reactive + mutiny + + + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + + + + + org.apache.maven.plugins + maven-shade-plugin + ${maven-shade-plugin.version} + + true + true + + + *:* + + module-info.class + META-INF/jandex.idx + META-INF/MANIFEST.MF + META-INF/maven/** + + + + org.jctools:jctools-core + + org/jctools/counters/** + org/jctools/maps/** + org/jctools/queues/unpadded/** + + + + + + + + + + + org.jctools + io.smallrye.mutiny.shaded.org.jctools + + + io.smallrye.common + io.smallrye.mutiny.shaded.io.smallrye.common + + + + + + package + + shade + + + + + + io.smallrye + jandex-maven-plugin + + ${project.build.directory}/${project.build.finalName}.jar + + io/smallrye/mutiny/**/*.class + + + io/smallrye/mutiny/shaded/**/*.class + + + + + package + + jandex-jar + + + + + + org.cyclonedx + cyclonedx-maven-plugin + + + org.apache.maven.plugins + maven-failsafe-plugin + ${maven-failsafe-plugin.version} + + + + integration-test + verify + + + + + + + + \ No newline at end of file diff --git a/no-deps/src/main/java/io/smallrye/mutiny/nodeps/Empty.java b/no-deps/src/main/java/io/smallrye/mutiny/nodeps/Empty.java new file mode 100644 index 000000000..0966c32e8 --- /dev/null +++ b/no-deps/src/main/java/io/smallrye/mutiny/nodeps/Empty.java @@ -0,0 +1,8 @@ +package io.smallrye.mutiny.nodeps; + +/** + * This is used as a placeholder to force the maven-javadoc-plugin to create a javadoc jar. + * Yes, you read it right :-) + */ +public interface Empty { +} diff --git a/no-deps/src/test/java/io/smallrye/mutiny/nodeps/ShadingIT.java b/no-deps/src/test/java/io/smallrye/mutiny/nodeps/ShadingIT.java new file mode 100644 index 000000000..b34e4647a --- /dev/null +++ b/no-deps/src/test/java/io/smallrye/mutiny/nodeps/ShadingIT.java @@ -0,0 +1,64 @@ +package io.smallrye.mutiny.nodeps; + +import static org.junit.jupiter.api.Assertions.*; + +import java.time.Duration; +import java.util.List; +import java.util.Queue; + +import org.junit.jupiter.api.Test; + +import io.smallrye.mutiny.Multi; +import io.smallrye.mutiny.helpers.queues.Queues; +import io.smallrye.mutiny.subscription.BackPressureStrategy; + +public class ShadingIT { + + @Test + public void check_shaded_classes() throws ClassNotFoundException { + Class.forName("io.smallrye.mutiny.shaded.org.jctools.queues.BaseLinkedQueue"); + Class.forName("io.smallrye.mutiny.shaded.org.jctools.queues.atomic.unpadded.BaseLinkedAtomicUnpaddedQueue"); + Class.forName("io.smallrye.mutiny.shaded.io.smallrye.common.annotation.CheckReturnValue"); + } + + @Test + public void mpsc_queue_factory() { + Queue queue = Queues.createMpscArrayQueue(256); + + queue.add("foo"); + queue.add("bar"); + assertEquals("foo", queue.poll()); + assertEquals("bar", queue.poll()); + assertNull(queue.poll()); + + assertTrue(queue.getClass().getCanonicalName().contains("shaded")); + } + + @Test + public void spsc_queue_factory() { + Queue queue = Queues.createSpscArrayQueue(256); + + queue.add("foo"); + queue.add("bar"); + assertEquals("foo", queue.poll()); + assertEquals("bar", queue.poll()); + assertNull(queue.poll()); + + assertTrue(queue.getClass().getCanonicalName().contains("shaded")); + } + + @Test + public void multi_emitter() { + Multi multi = Multi.createFrom().emitter(emitter -> { + for (int i = 0; i < 100; i++) { + emitter.emit(i); + } + emitter.complete(); + }, BackPressureStrategy.BUFFER); + + List suite = multi.collect().asList().await().atMost(Duration.ofSeconds(5)); + assertEquals(100, suite.size()); + assertEquals(0, suite.get(0)); + assertEquals(99, suite.get(99)); + } +} diff --git a/pom.xml b/pom.xml index 9c0933c91..24701196b 100644 --- a/pom.xml +++ b/pom.xml @@ -74,6 +74,7 @@ bom math workshop-examples + no-deps @@ -124,6 +125,8 @@ 1.1.0 1.14.0 2.8.1 + 3.5.3 + 3.2.5 From 671f86ef97ccb1bd834f6b34b28dc68012939c1a Mon Sep 17 00:00:00 2001 From: Julien Ponge Date: Thu, 30 May 2024 21:57:26 +0200 Subject: [PATCH 2/2] feat: provide a more agressive class pruning in the JCTools shading --- no-deps/pom.xml | 22 +++++++--- .../io/smallrye/mutiny/nodeps/ShadingIT.java | 42 ++++++++----------- 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/no-deps/pom.xml b/no-deps/pom.xml index 6d7867f5f..e25c57ec6 100644 --- a/no-deps/pom.xml +++ b/no-deps/pom.xml @@ -56,11 +56,23 @@ org.jctools:jctools-core - - org/jctools/counters/** - org/jctools/maps/** - org/jctools/queues/unpadded/** - + + org/jctools/queues/atomic/unpadded/** + org/jctools/queues/MessagePassingQueue* + org/jctools/queues/IndexedQueueSizeUtil* + org/jctools/queues/QueueProgressIndicators* + org/jctools/queues/SupportsIterator* + org/jctools/queues/BaseLinkedQueue* + org/jctools/queues/LinkedQueueNode* + org/jctools/queues/atomic/AtomicQueueUtil* + org/jctools/queues/atomic/AtomicReferenceArrayQueue* + org/jctools/queues/atomic/SequencedAtomicReferenceArrayQueue* + org/jctools/queues/atomic/LinkedQueueAtomicNode* + org/jctools/util/SpscLookAheadUtil* + org/jctools/util/Pow2* + org/jctools/util/RangeUtil* + org/jctools/util/UnsafeAccess* + diff --git a/no-deps/src/test/java/io/smallrye/mutiny/nodeps/ShadingIT.java b/no-deps/src/test/java/io/smallrye/mutiny/nodeps/ShadingIT.java index b34e4647a..b6eb890a1 100644 --- a/no-deps/src/test/java/io/smallrye/mutiny/nodeps/ShadingIT.java +++ b/no-deps/src/test/java/io/smallrye/mutiny/nodeps/ShadingIT.java @@ -15,36 +15,30 @@ public class ShadingIT { @Test - public void check_shaded_classes() throws ClassNotFoundException { + public void check_class_relocation() throws ClassNotFoundException { Class.forName("io.smallrye.mutiny.shaded.org.jctools.queues.BaseLinkedQueue"); Class.forName("io.smallrye.mutiny.shaded.org.jctools.queues.atomic.unpadded.BaseLinkedAtomicUnpaddedQueue"); Class.forName("io.smallrye.mutiny.shaded.io.smallrye.common.annotation.CheckReturnValue"); } @Test - public void mpsc_queue_factory() { - Queue queue = Queues.createMpscArrayQueue(256); - - queue.add("foo"); - queue.add("bar"); - assertEquals("foo", queue.poll()); - assertEquals("bar", queue.poll()); - assertNull(queue.poll()); - - assertTrue(queue.getClass().getCanonicalName().contains("shaded")); - } - - @Test - public void spsc_queue_factory() { - Queue queue = Queues.createSpscArrayQueue(256); - - queue.add("foo"); - queue.add("bar"); - assertEquals("foo", queue.poll()); - assertEquals("bar", queue.poll()); - assertNull(queue.poll()); - - assertTrue(queue.getClass().getCanonicalName().contains("shaded")); + public void check_factories() { + List> queues = List.of( + Queues.createSpscArrayQueue(256), + Queues.createSpscUnboundedArrayQueue(256), + Queues.createSpscChunkedArrayQueue(256), + Queues.createMpscQueue(), + Queues.createSpscUnboundedQueue(256), + Queues.createMpscArrayQueue(256)); + + queues.forEach(queue -> { + queue.add("foo"); + queue.add("bar"); + assertEquals("foo", queue.poll()); + assertEquals("bar", queue.poll()); + assertNull(queue.poll()); + assertTrue(queue.getClass().getCanonicalName().contains("shaded")); + }); } @Test