Chronicle Queue动态编译失败求助:如何预生成MethodReader类?
解决Chronicle Queue FAT JAR运行时AdapterFilterMethodReader编译失败问题
临时规避方案
- 调整FAT JAR依赖打包方式:确保
edge.marshallable包的类直接存在于FAT JAR根目录,而非嵌套在子JAR中。如果使用Maven Shade Plugin,需禁用依赖精简POM,避免类路径问题:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> </plugin> - 指定生成类的编译目录并添加到类路径:运行FAT JAR时添加以下JVM参数,让Chronicle能正确编译并加载生成类:
提前创建java -Dchronicle.methodReader.outputDirectory=./generated-classes -cp ./generated-classes:your-fat-jar.jar com.your.package.MainClass./generated-classes目录,确保该目录有读写权限。 - 显式指定依赖类路径(针对Spring Boot等嵌套结构FAT JAR):若依赖类嵌套在FAT JAR的
BOOT-INF/lib下,可将包含edge.marshallable的依赖JAR单独提取到FAT JAR同目录,然后添加参数:java -Dchronicle.classpath=./edge-dependency.jar -jar your-fat-jar.jar
构建阶段预生成并编译AdapterFilterMethodReader类(Maven示例)
通过在构建过程中提前生成并编译Chronicle所需的MethodReader类,避免运行时动态编译失败。
1. 添加类生成插件
在pom.xml中配置exec-maven-plugin,调用Chronicle的MethodReaderGenerator生成目标类:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>generate-adapter-filter-reader</id> <phase>generate-sources</phase> <goals> <goal>java</goal> </goals> <configuration> <mainClass>net.openhft.chronicle.bytes.MethodReaderGenerator</mainClass> <!-- 替换为你的AdapterFilter类全限定名 --> <arguments> <argument>edge.processor.AdapterFilter</argument> <argument>${project.build.directory}/generated-sources/chronicle</argument> </arguments> <classpathScope>compile</classpathScope> </configuration> </execution> </executions> </plugin>
2. 将生成目录添加到源码路径
使用build-helper-maven-plugin让编译器识别生成的类:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <id>add-chronicle-sources</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>${project.build.directory}/generated-sources/chronicle</source> </sources> </configuration> </execution> </executions> </plugin>
3. 打包时包含预生成类
常规的FAT JAR打包插件(如Shade或Spring Boot Maven Plugin)会自动将编译后的预生成类包含到最终JAR中,无需额外配置。执行mvn clean package后,生成的AdapterFilterMethodReader类会直接存在于FAT JAR中,运行时无需动态编译。
关键排查点
- 确认
edge.marshallable包的类已被正确打包到FAT JAR中,未被排除或重命名。 - 检查Chronicle版本兼容性:若使用较新版本,确保动态编译所需的工具类(如
javac相关依赖)已包含在FAT JAR中。
内容的提问来源于stack exchange,提问作者GrzegorzM
相关产品推荐
相关产品推荐

