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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:04:50