Maven运行正常但打包Jar后GraalVM Polyglot依赖加载失败
问题分析与解决方案
问题根源
你遇到的核心问题是依赖打包不完整:
- 你的
pom.xml中,wasm、js、tools这三个GraalVM依赖指定了<type>pom</type>,它们是聚合类型的依赖(仅用于管理子依赖),而非可直接使用的jar包。 - Maven Assembly插件的
jar-with-dependencies描述符默认只会打包jar类型的依赖,不会自动解析pom类型依赖的传递jar包,导致GraalVM语言实现的核心类库没有被打进最终的fat jar中。 - 而
mvn clean compile exec:java运行时,Maven会自动解析所有依赖的传递关系,把pom依赖对应的实际语言jar加载到类路径,因此能正常执行。
解决方案
方案1:改用Maven Shade插件(推荐)
Shade插件比Assembly插件更擅长处理复杂依赖关系,能自动解析pom类型依赖的传递jar并打包进去,替换原Assembly插件的配置即可:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 配置Main类入口,支持直接用java -jar运行 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.cfpolyglot.Main</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
方案2:直接引入实际语言jar依赖
GraalVM的pom聚合依赖对应实际的语言实现jar,你可以替换原pom类型依赖为具体的jar依赖:
<dependencies> <dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>polyglot</artifactId> <version>23.1.1</version> </dependency> <!-- 替换原wasm pom依赖为实际jar --> <dependency> <groupId>org.graalvm.wasm</groupId> <artifactId>wasm</artifactId> <version>23.1.1</version> </dependency> <!-- 替换原js pom依赖为实际jar --> <dependency> <groupId>org.graalvm.js</groupId> <artifactId>js</artifactId> <version>23.1.1</version> </dependency> <!-- 替换原tools pom依赖为实际jar --> <dependency> <groupId>org.graalvm.tools</groupId> <artifactId>tools</artifactId> <version>23.1.1</version> </dependency> </dependencies>
修改后,Assembly插件的jar-with-dependencies就能正常打包这些jar依赖了。
验证方法
打包完成后,解压生成的fat jar,检查是否包含org.graalvm.wasm、org.graalvm.js等包的类文件,确认依赖已被正确打包。
内容的提问来源于stack exchange,提问作者etchesketch
相关产品推荐
相关产品推荐

