执行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
相关产品推荐
相关产品推荐

