首页 > 解决方案 > Maven:当shade将项目打包到jar时,如何删除本地覆盖类并使用依赖项中的原始类进行编译

问题描述

我在spark lib中创建了一个与B同名的类A,在本地运行spark程序时覆盖B,以帮助我调试程序。

我还需要将程序隐藏到具有依赖项的 jar 中,以上传到服务器以在集群中运行 spark 程序。

问题是,每次对程序进行shade打包时,都需要先将本地定义的class A去掉,否则在集群中运行shade打包的jar时,会出现异常导致整个过程失败:

User class threw exception: java.lang.NoSuchMethodError: A.fun1.

下次我需要在本地调试程序时,我需要再次添加回 A 类。这有点烦人。

我想知道Maven是否可以帮助我在形状打包项目时删除本地覆盖类A并使用原始类B编译,同时仍然使我能够在本地运行和调试程序本地类A覆盖类B在spark中。

供参考:

  1. 我正在使用 IntelliJ IDEA 和 maven 3。
  2. 本地定义的 A 类和 spark lib 中的 B 类具有完全相同的类名、包名、函数名和参数。
  3. 我试过了,但没有用:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <executions>
                <execution>
                    <id>uber-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <finalName>${project.artifactId}-${project.version}-jar-with-dependencies</finalName>
                        <filters>
                            <filter>
                                <artifact>${project.groupId}:${project.artifactId}</artifact>
                                <excludes>
                                    <exclude>package-of-classA/classA.*</include>
                                </excludes>
                            </filter>
                        </filters>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    

    并报告:

“用户类抛出异常:java.lang.NoSuchMethodError:A.fun1。”

标签: javamavenapache-sparkantmaven-shade-plugin

解决方案


推荐阅读