【发布时间】:2021-10-29 07:18:06
【问题描述】:
当我在非本地环境中通过已部署的 jar(由 maven shade 插件构建)运行 spark 应用程序时遇到一个令人困惑的问题。
java.lang.RuntimeException: java.lang.ClassNotFoundException: org.postgresql.ds.PGSimpleDataSource
at com.zaxxer.hikari.util.UtilityElf.createInstance(UtilityElf.java:96)
at com.zaxxer.hikari.pool.PoolBase.initializeDataSource(PoolBase.java:314)
at com.zaxxer.hikari.pool.PoolBase.<init>(PoolBase.java:108)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:105)
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:72)
at mypackage.SansORMProvider.get(SansORMProvider.java:42)
at mypackage.MySansORMProvider.get(MySansORMProvider.scala:15)
at mypackage.MyApp$.main(MyApp.scala:63)
at mypackage.MyApp.main(MyApp.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:680)
Caused by: java.lang.ClassNotFoundException: org.postgresql.ds.PGSimpleDataSource
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at com.zaxxer.hikari.util.UtilityElf.createInstance(UtilityElf.java:83)
... 13 more
这令人困惑的原因是因为我的 pom.xml 中有以下内容:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>compile</scope>
</dependency>
shade 插件没有配置引用这个 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>
在构建 jar 的 maven 命令的输出中,我可以看到 [INFO] Including org.postgresql:postgresql:jar:42.2.1 in the shaded jar.
当我运行 jar tvf myShadedJar.jar | grep postgres 时,我可以看到缺少的类。
可能相关的一件奇怪的事情是,当我使用jar xf 解压缩 jar 时,没有 org/postgresql 文件夹。然而,当我 unzip 时,它就在那里。
可能是什么问题?我该如何确认?预计爆炸后的 jar 缺少 org/postgresql 文件夹吗?
【问题讨论】:
-
你是否使用 Spring Boot 或任何其他框架进行自定义类加载?
-
您确定要写
java tvf myShadedJar.jar | grep postgres而不是tar tvf myShadedJar.jar | grep postgres? -
@dan1st 项目中的其他模块使用 google guice(不确定是否会加载自定义类),但不是这个。
-
请看 maven-shade-plugin 的完整 pom 配置。 BTW @GeroldBroser 我相信异常是由 Apache Spark 包装的。见这里:databricks.gitbooks.io/databricks-spark-knowledge-base/content/…
-
Your last update 导致“当我用
jar xf解压缩jar 时,没有org/postgresql 文件夹。然而,当我unzipjar 时它就在那里。 “改变事物。如果您提供完整的 POM(可能包含匿名的敏感信息),我可以在这里创建一个项目,看看我是否可以确认此行为并可能找到原因。我也需要你使用的 JDK 和 Maven 版本。
标签: java maven apache-spark maven-shade-plugin