You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:19:57