扩展使用Maven构建的项目中的java.base

huangapple go评论90阅读模式
英文:

Extending java.base in a project built with Maven

问题

Maven 3.9.0在运行mvn clean compile时出现无效标志--patch-module的问题,这是因为该项目扩展了java.lang包。当我运行javac --patch-module java.base=src <path-to-source>时,一切正常。

原因是 - Maven使用com.sun.tools.javac.api.JavacTool,当解析<compilerArgs>时,它仅使用BASIC选项组,而--patch-module位于FILEMANAGER组。这会在mvn clean compile期间引发illegal flag异常。

有人知道如何在Maven中使它正常工作吗?我更希望不使用javac命令行工具来设置我的CI流程。

项目结构如下:
src -> main -> java -> java.lang ->

pom.xml如下:

  1. <plugins>
  2. <plugin>
  3. <groupId>org.apache.maven.plugins</groupId>
  4. <artifactId>maven-compiler-plugin</artifactId>
  5. <version>3.10.1</version>
  6. <configuration>
  7. <source>${java.source.sdk}</source>
  8. <target>${java.source.sdk}</target>
  9. <compilerArgs>
  10. <arg>--patch-module java.base=src</arg>
  11. </compilerArgs>
  12. </configuration>
  13. </plugin>
  14. </plugins>

Maven版本:

  1. Apache Maven 3.9.0 (9b58d2bad23a66be161c4664ef21ce219c2c8584)
  2. Maven home: /opt/homebrew/Cellar/maven/3.9.0/libexec
  3. Java version: 18, vendor: Oracle Corporation, runtime: /Users/<username>/Library/Java/JavaVirtualMachines/openjdk-18/Contents/Home
  4. Default locale: en_RS, platform encoding: UTF-8
  5. OS name: "mac os x", version: "12.6.2", arch: "aarch64", family: "mac"

使用JDK 19 - 相同的结果。使用Maven 3.10.1 - 相同的结果。

完整错误如下:

  1. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project commons-bootstrap: Fatal error compiling: error: invalid flag: --patch-module java.base=src -> [Help 1]

异常堆栈跟踪:

  1. Caused by: java.lang.IllegalArgumentException: error: invalid flag: --patch-module java.base=src
  2. at com.sun.tools.javac.main.Arguments.reportDiag (Arguments.java:889)
  3. at com.sun.tools.javac.main.Arguments.doProcessArgs (Arguments.java:395)
  4. at com.sun.tools.javac.main.Arguments.processArgs (Arguments.java:347)
  5. at com.sun.tools.javac.main.Arguments.init (Arguments.java:246)
  6. at com.sun.tools.javac.api.JavacTool.getTask (JavacTool.java:191)
  7. at com.sun.tools.javac.api.JavacTool.getTask (JavacTool.java:119)
  8. at com.sun.tools.javac.api.JavacTool.getTask (JavacTool.java:68)
  9. at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess (JavaxToolsCompiler.java:135)
  10. at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile (JavacCompiler.java:182)
  11. at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute (AbstractCompilerMojo.java:1209)
  12. at org.apache.maven.plugin.compiler.CompilerMojo.execute (CompilerMojo.java:198)
  13. at org.apache.maven.plugin.DefaultBuildPluginManager executeMojo (DefaultBuildPluginManager.java:126)
  14. at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:342)
  15. at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:330)
  16. at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:213)
  17. at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:175)
  18. at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:76)
  19. at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:163)
  20. at org.apache.maven.plugin DefaultMojosExecutionStrategy execute (DefaultMojosExecutionStrategy.java:39)
  21. at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:160)
  22. at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
  23. at org.apache.maven.lifecycle.internal.builder singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
  24. at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
  25. at org.apache.maven DefaultMaven.doExecute (DefaultMaven.java:260)
  26. at org.apache.maven DefaultMaven.doExecute (DefaultMaven.java:172)
  27. at org.apache.maven DefaultMaven.execute (DefaultMaven.java:100)
  28. at org.apache.maven.cli.MavenCli.execute (MavenCli.java:821)
  29. at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:270)
  30. at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
  31. at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:104)
  32. at java.lang.reflect.Method.invoke (Method.java:577)
  33. at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
  34. at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
  35. at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
  36. at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
英文:

Maven 3.9.0 invalid flag --patch-module is what I get when I run mvn clean compile on my project that extends java.lang package. When I run javac --patch-module java.base=src &lt;path-to-source&gt; all is good.

