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

执行org.openrewrite.java.migrate.Java8toJava11 Recipe时触发构造器调用异常

解决OpenRewrite迁移Java版本时AddCronTrigger的NullPointerException问题

问题概述

使用org.openrewrite.java.migrate.Java8toJava11进行Java 8到Java 11的版本迁移时,执行Maven目标抛出异常,根源是org.openrewrite.github.AddCronTrigger.parseExpression方法触发NullPointerException。

错误栈

WARNING: Unable to configure org.openrewrite.github.AddCronTrigger
org.openrewrite.config.RecipeIntrospectionException: Unable to call primary constructor for Recipe class org.openrewrite.github.AddCronTrigger
    at org.openrewrite.internal.RecipeIntrospectionUtils.getRecipeIntrospectionException (RecipeIntrospectionUtils.java:140)
    at org.openrewrite.internal.RecipeIntrospectionUtils.construct (RecipeIntrospectionUtils.java:134)
    at org.openrewrite.internal.RecipeIntrospectionUtils.constructRecipe (RecipeIntrospectionUtils.java:102)
    at org.openrewrite.config.ClasspathScanningLoader.configureRecipes (ClasspathScanningLoader.java:165)
    at org.openrewrite.config.ClasspathScanningLoader.scanClasses (ClasspathScanningLoader.java:135)
    at org.openrewrite.config.ClasspathScanningLoader.<init> (ClasspathScanningLoader.java:60)
    at org.openrewrite.config.Environment$Builder.scanRuntimeClasspath (Environment.java:224)
    at org.openrewrite.maven.AbstractRewriteMojo.environment (AbstractRewriteMojo.java:123)
    at org.openrewrite.maven.AbstractRewriteMojo.listResults (AbstractRewriteMojo.java:213)
    at org.openrewrite.maven.AbstractRewriteRunMojo.execute (AbstractRewriteRunMojo.java:53)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
    at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:370)
    at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:351)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:215)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:171)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:163)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:294)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:960)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:293)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:196)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:566)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: java.lang.reflect.InvocationTargetException
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0 (Native Method)
    at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62)
    at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance (Constructor.java:490)
    at org.openrewrite.internal.RecipeIntrospectionUtils.construct (RecipeIntrospectionUtils.java:131)
    ... 32 more
Caused by: java.lang.NullPointerException
    at org.openrewrite.github.AddCronTrigger.parseExpression (AddCronTrigger.java:71)
    at org.openrewrite.github.AddCronTrigger.<init> (AddCronTrigger.java:54)
    at org.openrewrite.github.AddCronTrigger.<init> (AddCronTrigger.java:64)
    ... 36 more

当前pom.xml配置

<plugin>
    <groupId>org.openrewrite.maven</groupId>
    <artifactId>rewrite-maven-plugin</artifactId>
    <version>5.3.1</version>
    <configuration>
        <activeRecipes>
            <recipe>org.openrewrite.java.migrate.UseJavaUtilBase64</recipe>
        </activeRecipes>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.openrewrite.recipe</groupId>
            <artifactId>rewrite-migrate-java</artifactId>
            <version>2.0.7</version>
        </dependency>
    </dependencies>
</plugin>

解决方案

原因分析

AddCronTrigger是GitHub相关的Recipe,用于添加GitHub Actions定时触发器,它必须指定cron表达式参数才能正常初始化。当前场景中并未激活该Recipe,但Maven插件默认扫描整个运行时classpath,自动尝试初始化所有发现的Recipe,导致未配置参数的AddCronTrigger抛出空指针异常。

具体解决方法

方法1:排除不必要的GitHub依赖

在rewrite-migrate-java的依赖中排除rewrite-github,避免加载无关的Recipe:

<plugin>
    <groupId>org.openrewrite.maven</groupId>
    <artifactId>rewrite-maven-plugin</artifactId>
    <version>5.3.1</version>
    <configuration>
        <activeRecipes>
            <recipe>org.openrewrite.java.migrate.UseJavaUtilBase64</recipe>
        </activeRecipes>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.openrewrite.recipe</groupId>
            <artifactId>rewrite-migrate-java</artifactId>
            <version>2.0.7</version>
            <exclusions>
                <exclusion>
                    <groupId>org.openrewrite.recipe</groupId>
                    <artifactId>rewrite-github</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</plugin>

方法2:限制插件扫描的Recipe范围

修改插件配置,关闭自动扫描整个classpath,或者只指定Java迁移相关的Recipe包:

<plugin>
    <groupId>org.openrewrite.maven</groupId>
    <artifactId>rewrite-maven-plugin</artifactId>
    <version>5.3.1</version>
    <configuration>
        <activeRecipes>
            <recipe>org.openrewrite.java.migrate.UseJavaUtilBase64</recipe>
        </activeRecipes>
        <!-- 关闭自动扫描整个classpath的Recipe -->
        <scanRuntimeClasspath>false</scanRuntimeClasspath>
        <!-- 或者仅扫描Java迁移相关包 -->
        <!--
        <include>
            <value>org.openrewrite.java.migrate.*</value>
        </include>
        -->
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.openrewrite.recipe</groupId>
            <artifactId>rewrite-migrate-java</artifactId>
            <version>2.0.7</version>
        </dependency>
    </dependencies>
</plugin>

方法3:升级插件和Recipe版本

旧版本的OpenRewrite组件可能存在初始化逻辑bug,升级到最新稳定版本可解决问题:

<plugin>
    <groupId>org.openrewrite.maven</groupId>
    <artifactId>rewrite-maven-plugin</artifactId>
    <version>5.4.0</version>
    <configuration>
        <activeRecipes>
            <recipe>org.openrewrite.java.migrate.UseJavaUtilBase64</recipe>
        </activeRecipes>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.openrewrite.recipe</groupId>
            <artifactId>rewrite-migrate-java</artifactId>
            <version>2.1.0</version>
        </dependency>
    </dependencies>
</plugin>

内容的提问来源于stack exchange,提问作者Oriol Carcellé Bayona

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:29:50