0

以下从Spark 不使用 pureconfig的解决方案似乎是 sbt 的工作解决方案,但很难找出一个 maven 版本来执行此操作。尝试使用 spark-submit 让 pureconfig 0.8 与 spark 2.1 一起使用,但Exception in thread "main" java.lang.NoSuchMethodError: shapeless.Witness$.mkWitness(Ljava/lang/Object;)Lshapeless/Witness;在 IntelliJ 之外仍然出现令人讨厌的错误。

assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("shapeless.**" -> "shadeshapless.@1")
    .inLibrary("com.chuusai" % "shapeless_2.11" % "2.3.2")
    .inLibrary("com.github.pureconfig" %% "pureconfig" % "0.7.0")
    .inProject
)

还尝试了使用 Pureconfig从这里 Spark 提出的解决方案- 正确的 Maven 阴影插件配置,但仍然没有运气。

如果我使用创建的 jar,这是最终的配置,uber但我不确定我是否完全理解 maven 着色是如何工作的,有没有办法避免创建一个额外的重命名的 jar?理想情况下,我只想使用带有已创建依赖项的 jar,而不是使用以下内容创建额外的第三个 jar:

   <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-shade-plugin</artifactId>
       <version>3.0.0</version>
       <executions>
           <execution>
               <phase>package</phase>
               <goals>
                   <goal>shade</goal>
               </goals>
           </execution>
       </executions>
       <configuration>
           <createDependencyReducedPom>false</createDependencyReducedPom>
           <relocations>
               <relocation>
                   <pattern>shapeless</pattern>
                   <shadedPattern>com.shaded.shapeless</shadedPattern>
               </relocation>
           </relocations>
           <filters>
               <filter>
                   <artifact>*:*</artifact>
                   <excludes>
                       <exclude>META-INF/*.SF</exclude>
                       <exclude>META-INF/*.DSA</exclude>
                       <exclude>META-INF/*.RSA</exclude>
                   </excludes>
               </filter>
           </filters>
           <finalName>uber-${project.artifactId}-${project.version}</finalName>
       </configuration>
   </plugin>
4

1 回答 1

0

抱歉这么晚才回复。我真的不确定是什么导致了问题。我将我的 pureconfig 版本更改为0.8.0(正在使用0.7.2),一切似乎仍然有效。

由于这似乎并不容易,我将尝试让您更深入地了解我的项目的结构,也许这会有所帮助。哦,顺便说一句,我正在使用 maven 3.3.9,但我怀疑它是否重要(谁知道呢)。

所以,我的项目由子模块组成,即我有指定的顶级 pom <modules></modules>,每个模块都有自己的 pom。

现在,在顶级 pom 中,我使用依赖管理以及插件管理,所以它看起来像这样:

</dependencyManagement>
  <dependencies>
    <dependency>
        <!-- some dependency -->
    </dependency>
  </dependencies>
</dependencyManagement>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.0.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.0.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <createDependencyReducedPom>false</createDependencyReducedPom>
                    <relocations>
                        <relocation>
                            <pattern>shapeless</pattern>
                            <shadedPattern>com.matek.chuusai.shapeless</shadedPattern>
                        </relocation>
                    </relocations>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

现在在子模块中,配置依赖项以及添加 maven shade 插件如下所示:

    <dependencies>
      <dependency>
          <!-- some dependency -->
      </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-shade-plugin</artifactId>
                <groupId>org.apache.maven.plugins</groupId>
            </plugin>
        </plugins>
    </build>

如果您的项目有子模块,请尝试以这种方式配置它。希望这会有所帮助(不知何故)。

于 2017-12-12T23:06:46.803 回答