The reason is - Maven uses com.sun.tools.javac.api.JavacTool which when parsing &lt;compilerArgs&gt; is using only the BASIC Option group and --patch-module is in the FILEMANAGER group. This raises an illegal flag exception during mvn clean compile.

Does anyone know how I can get it to work with Maven? I'd prefer not to make my CI pipeline using javac command line tool.

Project structure is like:
src -> main -> java -> java.lang -> <classes>

pom.xml looks like:

  1. &lt;plugins&gt;
  2. &lt;plugin&gt;
  3. &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
  4. &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
  5. &lt;version&gt;3.10.1&lt;/version&gt;
  6. &lt;configuration&gt;
  7. &lt;source&gt;${java.source.sdk}&lt;/source&gt;
  8. &lt;target&gt;${java.source.sdk}&lt;/target&gt;
  9. &lt;compilerArgs&gt;
  10. &lt;arg&gt;--patch-module java.base=src&lt;/arg&gt;
  11. &lt;/compilerArgs&gt;
  12. &lt;/configuration&gt;
  13. &lt;/plugin&gt;
  14. &lt;/plugins&gt;

Maven version:

  1. Maven home: /opt/homebrew/Cellar/maven/3.9.0/libexec
  2. Java version: 18, vendor: Oracle Corporation, runtime: /Users/&lt;username&gt;/Library/Java/JavaVirtualMachines/openjdk-18/Contents/Home
  3. Default locale: en_RS, platform encoding: UTF-8
  4. OS name: &quot;mac os x&quot;, version: &quot;12.6.2&quot;, arch: &quot;aarch64&quot;, family: &quot;mac&quot;

Used JDK 19 -> same result. Used Maven 3.10.1 -> same result.

Full error is:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project commons-bootstrap: Fatal error compiling: error: invalid flag: --patch-module java.base=src -&gt; [Help 1]

Exception stacktrace:

  1. Caused by: java.lang.IllegalArgumentException: error: invalid flag: --patch-module java.base=src
  2. at com.sun.tools.javac.main.Arguments.reportDiag (Arguments.java:889)
  3. at com.sun.tools.javac.main.Arguments.doProcessArgs (Arguments.java:395)
  4. at com.sun.tools.javac.main.Arguments.processArgs (Arguments.java:347)
  5. at com.sun.tools.javac.main.Arguments.init (Arguments.java:246)
  6. at com.sun.tools.javac.api.JavacTool.getTask (JavacTool.java:191)
  7. at com.sun.tools.javac.api.JavacTool.getTask (JavacTool.java:119)
  8. at com.sun.tools.javac.api.JavacTool.getTask (JavacTool.java:68)
  9. at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess (JavaxToolsCompiler.java:135)
  10. at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile (JavacCompiler.java:182)
  11. at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute (AbstractCompilerMojo.java:1209)
  12. at org.apache.maven.plugin.compiler.CompilerMojo.execute (CompilerMojo.java:198)
  13. at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
  14. at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:342)
  15. at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:330)
  16. at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:213)
  17. at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:175)
  18. at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:76)
  19. at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:163)
  20. at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
  21. at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:160)
  22. at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
  23. at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
  24. at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
  25. at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
  26. at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:260)
  27. at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:172)
  28. at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:100)
  29. at org.apache.maven.cli.MavenCli.execute (MavenCli.java:821)
  30. at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:270)
  31. at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
  32. at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:104)
  33. at java.lang.reflect.Method.invoke (Method.java:577)
  34. at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
  35. at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
  36. at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
  37. at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)

答案1

得分: 1

Maven将参数解析为一个带有嵌入式空格的长参数。

应该看起来像这样:

  1. &lt;compilerArgs&gt;
  2. &lt;arg&gt;--patch-module&lt;/arg&gt;
  3. &lt;arg&gt;java.base=src&lt;/arg&gt;
  4. &lt;/compilerArgs&gt;

请参阅Maven文档以获取示例。

英文:

Maven parses the argument as one long argument with embedded whitespace.

This is what it is supposed to look like:

  1. &lt;compilerArgs&gt;
  2. &lt;arg&gt;--patch-module&lt;/arg&gt;
  3. &lt;arg&gt;java.base=src&lt;/arg&gt;
  4. &lt;/compilerArgs&gt;

See the Maven documentation for example.

huangapple
  • 本文由 发表于 2023年2月18日 19:54:06
  • 转载请务必保留本文链接:https://go.coder-hub.com/75493155.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定