This is an automated email from the ASF dual-hosted git repository. shoothzj pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
The following commit(s) were added to refs/heads/master by this push: new f119d07b8c Fix potential jetcd-core shading problem (#4526) f119d07b8c is described below commit f119d07b8c9de85720e703f6ce886bd6defca8d4 Author: 萧易客 <km...@live.com> AuthorDate: Mon Nov 18 15:24:36 2024 +0800 Fix potential jetcd-core shading problem (#4526) ### Motivation There is a potential jar shading issue introduced in #4426 that causes `NoClassDefFoundError` when connecting to an etcd metadata store. The `jetcd-core-shaded` module was introduced in #4426 to address the compatibility issues between jetcd-core’s grpc-java dependency and Netty. You can find more details [here][1] and in the [grpc-java documentation][2]. [1]: https://github.com/apache/bookkeeper/pull/4426#issuecomment-2162348232 [2]: https://github.com/grpc/grpc-java/blob/master/SECURITY.md#netty Currently, we use `unpack-shaded-jar` execution unpacks the shaded jar produced by `maven-shade-plugin:shade` into the `jetcd-core-shaded/target/classes` directory. However, the classes in this directory conflict with its dependencies. If the `maven-shade-plugin:shade` runs again without cleaning this directory, it can produce an incorrect shaded jar. You can replicate and verify this issue with the following commands: ```shell # Step 1: Clean the build directory mvn clean # Step 2: Perform an install and unpack the shaded jar into a directory. # Verify the import statement for `io.netty.handler.logging.ByteBufFormat` in # `org/apache/pulsar/jetcd/shaded/io/vertx/core/net/NetClientOptions.class`. # The correct import should be: # `import io.grpc.netty.shaded.io.netty.handler.logging.ByteBufFormat;`. mvn install unzip $M2_REPO/org/apache/bookkeeper/metadata/drivers/jetcd-core-shaded/4.18.0-SNAPSHOT/jetcd-core-shaded-4.18.0-SNAPSHOT-shaded.jar \ -d metadata-drivers/jetcd-core-shaded/target/first-classes # Step 3: Run the install command again without cleaning. # The unpacked jar from the previous step will persist in `target/classes`. # Unpack the shaded jar into a different directory (e.g., second-classes) and check the import. # The incorrect import will be: # `import io.grpc.netty.shaded.io.grpc.netty.shaded.io.netty.handler.logging.ByteBufFormat;`. mvn install unzip $M2_REPO/org/apache/bookkeeper/metadata/drivers/jetcd-core-shaded/4.18.0-SNAPSHOT/jetcd-core-shaded-4.18.0-SNAPSHOT-shaded.jar \ -d metadata-drivers/jetcd-core-shaded/target/second-classes # Step 4: Use IntelliJ IDEA's "Compare Directories" tool to compare the `first-classes` # and `second-classes` directories. The differences in imports should become apparent. ``` We can remove the attach and unpack configurations, and it should work fine. This issue has already been [reported][3] in apache/pulsar, and a similar [patch][patch] has addressed it. [3]: https://github.com/apache/pulsar/issues/23513 [patch]: https://github.com/apache/pulsar/pull/23604 --- .github/workflows/bk-ci.yml | 4 ++- metadata-drivers/etcd/pom.xml | 1 - metadata-drivers/jetcd-core-shaded/pom.xml | 48 ------------------------------ 3 files changed, 3 insertions(+), 50 deletions(-) diff --git a/.github/workflows/bk-ci.yml b/.github/workflows/bk-ci.yml index 0106da05b3..6c40881bd5 100644 --- a/.github/workflows/bk-ci.yml +++ b/.github/workflows/bk-ci.yml @@ -242,7 +242,9 @@ jobs: run: mvn -B -nsu clean install -Pdocker -DskipTests - name: Run metadata driver tests - run: mvn -B -nsu -f metadata-drivers/pom.xml test -DintegrationTests + # Exclude jetcd-core-shaded from integration tests, as it’s a POM-only project used internally, + # and maven prioritizes workspace artifacts during testing. + run: mvn -B -nsu -f metadata-drivers/pom.xml -pl '!jetcd-core-shaded' test -DintegrationTests - name: Run all integration tests (except backward compatibility tests) run: | diff --git a/metadata-drivers/etcd/pom.xml b/metadata-drivers/etcd/pom.xml index 3dfbdcde1e..bb03d5b853 100644 --- a/metadata-drivers/etcd/pom.xml +++ b/metadata-drivers/etcd/pom.xml @@ -37,7 +37,6 @@ <groupId>org.apache.bookkeeper.metadata.drivers</groupId> <artifactId>jetcd-core-shaded</artifactId> <version>${project.version}</version> - <classifier>shaded</classifier> <exclusions> <exclusion> <groupId>io.etcd</groupId> diff --git a/metadata-drivers/jetcd-core-shaded/pom.xml b/metadata-drivers/jetcd-core-shaded/pom.xml index 2b8e855aa2..cd995f66cf 100644 --- a/metadata-drivers/jetcd-core-shaded/pom.xml +++ b/metadata-drivers/jetcd-core-shaded/pom.xml @@ -132,54 +132,6 @@ <file>${project.basedir}/dependency-reduced-pom.xml</file> </transformer> </transformers> - <!-- required for IntelliJ support --> - <shadedArtifactAttached>true</shadedArtifactAttached> - <shadedClassifierName>shaded</shadedClassifierName> - </configuration> - </execution> - </executions> - </plugin> - <!-- required for IntelliJ support, for some reason shadedArtifactAttached isn't sufficient alone --> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>build-helper-maven-plugin</artifactId> - <executions> - <execution> - <id>attach-shaded-jar</id> - <phase>package</phase> - <goals> - <goal>attach-artifact</goal> - </goals> - <configuration> - <artifacts> - <artifact> - <file>${project.build.directory}/${project.artifactId}-${project.version}-shaded.jar</file> - <type>jar</type> - <classifier>shaded</classifier> - </artifact> - </artifacts> - </configuration> - </execution> - </executions> - </plugin> - <!-- required for running tests with "mvn -f metadata-drivers/pom.xml test -DintegrationTests" --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-antrun-plugin</artifactId> - <version>${maven-antrun-plugin.version}</version> - <executions> - <execution> - <id>unpack-shaded-jar</id> - <phase>package</phase> - <goals> - <goal>run</goal> - </goals> - <configuration> - <target> - <unzip src="${project.build.directory}/${project.artifactId}-${project.version}-shaded.jar" - dest="${project.build.outputDirectory}" - overwrite="true" /> - </target> </configuration> </execution> </executions>