[ 
https://issues.apache.org/jira/browse/SPARK-45897?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Arnaud Nauwynck updated SPARK-45897:
------------------------------------
    Description: 
updating springboot-dependencies 2.7 to 3.1 breaks spark with springboot 
compatibilities.


{noformat}
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.7.14</version> <!-- OK 2.7.* works fine, but  3.* 
ERROR --> 
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
{noformat}

Internally, everything compile ok, but fail at runtime while creating the 
SparkSession, with SparkUI:


{noformat}
Caused by: java.lang.NoClassDefFoundError: javax/servlet/Servlet
        at org.apache.spark.ui.SparkUI$.create(SparkUI.scala:239) 
~[spark-core_2.13-3.5.0.jar:3.5.0]
        at org.apache.spark.SparkContext.<init>(SparkContext.scala:503) 
~[spark-core_2.13-3.5.0.jar:3.5.0]
        at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2888) 
~[spark-core_2.13-3.5.0.jar:3.5.0]
        at 
org.apache.spark.sql.SparkSession$Builder.$anonfun$getOrCreate$2(SparkSession.scala:1099)
 ~[spark-sql_2.13-3.5.0.jar:3.5.0]
        at scala.Option.getOrElse(Option.scala:201) 
~[scala-library-2.13.8.jar:na]
        at 
org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:1093) 
~[spark-sql_2.13-3.5.0.jar:3.5.0]
....

Caused by: java.lang.ClassNotFoundException: javax.servlet.Servlet
        at 
java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
 ~[na:na]
        at 
java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
 ~[na:na]
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) 
~[na:na]
        ... 49 common frames omitted

{noformat}

Root cause: major change with springboot 3: 'javax.servlet.Servlet' class is NO 
more defined in package 'javax.servlet.', but migrated to 'jakarta.servlet.'

The compiled dependency from spark-core to javax-servlet-api is replaced by 
maven dependencyManagement


It "might be" possible to get rid of maven dependencyManagement or to override 
several artifact versions, but it is NOT PRACTICAL.

Here is a version that work, much more complex  with springboot3 than 
springboot2.

It requires few of forced versions, and exclusions in maven.

    
{noformat}
<properties>
        <spark.version>3.5.0</spark.version>
        <scala.version>2.13</scala.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>3.1.2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.glassfish.jersey.containers</groupId>
                <artifactId>jersey-container-servlet-core</artifactId>
                <version>2.41</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>2.0.9</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_${scala.version}</artifactId>
            <version>${spark.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-slf4j2-impl</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>4.0.4</version>
        </dependency>

    </dependencies>
{noformat}


there are several examples showing errors and fixed for servlet, log4j, 
glassfish incompatibilities here: 
https://github.com/Arnaud-Nauwynck/test-snippets/tree/master/test-springboot-spark



A possible long term solution is to migrate to servlet in package 
"jakarta.servlet." instead of "javax.servlet." as springboot already did, so 
there would "not (?)" be incompatibilities between very old and much more 
recent jars.

Any roadmap for this?






  was:
updating springboot-dependencies 2.7 to 3.1 breaks spark with springboot 
compatibilities.


{noformat}
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.7.14</version> <!-- OK 2.7.* works fine, but  3.* 
ERROR --> 
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
{noformat}

Internally, everything compile ok, but fail at runtime while creating the 
SparkSession, with SparkUI:


{noformat}
Caused by: java.lang.NoClassDefFoundError: javax/servlet/Servlet
        at org.apache.spark.ui.SparkUI$.create(SparkUI.scala:239) 
~[spark-core_2.13-3.5.0.jar:3.5.0]
        at org.apache.spark.SparkContext.<init>(SparkContext.scala:503) 
~[spark-core_2.13-3.5.0.jar:3.5.0]
        at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2888) 
~[spark-core_2.13-3.5.0.jar:3.5.0]
        at 
org.apache.spark.sql.SparkSession$Builder.$anonfun$getOrCreate$2(SparkSession.scala:1099)
 ~[spark-sql_2.13-3.5.0.jar:3.5.0]
        at scala.Option.getOrElse(Option.scala:201) 
~[scala-library-2.13.8.jar:na]
        at 
org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:1093) 
~[spark-sql_2.13-3.5.0.jar:3.5.0]
....

Caused by: java.lang.ClassNotFoundException: javax.servlet.Servlet
        at 
java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
 ~[na:na]
        at 
java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
 ~[na:na]
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) 
~[na:na]
        ... 49 common frames omitted

{noformat}

Root cause: major change with springboot 3: 'javax.servlet.Servlet' class is NO 
more defined in package 'javax.*', but migrated to 'jakarta.*'

The compiled dependency from spark-core to javax-servlet-api is replaced by 
maven dependencyManagement


It "might be" possible to get rid of maven dependencyManagement or to override 
several artifact versions, but it is NOT PRACTICAL.

Here is a version that work, much more complex  with springboot3 than 
springboot2.

