This is an automated email from the ASF dual-hosted git repository. voonhous pushed a commit to tag rfc-105-pre-cleanup in repository https://gitbox.apache.org/repos/asf/hudi.git
commit 83b236f43305776f2c97838d059c4c4f7334117c Author: voon <[email protected]> AuthorDate: Sat May 23 03:02:45 2026 +0800 refactor(trino): drop shaded bundle, publish hudi-trino per RFC-105 RFC-105 specifies the published artifact as a regular non-shaded jar named org.apache.hudi:hudi-trino, citing Trino's URLClassLoader plugin isolation as the reason no shading is needed. The previous packaging/hudi-trino-bundle deviated from this and caused: - shaded-vs-canonical GenericRecord type mismatches in Trino-side tests - ever-growing SPI exclusion lists to satisfy check-spi-dependencies - lance / arrow / rocksdb dragging ~280MB into the Trino server tar - hudi-timeline-service pulling banned javax.servlet-api transitively - a two-step JDK 17 -> JDK 25 build because the bundle had to be rebuilt Changes: - Delete packaging/hudi-trino-bundle/ (module + pom + README) and remove it from the hudi-trino profile in the root pom. - Rename hudi-trino-plugin/pom.xml artifactId from hudi-trino-plugin to hudi-trino. Source dir stays hudi-trino-plugin/. - Add lance / arrow / rocksdb exclusions to hudi-common and hudi-io to prevent the 280MB transitive leak that the bundle was working around. - Add hudi-timeline-service exclusion to hudi-client-common (test scope). - Simplify hudi-trino-plugin/README.md to a single-module build (no more packaging step) and drop the bundle verify step from hudi_trino_ci.yml. Scope choices follow trino-iceberg / trino-delta-lake: io.trino:* and io.airlift:* compile-time deps stay at compile (each plugin's classloader bundles them). Only the Trino SPI shortlist (trino-spi, jackson-annotations, slice, opentelemetry-*, jol-core) is at provided. --- .github/workflows/hudi_trino_ci.yml | 12 +- hudi-trino-plugin/README.md | 10 +- hudi-trino-plugin/pom.xml | 41 +- packaging/hudi-trino-bundle/README.md | 103 ----- packaging/hudi-trino-bundle/pom.xml | 432 --------------------- .../java/org/apache/hudi/trino/bundle/Main.java | 36 -- pom.xml | 6 +- 7 files changed, 51 insertions(+), 589 deletions(-) diff --git a/.github/workflows/hudi_trino_ci.yml b/.github/workflows/hudi_trino_ci.yml index 82910688c81e..b9a89c52d99f 100644 --- a/.github/workflows/hudi_trino_ci.yml +++ b/.github/workflows/hudi_trino_ci.yml @@ -7,7 +7,6 @@ on: - 'release-*' paths: - 'hudi-trino-plugin/**' - - 'packaging/hudi-trino-bundle/**' - '.github/workflows/hudi_trino_ci.yml' pull_request: branches: @@ -15,7 +14,6 @@ on: - 'release-*' paths: - 'hudi-trino-plugin/**' - - 'packaging/hudi-trino-bundle/**' - '.github/workflows/hudi_trino_ci.yml' workflow_dispatch: @@ -38,13 +36,7 @@ jobs: java-version: '25' distribution: 'temurin' cache: maven - - name: Build connector and bundle - run: ./mvnw $MVN_ARGS -Phudi-trino -pl hudi-trino-plugin,packaging/hudi-trino-bundle -am install -DskipTests - - name: Verify bundle contains connector classes - run: | - BUNDLE_JAR=$(ls packaging/hudi-trino-bundle/target/hudi-trino-bundle-*.jar | grep -v sources | head -n 1) - echo "Inspecting $BUNDLE_JAR" - jar tf "$BUNDLE_JAR" | grep -E 'io/trino/plugin/hudi/HudiConnectorFactory\.class$' \ - || (echo "ERROR: HudiConnectorFactory not present in bundle"; exit 1) + - name: Build connector + run: ./mvnw $MVN_ARGS -Phudi-trino -pl hudi-trino-plugin -am install -DskipTests - name: Run connector tests run: ./mvnw $MVN_ARGS -Phudi-trino -pl hudi-trino-plugin test diff --git a/hudi-trino-plugin/README.md b/hudi-trino-plugin/README.md index 4a9aba1403db..37f465baea8a 100644 --- a/hudi-trino-plugin/README.md +++ b/hudi-trino-plugin/README.md @@ -1,24 +1,26 @@ # hudi-trino-plugin -Hudi connector for Trino (RFC-105). Published as part of `org.apache.hudi:hudi-trino-bundle`; the Trino-side `HudiPlugin` shim loads classes from that bundle. +Hudi connector for Trino (RFC-105). Published as `org.apache.hudi:hudi-trino` -- a regular non-shaded JAR. The Trino-side `trino-hudi` plugin module depends on this artifact and Trino's URLClassLoader isolates the plugin's transitive deps from the rest of the server, so no shading is required. + +The source directory is named `hudi-trino-plugin/`; the Maven artifactId is `hudi-trino`. ## Build Excluded from default builds. Activate the `hudi-trino` Maven profile: ``` -mvn -Phudi-trino -pl hudi-trino-plugin,packaging/hudi-trino-bundle -am install +mvn -Phudi-trino -pl hudi-trino-plugin install ``` Requires JDK 25 (enforced via `maven-enforcer-plugin`). ## IDE setup -Only `hudi-trino-plugin` needs JDK 25. Leave the rest of Hudi on its native JDK (11 or 17) so you are not toggling the project default. +Only this module needs JDK 25. Leave the rest of Hudi on its native JDK (11 or 17) so you are not toggling the project default. 1. Activate the `hudi-trino` Maven profile so the IDE picks up the module. - IntelliJ: Maven tool window, Profiles, tick `hudi-trino`. 2. Override the SDK for the `hudi-trino-plugin` module only, to Temurin 25 with Language level 25. - IntelliJ: `File > Project Structure > Modules > hudi-trino-plugin > Dependencies > Module SDK`. -The enforcer rule only runs during `mvn`, not during the IDE's incremental compile. \ No newline at end of file +The enforcer rule only runs during `mvn`, not during the IDE's incremental compile. diff --git a/hudi-trino-plugin/pom.xml b/hudi-trino-plugin/pom.xml index 5f699d03a110..a2cc55fa1fe8 100644 --- a/hudi-trino-plugin/pom.xml +++ b/hudi-trino-plugin/pom.xml @@ -26,7 +26,8 @@ <relativePath>../pom.xml</relativePath> </parent> - <artifactId>hudi-trino-plugin</artifactId> + <!-- Source dir is hudi-trino-plugin/ but artifactId is hudi-trino per RFC-105. --> + <artifactId>hudi-trino</artifactId> <packaging>jar</packaging> <description>Hudi connector for Trino (RFC-105)</description> @@ -81,6 +82,10 @@ <artifactId>guava</artifactId> </dependency> + <!-- Trino's plugin classloader bundles non-SPI compile deps with the plugin (one URLClassLoader + per plugin). Only the SPI shortlist further down (trino-spi, jackson-annotations, slice, + opentelemetry-*, jol-core) is at provided scope. Matches trino-iceberg / trino-delta-lake. --> + <dependency> <!-- Trino bundles guice as the classes-only classifier; the BOM does not manage the plain jar. --> <groupId>com.google.inject</groupId> @@ -194,6 +199,22 @@ <groupId>org.apache.orc</groupId> <artifactId>*</artifactId> </exclusion> + <!-- The Trino connector does not exercise Hudi's local state stores, Arrow + materialization, or Lance integration. Excluding them keeps the plugin's + runtime jar set lean (~280MB worth otherwise) and avoids dragging native + libs (rocksdbjni) onto Trino's plugin classpath. --> + <exclusion> + <groupId>org.rocksdb</groupId> + <artifactId>*</artifactId> + </exclusion> + <exclusion> + <groupId>org.apache.arrow</groupId> + <artifactId>*</artifactId> + </exclusion> + <exclusion> + <groupId>org.lance</groupId> + <artifactId>*</artifactId> + </exclusion> </exclusions> </dependency> @@ -219,6 +240,19 @@ <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> </exclusion> + <!-- Same rationale as hudi-common: connector does not use rocksdb / arrow / lance. --> + <exclusion> + <groupId>org.rocksdb</groupId> + <artifactId>*</artifactId> + </exclusion> + <exclusion> + <groupId>org.apache.arrow</groupId> + <artifactId>*</artifactId> + </exclusion> + <exclusion> + <groupId>org.lance</groupId> + <artifactId>*</artifactId> + </exclusion> </exclusions> </dependency> @@ -437,6 +471,11 @@ <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> + <!-- hudi-timeline-service pulls Jetty + javax.servlet-api; Trino's enforcer bans them. --> + <exclusion> + <groupId>org.apache.hudi</groupId> + <artifactId>hudi-timeline-service</artifactId> + </exclusion> </exclusions> </dependency> diff --git a/packaging/hudi-trino-bundle/README.md b/packaging/hudi-trino-bundle/README.md deleted file mode 100644 index e73f2dd0903e..000000000000 --- a/packaging/hudi-trino-bundle/README.md +++ /dev/null @@ -1,103 +0,0 @@ -<!-- - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -# hudi-trino-bundle - -Shaded jar that ships the Trino-Hudi connector. Published as `org.apache.hudi:hudi-trino-bundle` (RFC-105). The Trino-side `HudiPlugin` shim depends on this artifact and loads `io.trino.plugin.hudi.HudiConnectorFactory` from it. - -## What is inside - -Connector classes (unshaded, canonical FQN preserved): -- `io.trino.plugin.hudi.*` from `hudi-trino-plugin` - -Hudi runtime jars (no relocation): -- `hudi-common`, `hudi-client-common`, `hudi-java-client`, `hudi-hadoop-common`, `hudi-hadoop-mr` - -Shaded third-party libs (relocated under `org.apache.hudi.*` or the `trino.bundle.bootstrap.shade.prefix`): -- Kryo, parquet-avro, avro, caffeine, commons-io, dropwizard metrics, jol-core, protobuf - -What is NOT inside: -- `META-INF/services/io.trino.spi.Plugin`. That manifest lives only on the Trino-side `trino-hudi` shim; never ship it from this bundle. - -## Build - -Two-step because `hudi-common` etc. use Lombok 1.18.36 which is not compatible with JDK 25, while `hudi-trino-plugin` requires JDK 25 for the Trino SPI. See `hudi-trino-plugin/README.md` for the why. - -``` -# Step 1, on JDK 17: install Hudi base modules into ~/.m2 -JAVA_HOME=$(/usr/libexec/java_home -v 17) \ - mvn install -DskipTests -pl hudi-common,hudi-io,hudi-hive-sync,hudi-sync-common,hudi-hadoop-common,hudi-client-common,hudi-java-client,packaging/hudi-hadoop-mr-bundle -am - -# Step 2, on JDK 25: build the connector and bundle -JAVA_HOME=$(/usr/libexec/java_home -v 25) \ - mvn install -Phudi-trino -pl hudi-trino-plugin,packaging/hudi-trino-bundle -``` - -The shaded jar lands at `packaging/hudi-trino-bundle/target/hudi-trino-bundle-1.3.0-SNAPSHOT.jar` and is also installed to `~/.m2/repository/org/apache/hudi/hudi-trino-bundle/`. - -## Verify the jar - -``` -JAR=packaging/hudi-trino-bundle/target/hudi-trino-bundle-1.3.0-SNAPSHOT.jar - -# Connector entrypoint must be present at its canonical FQN -jar tf "$JAR" | grep -E 'io/trino/plugin/hudi/HudiConnectorFactory\.class$' - -# Plugin SPI manifest must NOT be present (only the Trino-side shim ships that) -jar tf "$JAR" | grep -E 'META-INF/services/io\.trino\.spi\.Plugin$' && echo "FAIL: bundle leaks Plugin SPI" || echo "OK" -``` - -## Consume from Trino - -The Trino-side `plugin/trino-hudi` is already wired: -- `<dependency>org.apache.hudi:hudi-trino-bundle</dependency>` in `plugin/trino-hudi/pom.xml`. -- Version property `<dep.hudi-trino.version>` in the root Trino `pom.xml`. Bump this to point at a newer published bundle. - -Local development flow: -``` -# In the Trino repo, after step 2 above has installed the bundle to ~/.m2 -./mvnw -pl :trino-hudi install -``` - -The Trino build resolves `hudi-trino-bundle` from your local `~/.m2`. For Hudi snapshots, ensure Apache's snapshot repo is enabled in your Maven settings; otherwise the version property must point at a released version. - -## Publish - -Follows the standard Hudi `mvn deploy` flow under the `hudi-trino` profile: - -``` -JAVA_HOME=$(/usr/libexec/java_home -v 25) \ - mvn deploy -Phudi-trino -pl hudi-trino-plugin,packaging/hudi-trino-bundle -DskipTests -``` - -For release candidates, include this bundle in the RC validation step alongside the other published Hudi bundles. - -### Before publishing: switch Trino version off SNAPSHOT - -The root pom currently sets `<trino.connector.version>480-SNAPSHOT</trino.connector.version>` because the connector tests depend on `trino-*-tests.jar` artifacts, and Trino only publishes the test-jar classifier for snapshot builds (not for tagged releases). Shipping a bundle whose installed POM references a Trino SNAPSHOT version is awkward for downstream consumers. - -Before cutting a release, split the property so main jars resolve to a Trino release while test-jars stay on snapshot: - -1. Add a sibling property to the root pom: - ``` - <trino.connector.version>480</trino.connector.version> - <trino.connector.test.version>480-SNAPSHOT</trino.connector.test.version> - ``` -2. In `hudi-trino-plugin/pom.xml`, change each `<type>test-jar</type>` dependency to use `${dep.trino.test.version}` instead of inheriting from the main version. -3. Verify with `mvn dependency:tree -Phudi-trino -pl hudi-trino-plugin` that compile deps resolve at `480` and test deps at `480-SNAPSHOT`. - -Alternative if the release pipeline must not touch SNAPSHOT artifacts at all: build with `-Dmaven.test.skip=true` so test-jar deps are never resolved. Trade-off is no unit test run during the release build; CI should still exercise tests separately under the snapshot path. \ No newline at end of file diff --git a/packaging/hudi-trino-bundle/pom.xml b/packaging/hudi-trino-bundle/pom.xml deleted file mode 100644 index 8c22384b9551..000000000000 --- a/packaging/hudi-trino-bundle/pom.xml +++ /dev/null @@ -1,432 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <parent> - <artifactId>hudi</artifactId> - <groupId>org.apache.hudi</groupId> - <version>1.3.0-SNAPSHOT</version> - <relativePath>../../pom.xml</relativePath> - </parent> - <modelVersion>4.0.0</modelVersion> - <artifactId>hudi-trino-bundle</artifactId> - <packaging>jar</packaging> - - <properties> - <checkstyle.skip>true</checkstyle.skip> - <main.basedir>${project.parent.basedir}</main.basedir> - <skipTests>true</skipTests> - <dep.trino.version>${trino.connector.version}</dep.trino.version> - </properties> - - <dependencyManagement> - <dependencies> - <!-- Import Trino's parent POM as a BOM so the SPI artifacts declared as - provided below resolve to versions matching the connector code. --> - <dependency> - <groupId>io.trino</groupId> - <artifactId>trino-root</artifactId> - <version>${dep.trino.version}</version> - <type>pom</type> - <scope>import</scope> - </dependency> - </dependencies> - </dependencyManagement> - - <build> - <plugins> - <plugin> - <groupId>org.apache.rat</groupId> - <artifactId>apache-rat-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-shade-plugin</artifactId> - <version>${maven-shade-plugin.version}</version> - <executions> - <execution> - <phase>package</phase> - <goals> - <goal>shade</goal> - </goals> - <configuration> - <createSourcesJar>${shadeSources}</createSourcesJar> - <dependencyReducedPomLocation>${project.build.directory}/dependency-reduced-pom.xml - </dependencyReducedPomLocation> - <transformers> - <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer"> - </transformer> - <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer"> - <addHeader>true</addHeader> - </transformer> - <transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer"> - <resource>META-INF/LICENSE</resource> - <file>target/classes/META-INF/LICENSE</file> - </transformer> - <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> - </transformers> - <artifactSet> - <includes combine.children="append"> - <include>org.apache.hudi:hudi-trino-plugin</include> - <include>org.apache.hudi:hudi-hadoop-common</include> - <include>org.apache.hudi:hudi-common</include> - <include>org.apache.hudi:hudi-client-common</include> - <include>org.apache.hudi:hudi-java-client</include> - <include>org.apache.hudi:hudi-hadoop-mr</include> - - <!-- Kryo --> - <include>com.esotericsoftware:kryo-shaded</include> - <include>com.esotericsoftware:minlog</include> - <include>org.objenesis:objenesis</include> - - <include>org.apache.parquet:parquet-avro</include> - <include>org.apache.avro:avro</include> - <include>com.github.ben-manes.caffeine:caffeine</include> - <include>org.codehaus.jackson:*</include> - <include>com.yammer.metrics:metrics-core</include> - <include>commons-io:commons-io</include> - <include>com.google.protobuf:protobuf-java</include> - <include>org.openjdk.jol:jol-core</include> - </includes> - </artifactSet> - <relocations combine.children="append"> - <!-- Kryo --> - <relocation> - <pattern>com.esotericsoftware.kryo.</pattern> - <shadedPattern>org.apache.hudi.com.esotericsoftware.kryo.</shadedPattern> - </relocation> - <relocation> - <pattern>com.esotericsoftware.reflectasm.</pattern> - <shadedPattern>org.apache.hudi.com.esotericsoftware.reflectasm.</shadedPattern> - </relocation> - <relocation> - <pattern>com.esotericsoftware.minlog.</pattern> - <shadedPattern>org.apache.hudi.com.esotericsoftware.minlog.</shadedPattern> - </relocation> - <relocation> - <pattern>org.objenesis.</pattern> - <shadedPattern>org.apache.hudi.org.objenesis.</shadedPattern> - </relocation> - - <relocation> - <pattern>org.apache.parquet.avro.</pattern> - <shadedPattern>org.apache.hudi.org.apache.parquet.avro.</shadedPattern> - </relocation> - <relocation> - <pattern>org.apache.avro.</pattern> - <shadedPattern>org.apache.hudi.org.apache.avro.</shadedPattern> - </relocation> - <relocation> - <pattern>org.apache.commons.io.</pattern> - <shadedPattern>org.apache.hudi.org.apache.commons.io.</shadedPattern> - </relocation> - <relocation> - <pattern>com.yammer.metrics.</pattern> - <shadedPattern>org.apache.hudi.com.yammer.metrics.</shadedPattern> - </relocation> - <relocation> - <pattern>com.google.common.</pattern> - <shadedPattern>${trino.bundle.bootstrap.shade.prefix}com.google.common.</shadedPattern> - </relocation> - <relocation> - <pattern>org.apache.commons.lang.</pattern> - <shadedPattern>${trino.bundle.bootstrap.shade.prefix}org.apache.commons.lang.</shadedPattern> - </relocation> - <relocation> - <pattern>com.google.protobuf.</pattern> - <shadedPattern>${trino.bundle.bootstrap.shade.prefix}com.google.protobuf.</shadedPattern> - </relocation> - <relocation> - <pattern>org.openjdk.jol.</pattern> - <shadedPattern>org.apache.hudi.org.openjdk.jol.</shadedPattern> - </relocation> - </relocations> - <createDependencyReducedPom>false</createDependencyReducedPom> - <filters> - <filter> - <artifact>*:*</artifact> - <excludes> - <exclude>META-INF/*.SF</exclude> - <exclude>META-INF/*.DSA</exclude> - <exclude>META-INF/*.RSA</exclude> - <exclude>META-INF/services/javax.*</exclude> - <exclude>**/*.proto</exclude> - </excludes> - </filter> - </filters> - <finalName>${project.artifactId}-${project.version}</finalName> - </configuration> - </execution> - </executions> - </plugin> - </plugins> - <resources> - <resource> - <directory>src/main/resources</directory> - </resource> - </resources> - </build> - - <dependencies> - <!-- Hoodie --> - <dependency> - <!-- Plugin classes are shaded into this bundle. Its compile-scope deps on Trino, - Airlift, Jackson, Guice, OpenTelemetry are SPI-provided at Trino runtime and - must NOT leak into the bundle's transitive closure (trino-maven-plugin's - check-spi-dependencies enforces this on the consumer side). --> - <groupId>org.apache.hudi</groupId> - <artifactId>hudi-trino-plugin</artifactId> - <version>${project.version}</version> - <exclusions> - <exclusion> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>com.fasterxml.jackson.module</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>com.fasterxml.jackson.datatype</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>io.airlift</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>io.trino</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>com.google.inject</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>io.opentelemetry</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>org.openjdk.jol</groupId> - <artifactId>*</artifactId> - </exclusion> - <!-- The connector does not use rocksdb (Hudi's local state stores), arrow, or lance. - These leak via hudi-common's compile deps and bloat the Trino server tar. --> - <exclusion> - <groupId>org.rocksdb</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>org.apache.arrow</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>org.lance</groupId> - <artifactId>*</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <!-- Use the plain hudi-hadoop-mr artifact (already listed in the shade artifactSet). - hudi-hadoop-mr-bundle pulled lance-core, arrow-dataset, and rocksdbjni transitively - (~280MB), which the connector does not use and which blew the trino-server tar size cap. --> - <groupId>org.apache.hudi</groupId> - <artifactId>hudi-hadoop-mr</artifactId> - <version>${project.version}</version> - <exclusions> - <exclusion> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>com.fasterxml.jackson.module</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>com.fasterxml.jackson.datatype</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>org.rocksdb</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>org.apache.arrow</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>org.lance</groupId> - <artifactId>*</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>org.apache.hudi</groupId> - <artifactId>hudi-client-common</artifactId> - <version>${project.version}</version> - <exclusions> - <exclusion> - <artifactId>guava</artifactId> - <groupId>com.google.guava</groupId> - </exclusion> - <exclusion> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>com.fasterxml.jackson.module</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>com.fasterxml.jackson.datatype</groupId> - <artifactId>*</artifactId> - </exclusion> - <!-- hudi-timeline-service pulls Jetty + javax.servlet-api, banned by Trino's enforcer. - The Trino connector does not use the timeline service. --> - <exclusion> - <groupId>org.apache.hudi</groupId> - <artifactId>hudi-timeline-service</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>org.apache.hudi</groupId> - <artifactId>hudi-java-client</artifactId> - <version>${project.version}</version> - <exclusions> - <exclusion> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>com.fasterxml.jackson.module</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>com.fasterxml.jackson.datatype</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>org.rocksdb</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>org.apache.arrow</groupId> - <artifactId>*</artifactId> - </exclusion> - <exclusion> - <groupId>org.lance</groupId> - <artifactId>*</artifactId> - </exclusion> - </exclusions> - </dependency> - - <!-- Kryo --> - <dependency> - <groupId>com.esotericsoftware</groupId> - <artifactId>kryo-shaded</artifactId> - <version>${kryo.shaded.version}</version> - <scope>compile</scope> - </dependency> - - <!-- Parquet --> - <dependency> - <groupId>org.apache.parquet</groupId> - <artifactId>parquet-avro</artifactId> - <version>${trino.parquet.version}</version> - <scope>compile</scope> - </dependency> - - <!-- Avro --> - <dependency> - <groupId>org.apache.avro</groupId> - <artifactId>avro</artifactId> - <version>${avro.version}</version> - <scope>compile</scope> - <exclusions> - <!-- Jackson is SPI-provided by Trino at runtime. Avro's transitive jackson-core/databind - must not leak into consumers (check-spi-dependencies). The shaded avro classes within - this bundle reference unrelocated com.fasterxml.jackson.* which the Trino runtime - supplies. --> - <exclusion> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>*</artifactId> - </exclusion> - </exclusions> - </dependency> - - <!--protobuf needs to be shaded because HBase 1.2.3 + native HFile reader needs it at runtime, - but Trino runtime does not have this dependency--> - <dependency> - <groupId>com.google.protobuf</groupId> - <artifactId>protobuf-java</artifactId> - <version>${proto.version}</version> - <scope>${trino.bundle.bootstrap.scope}</scope> - </dependency> - - <!-- Trino SPI artifacts. Declared here as provided to override the compile-scope - transitives pulled in via hudi-trino-plugin -> trino-hive/etc. Trino's server - supplies these at runtime; bundling them would cause split-classloader bugs - and breaks the trino-maven-plugin:check-spi-dependencies enforcer. --> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-annotations</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>io.airlift</groupId> - <artifactId>slice</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>io.opentelemetry</groupId> - <artifactId>opentelemetry-api</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>io.opentelemetry</groupId> - <artifactId>opentelemetry-api-incubator</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>io.opentelemetry</groupId> - <artifactId>opentelemetry-context</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>io.trino</groupId> - <artifactId>trino-spi</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.openjdk.jol</groupId> - <artifactId>jol-core</artifactId> - <scope>provided</scope> - </dependency> - - </dependencies> - <profiles> - <profile> - <id>trino-shade-unbundle-bootstrap</id> - <properties> - <trino.bundle.bootstrap.scope>provided</trino.bundle.bootstrap.scope> - <trino.bundle.bootstrap.shade.prefix/> - </properties> - </profile> - </profiles> -</project> diff --git a/packaging/hudi-trino-bundle/src/main/java/org/apache/hudi/trino/bundle/Main.java b/packaging/hudi-trino-bundle/src/main/java/org/apache/hudi/trino/bundle/Main.java deleted file mode 100644 index eec1ecf88a8d..000000000000 --- a/packaging/hudi-trino-bundle/src/main/java/org/apache/hudi/trino/bundle/Main.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.hudi.trino.bundle; - -import org.apache.hudi.common.util.ReflectionUtils; - -/** - * A simple main class to dump all classes loaded in current classpath - * <p> - * This is a workaround for generating sources and javadoc jars for packaging modules. The maven plugins for generating - * javadoc and sources plugins do not generate corresponding jars if there are no source files. - * <p> - * This class does not have anything to do with Hudi but is there to keep mvn javadocs/source plugin happy. - */ -public class Main { - - public static void main(String[] args) { - ReflectionUtils.getTopLevelClassesInClasspath(Main.class).forEach(System.out::println); - } -} diff --git a/pom.xml b/pom.xml index 66b57428ee69..b9448e1a940a 100644 --- a/pom.xml +++ b/pom.xml @@ -2276,12 +2276,12 @@ </modules> </profile> <profile> - <!-- RFC-105: builds the Trino connector and its publishable shaded bundle. - Excluded from default builds because it requires JDK 25 and the Trino SPI. --> + <!-- RFC-105: builds the Trino connector (org.apache.hudi:hudi-trino), a regular non-shaded + jar relying on Trino's URLClassLoader plugin isolation. Excluded from default builds + because it requires JDK 25 and the Trino SPI. --> <id>hudi-trino</id> <modules> <module>hudi-trino-plugin</module> - <module>packaging/hudi-trino-bundle</module> </modules> </profile> <profile>
