Java允许实例化继承内嵌Jar类的Jar中类吗?OpenApiGenerator报错求助
OpenApiGenerator自定义Jar类加载问题解决方案
先直接给结论:Jar嵌套本身是可行的,但你碰到的问题大概率出在Jar的构建方式或者类加载配置上,和嵌套本身关系不大。
问题根源
你遇到的java.lang.NoClassDefFoundError和java.lang.ClassNotFoundException,本质就是JVM在类路径里找不到CodeGenMojo类——哪怕它确实在你导出的Jar里。
因为你的CodeGenMojo继承了内嵌Jar里的AbstractMojo,如果构建Jar时没正确处理依赖打包,或者类加载器没法识别内嵌Jar里的类,就会触发这类错误。
具体解决步骤
1. 用Maven插件构建Jar(别手动导出)
如果你是用IDE手动导出Jar,默认不会自动处理依赖嵌套,这是最常见的坑。直接用Maven的maven-shade-plugin或maven-assembly-plugin来构建,这俩能自动搞定依赖打包和类路径:
- maven-shade-plugin(推荐,能处理类冲突):
在项目的pom.xml里加这段配置,执行mvn package就能生成包含所有依赖的胖Jar:<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> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <!-- 要是需要直接运行Jar,这里填主类的全路径 --> <mainClass>your.main.Class</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> - maven-assembly-plugin:
适合自定义打包规则,同样执行mvn package生成带依赖的Jar:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>your.main.Class</mainClass> </manifest> </archive> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
2. 验证Jar内容是否正确
用命令行执行jar tf your-generated.jar,检查两个关键点:
- 有没有
org/openapitools/codegen/plugin/CodeGenMojo.class这个文件 - 依赖的
AbstractMojo.class是不是也被打包进来了(shade插件会把依赖类解压到Jar根目录,assembly插件可能保留嵌套Jar)
3. 如果是Maven插件场景(重点!)
因为CodeGenMojo是Maven插件类,Maven的插件类加载机制和普通Java程序不一样:
- 必须把自定义Jar安装到本地Maven仓库(执行
mvn install) - 在需要使用的项目pom.xml里正确引入插件:
<plugin> <groupId>org.openapitools</groupId> <artifactId>openapi-generator-maven-plugin</artifactId> <version>你的自定义版本号</version> <dependencies> <!-- 要是有额外依赖,在这里声明 --> </dependencies> </plugin>
不能直接把胖Jar当普通依赖用,得遵循Maven插件的依赖规则。
额外提醒
普通Java程序里的Jar嵌套可以用自定义类加载器实现,但Maven插件这种有特定类加载逻辑的场景,老老实实按Maven的方式构建才靠谱,别折腾手动导出的Jar。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