It requires few of forced versions, and exclusions in maven.

    
{noformat}
<properties>
        <spark.version>3.5.0</spark.version>
        <scala.version>2.13</scala.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>3.1.2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.glassfish.jersey.containers</groupId>
                <artifactId>jersey-container-servlet-core</artifactId>
                <version>2.41</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>2.0.9</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_${scala.version}</artifactId>
            <version>${spark.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-slf4j2-impl</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>4.0.4</version>
        </dependency>

    </dependencies>
{noformat}


there are several examples showing errors and fixed for servlet, log4j, 
glassfish incompatibilities here: 
https://github.com/Arnaud-Nauwynck/test-snippets/tree/master/test-springboot-spark



A possible long term solution is to migrate to servlet in package "jakarta.*" 
instead of "javax.*" as springboot already did, so there would "not (?)" be 
incompatibilities between very old and much more recent jars.

Any roadmap for this?







> java.lang.NoClassDefFoundError: javax/servlet/Servlet incompatibilities 
> upgrading springboot-dependencies 2.7 to 3.* (package javax.* -> jakarta.*)
> ---------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: SPARK-45897
>                 URL: https://issues.apache.org/jira/browse/SPARK-45897
>             Project: Spark
>          Issue Type: Dependency upgrade
>          Components: Web UI
>    Affects Versions: 3.2.4, 3.3.3, 3.4.0, 3.4.1, 3.5.0
>            Reporter: Arnaud Nauwynck
>            Priority: Major
>
> updating springboot-dependencies 2.7 to 3.1 breaks spark with springboot 
> compatibilities.
> {noformat}
>     <dependencyManagement>
>         <dependencies>
>             <dependency>
>                 <groupId>org.springframework.boot</groupId>
>                 <artifactId>spring-boot-dependencies</artifactId>
>                 <version>2.7.14</version> <!-- OK 2.7.* works fine, but  3.* 
> ERROR --> 
>                 <type>pom</type>
>                 <scope>import</scope>
>             </dependency>
>         </dependencies>
>     </dependencyManagement>
> {noformat}
> Internally, everything compile ok, but fail at runtime while creating the 
> SparkSession, with SparkUI:
> {noformat}
> Caused by: java.lang.NoClassDefFoundError: javax/servlet/Servlet
>       at org.apache.spark.ui.SparkUI$.create(SparkUI.scala:239) 
> ~[spark-core_2.13-3.5.0.jar:3.5.0]
>       at org.apache.spark.SparkContext.<init>(SparkContext.scala:503) 
> ~[spark-core_2.13-3.5.0.jar:3.5.0]
>       at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2888) 
> ~[spark-core_2.13-3.5.0.jar:3.5.0]
>       at 
> org.apache.spark.sql.SparkSession$Builder.$anonfun$getOrCreate$2(SparkSession.scala:1099)
>  ~[spark-sql_2.13-3.5.0.jar:3.5.0]
>       at scala.Option.getOrElse(Option.scala:201) 
> ~[scala-library-2.13.8.jar:na]
>       at 
> org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:1093)
>  ~[spark-sql_2.13-3.5.0.jar:3.5.0]
> ....
> Caused by: java.lang.ClassNotFoundException: javax.servlet.Servlet
>       at 
> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
>  ~[na:na]
>       at 
> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
>  ~[na:na]
>       at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) 
> ~[na:na]
>       ... 49 common frames omitted
> {noformat}
> Root cause: major change with springboot 3: 'javax.servlet.Servlet' class is 
> NO more defined in package 'javax.servlet.', but migrated to 
> 'jakarta.servlet.'
> The compiled dependency from spark-core to javax-servlet-api is replaced by 
> maven dependencyManagement
> It "might be" possible to get rid of maven dependencyManagement or to 
> override several artifact versions, but it is NOT PRACTICAL.
> Here is a version that work, much more complex  with springboot3 than 
> springboot2.
> It requires few of forced versions, and exclusions in maven.
>     
> {noformat}
> <properties>
>         <spark.version>3.5.0</spark.version>
>         <scala.version>2.13</scala.version>
>     </properties>
>     <dependencyManagement>
>         <dependencies>
>             <dependency>
>                 <groupId>org.springframework.boot</groupId>
>                 <artifactId>spring-boot-dependencies</artifactId>
>                 <version>3.1.2</version>
>                 <type>pom</type>
>                 <scope>import</scope>
>             </dependency>
>             <dependency>
>                 <groupId>org.glassfish.jersey.containers</groupId>
>                 <artifactId>jersey-container-servlet-core</artifactId>
>                 <version>2.41</version>
>             </dependency>
>             <dependency>
>                 <groupId>org.slf4j</groupId>
>                 <artifactId>slf4j-api</artifactId>
>                 <version>2.0.9</version>
>             </dependency>
>         </dependencies>
>     </dependencyManagement>
>     <dependencies>
>         <dependency>
>             <groupId>org.springframework.boot</groupId>
>             <artifactId>spring-boot-starter-web</artifactId>
>         </dependency>
>         <dependency>
>             <groupId>org.apache.spark</groupId>
>             <artifactId>spark-core_${scala.version}</artifactId>
>             <version>${spark.version}</version>
>             <exclusions>
>                 <exclusion>
>                     <groupId>org.apache.logging.log4j</groupId>
>                     <artifactId>log4j-slf4j2-impl</artifactId>
>                 </exclusion>
>             </exclusions>
>         </dependency>
>         <dependency>
>             <groupId>jakarta.servlet</groupId>
>             <artifactId>jakarta.servlet-api</artifactId>
>             <version>4.0.4</version>
>         </dependency>
>     </dependencies>
> {noformat}
> there are several examples showing errors and fixed for servlet, log4j, 
> glassfish incompatibilities here: 
> https://github.com/Arnaud-Nauwynck/test-snippets/tree/master/test-springboot-spark
> A possible long term solution is to migrate to servlet in package 
> "jakarta.servlet." instead of "javax.servlet." as springboot already did, so 
> there would "not (?)" be incompatibilities between very old and much more 
> recent jars.
> Any roadmap for this?



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@spark.apache.org
For additional commands, e-mail: issues-h...@spark.apache.org

Reply via email to