Java8升级Java11后Jaxb2/Castor插件报Code too large错误求助
解决Java 11下JAXB2插件生成类「Code too large」编译错误
核心原因
Java 11的javac编译器对方法字节码大小的校验逻辑比Java 8更严格,同时JAXB2插件在Java 11环境下生成的代码因依赖的JDK内置API变更,导致单个方法的字节码体积超过65536字节上限。
可行解决方案
1. 给JAXB2插件添加分块生成参数
通过-XchunkSize参数让插件自动将超大方法拆分为多个小方法,配合-XautoNameResolution避免命名冲突。修改Maven插件配置:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>2.5.0</version> <executions> <execution> <goals> <goal>xjc</goal> </goals> <configuration> <args> <arg>-XautoNameResolution</arg> <arg>-XchunkSize=50</arg> <!-- 可根据实际代码体积调整数值 --> </args> <!-- 保留原有的schema路径等配置 --> </configuration> </execution> </executions> </plugin>
额外添加-Xno-inline参数,禁止插件内联生成的代码,进一步减小单方法字节码体积。
2. 优化Java编译参数
给maven-compiler-plugin添加-parameters参数,让编译器对生成的JAXB代码做更高效的字节码优化:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>11</source> <target>11</target> <compilerArgs> <arg>-parameters</arg> </compilerArgs> </configuration> </plugin>
3. 替换为EclipseLink MOXy作为JAXB实现
MOXy生成的代码比默认JAXB更简洁,单方法字节码体积更小。配置依赖和插件:
<!-- 添加MOXy依赖 --> <dependencies> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.moxy</artifactId> <version>2.7.10</version> </dependency> </dependencies> <!-- 替换为MOXy的XJC插件 --> <plugin> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.moxy.plugins</artifactId> <version>2.7.10</version> <executions> <execution> <goals> <goal>xjc</goal> </goals> <configuration> <schemaDirectory>src/main/resources/xsd</schemaDirectory> <!-- 保留原有的其他配置 --> </configuration> </execution> </executions> </plugin>
4. 自定义JAXB绑定规则拆分复杂类型
编写binding.xjb绑定文件,手动拆分XSD中的超大复杂类型,减少单个生成类的方法体积:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.1"> <jaxb:bindings schemaLocation="your-large-schema.xsd"> <!-- 拆分LargeType为多个子类型 --> <jaxb:bindings node="//xs:complexType[@name='LargeType']/xs:sequence/xs:element[position() <= 50]"> <jaxb:class name="LargeTypePart1"/> </jaxb:bindings> <jaxb:bindings node="//xs:complexType[@name='LargeType']/xs:sequence/xs:element[position() > 50]"> <jaxb:class name="LargeTypePart2"/> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
然后在插件配置中指定该绑定文件:
<configuration> <bindingFiles> <bindingFile>src/main/resources/binding.xjb</bindingFile> </bindingFiles> </configuration>
内容的提问来源于stack exchange,提问作者abubakar
相关产品推荐
相关产品推荐

