ClassNotFoundException即使JAR TVF显示“丢失”class

问题描述 投票:0回答:1
这是令人困惑的原因是因为以下内容在我的pom.xml中:

<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目录中)。
java maven apache-spark maven-shade-plugin
1个回答
4
投票


B15您找到了解决方案。在GCP DataProc中运行SPARK作业时,我面临着完全相同的问题。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.