<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>compile</scope>
</dependency>
阴影插件没有引用此Postgres依赖关系或任何将其与之匹配的模式的配置。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<phase>package</phase>
<configuration>
<artifactSet>
<excludes combine.children="append">
<exclude>org.apache.spark:*:*</exclude>
<exclude>org.apache.hadoop:*:*</exclude>
<exclude>org.slf4j:*</exclude>
</excludes>
</artifactSet>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<relocations>
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>${project.groupId}.google.common</shadedPattern>
</relocation>
<relocation>
<pattern>io.netty</pattern>
<shadedPattern>${project.groupId}.io.netty</shadedPattern>
</relocation>
<relocation>
<pattern>okhttp3</pattern>
<shadedPattern>${project.groupId}.okhttp3</shadedPattern>
</relocation>
<relocation>
<pattern>com.fasterxml.jackson</pattern>
<shadedPattern>${project.groupId}.fasterxml.jackson</shadedPattern>
</relocation>
]
</relocations>
<shadedArtifactAttached>true</shadedArtifactAttached>
</configuration>
</execution>
</executions>
</plugin>
Spark依赖项(按照要求):
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_2.11</artifactId>
<version>2.4.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.4.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-tags_2.11</artifactId>
<version>2.4.3</version>
<scope>provided</scope>
</dependency>
在Maven命令构建罐子的输出中,我可以看到
[INFO] Including org.postgresql:postgresql:jar:42.2.1 in the shaded jar.
当我运行时,我可以看到缺少的类。 可能相关的一个奇怪的事情是,当我实际上没有org/postgresql文件夹中解压缩罐子时。 但是,当我
jar tvf myShadedJar.jar | grep postgres
罐子时,它就在那里。
问题可能是什么? 我该如何确认? 是否期望爆炸的罐子缺少org/postgresql文件夹?我在与AWS EMR 5.24.1至5.33.0的Spark应用程序完全相同的问题上挣扎。经过数周的定期尝试寻找出路,我最终意识到执行过程中未使用Uber-Jar的Hikaricp软件包。当我将hikaricp从胖罐中排除时,这很明显,尽管我希望找不到Hikaricp的错误,但错误并没有改变。 事实证明,EMR 5.33.0在多个LIB文件夹中具有
HIKARICP-JAVA7-2.4.12.JAR
,并且该软件包在运行时使用(而不是Uber Jar中的一个)。 我只是从主节点和核心节点中删除了此软件包的所有场合,这解决了问题。 我希望这对对类似问题感到沮丧的人有帮助。
Edit:基于OP的新信息,这不太可能是答案。 看起来您已经遇到了这个问题:Https://github.com/jeremylong/depparendencycheck/issues/2324 不幸的是,阴影罐子代表了一个挑战。在情况下 “阴影”的依赖库包含pom.xml meta-inf目录(即由Maven构建或使用Maven插件 对于gradle) - 然后我们可以提取信息并检测 依赖性。但是,如果是下议院,他们没有 在元I-Inf中有一个pom.xml(不完全确定什么构建系统 他们使用)。因此,依赖性检查将无法识别 依赖性。不幸的是,这种情况对阴影或 Uber罐子(实际上 - 对Uber Jars的情况差)。甚至几个 商业产品很难解决。
您可以将项目从项目中明确复制到阴影jar中(例如,将jar文件的副本放在您的src/main/resources目录中)。
B15您找到了解决方案。在GCP DataProc中运行SPARK作业时,我面临着完全相同的问题。