首页 > 解决方案 > 任何在 gradle 文件中制作 `exclude` 的方法在构建时都不适用,但在运行代码时适用

问题描述

我正在尝试为我的 Java Spark 代码编写一些单元测试。以下是我的第一个简单尝试

public class SparkHelperTest {

    private JavaSparkContext sparkCtx;

    @Before
    public void setUp() throws IllegalArgumentException, IOException {
        SparkConf conf = new SparkConf();
        conf.setMaster("local[2]");
        conf.setAppName("sparkHelperTest");
        sparkCtx = new JavaSparkContext(conf);
    }

    @Test
    public void test() {
        final List<Integer> nums = new ArrayList<Integer>();
        nums.add(3);
        nums.add(4);
        nums.add(2);
        JavaRDD<Integer> rdd = sparkCtx.parallelize(nums,1);
        assertEquals(3, rdd.count());
    }
}

但是我收到了这个错误

java.lang.NoClassDefFoundError: com/sun/jersey/spi/container/servlet/ServletContainer
        at org.apache.spark.status.api.v1.ApiRootResource$.getServletHandler(ApiRootResource.scala:187)
        at org.apache.spark.ui.SparkUI.initialize(SparkUI.scala:70)
        at org.apache.spark.ui.SparkUI.<init>(SparkUI.scala:76)
        at org.apache.spark.ui.SparkUI$.create(SparkUI.scala:195)
        at org.apache.spark.ui.SparkUI$.createLiveUI(SparkUI.scala:146)
        at org.apache.spark.SparkContext.<init>(SparkContext.scala:473)
        at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:59)
        at com.firsttry.spark.SparkHelperTest.setUp(SparkHelperTest.java:29)
        ......
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
        at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
        at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
        at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
    Caused by: java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 30 more

我在网上搜索了一下,基本上是因为需要球衣版本 1。但是,我发现 jersey v1 在我们的 build.gradle 中被注释如下

compile (
            'io.dropwizard:dropwizard-core:' + dropwizardVersion,
            ......
)
compile('org.apache.spark:spark-core_2.10:' + sparkVersion) {
        exclude group: 'org.apache.hadoop', module: 'hadoop-common'
}    
configurations.all {
        // all v1 versions of jersey should be excluded. Spark has some of these dependencies
        exclude group: 'com.sun.jersey', module: 'jersey-server'
        ......
}

如果我评论了这个“ exclude group: 'com.sun.jersey', module: 'jersey-server'”,这个错误将在单元测试中消失。但是,在我构建任务并运行 spark 作业后,我会收到另一个错误(请注意,使用此“排除”,spark 作业运行良好,所以我想人们将这个排除放在那里是有原因的)。

所以我的问题是,是否有任何方法可以在构建 shadowJar 时使其exclude group: 'com.sun.jersey', module: 'jersey-server' 不适用,但是在运行 spark 作业时,此排除将适用吗?

标签: javaapache-sparkgradlebuild.gradle

解决方案


推荐阅读