Weld SE JavaSE应用JNI运行时错误求助:ClassNotFoundException
解决Weld SE应用运行时NoClassDefFoundError问题
你遇到的核心问题是运行时找不到Weld SE相关类,这是因为你用maven-jar-plugin生成的jar只包含了自己项目的代码,没有把依赖的Weld库打包进去,导致JVM在运行时无法定位ContainerInitialized这类类。下面给你几个可行的解决方案:
方案一:使用maven-assembly-plugin打包胖jar
这个插件可以把所有依赖的jar包内容合并到一个可执行jar里,步骤如下:
- 在pom.xml的
<build><plugins>中添加assembly插件配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>de.mycompany.weldapp.App</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
- 重新执行打包命令:
mvn clean package
- 运行生成的胖jar(文件名会是
weldapp-0.0.1-SNAPSHOT-jar-with-dependencies.jar):
java -jar target/weldapp-0.0.1-SNAPSHOT-jar-with-dependencies.jar World
方案二:使用maven-shade-plugin打包(更灵活)
如果需要对打包内容做更多控制,比如排除冲突类,可以用shade插件:
在pom.xml的<build><plugins>中添加:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>de.mycompany.weldapp.App</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
打包后运行生成的jar(默认还是原文件名,但已经包含所有依赖)即可。
额外优化建议
- 你pom里的
maven-compiler-plugin被当成依赖添加了,这是错误的,应该把它移到<build><plugins>里,用来指定Java版本:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin>
然后删除<dependencies>里的maven-compiler-plugin依赖。
cdi-api的scope设为provided没问题,但weld-se-shaded已经包含了CDI API的实现,所以这个依赖可以选择保留或者删除,不影响最终运行。
按照上面的步骤修改后,你的应用应该就能正常运行,输出Hello World了。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

