web-dev-qa-db-ja.com

Java 9のMavenコンパイルの問題

JDK 9.0.1を使用してMavenプロジェクトをコンパイルしようとしています私はこのスタックトレースにあまり説明することなく直面しています:

Exception in thread "main" Java.lang.AssertionError
at jdk.compiler/com.Sun.tools.javac.util.Assert.error(Assert.Java:155)
at jdk.compiler/com.Sun.tools.javac.util.Assert.check(Assert.Java:46)
at jdk.compiler/com.Sun.tools.javac.comp.Modules.enter(Modules.Java:250)
at jdk.compiler/com.Sun.tools.javac.main.JavaCompiler.readSourceFile(JavaCompiler.Java:821)
at jdk.compiler/com.Sun.tools.javac.processing.JavacProcessingEnvironment$ImplicitCompleter.complete(JavacProcessingEnvironment.Java:1510)
at jdk.compiler/com.Sun.tools.javac.code.Symbol.complete(Symbol.Java:633)
at jdk.compiler/com.Sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.Java:1314)
at jdk.compiler/com.Sun.tools.javac.code.Type$ClassType.complete(Type.Java:1139)
at jdk.compiler/com.Sun.tools.javac.code.Type$ClassType.getTypeArguments(Type.Java:1065)
at jdk.compiler/com.Sun.tools.javac.code.Printer.visitClassType(Printer.Java:237)
at jdk.compiler/com.Sun.tools.javac.code.Printer.visitClassType(Printer.Java:52)
at jdk.compiler/com.Sun.tools.javac.code.Type$ClassType.accept(Type.Java:992)
at jdk.compiler/com.Sun.tools.javac.code.Printer.visit(Printer.Java:136)
at jdk.compiler/com.Sun.tools.javac.util.AbstractDiagnosticFormatter.formatArgument(AbstractDiagnosticFormatter.Java:197)
at jdk.compiler/com.Sun.tools.javac.util.AbstractDiagnosticFormatter.formatArguments(AbstractDiagnosticFormatter.Java:165)
at jdk.compiler/com.Sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage(BasicDiagnosticFormatter.Java:111)
at jdk.compiler/com.Sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage(BasicDiagnosticFormatter.Java:67)
at jdk.compiler/com.Sun.tools.javac.util.AbstractDiagnosticFormatter.formatArgument(AbstractDiagnosticFormatter.Java:183)
at jdk.compiler/com.Sun.tools.javac.util.AbstractDiagnosticFormatter.formatArguments(AbstractDiagnosticFormatter.Java:165)
at jdk.compiler/com.Sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage(BasicDiagnosticFormatter.Java:111)
at jdk.compiler/com.Sun.tools.javac.util.BasicDiagnosticFormatter.formatMessage(BasicDiagnosticFormatter.Java:67)
at jdk.compiler/com.Sun.tools.javac.util.JCDiagnostic.getMessage(JCDiagnostic.Java:771)
at jdk.compiler/com.Sun.tools.javac.api.ClientCodeWrapper$DiagnosticSourceUnwrapper.getMessage(ClientCodeWrapper.Java:799)
at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess(JavaxToolsCompiler.Java:131)
at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.Java:174)
at org.Apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.Java:1075)
at org.Apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.Java:168)
at org.Apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.Java:134)
at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:208)
at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:154)
at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:146)
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:51)
at org.Apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.Java:128)
at org.Apache.maven.DefaultMaven.doExecute(DefaultMaven.Java:309)
at org.Apache.maven.DefaultMaven.doExecute(DefaultMaven.Java:194)
at org.Apache.maven.DefaultMaven.execute(DefaultMaven.Java:107)
at org.Apache.maven.cli.MavenCli.execute(MavenCli.Java:993)
at org.Apache.maven.cli.MavenCli.doMain(MavenCli.Java:345)
at org.Apache.maven.cli.MavenCli.main(MavenCli.Java:191)
at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.base/Java.lang.reflect.Method.invoke(Method.Java:564)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.Java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.Java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.Java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.Java:356)

何がこれを引き起こしているのか本当にわかりませんが、これはJDKのバグですか?

追加の詳細

  • Maven 3.5.0とmaven-compiler-plugin 3.7.0
  • 私はちょうどmvn clean installを実行しています
  • ソースコードは残念ながらオープンソースではないので、私はそれを共有する自由がありません
  • Module-info.Javaファイルはまだありません。Java 9を使用してプロジェクトをコンパイルしようとしています。
  • 奇妙なことに、ソースレベルを1.8のままにするとコードはコンパイルされますが、9に指定すると上記の例外で失敗します
24
Peter Major

これを追加するだけです

<forceJavacCompilerUse>true</forceJavacCompilerUse>

pOMでmavenコンパイラビルドプラグインにアクセスすると、すべてのjavacエラーが表示されます! 詳細を含むソース

34
Jason

スタックトレースの一部

at jdk.compiler/com.Sun.tools.javac.main.JavaCompiler.readSourceFile(JavaCompiler.Java:821)

コードの行に関連する

throw new CompletionFailure(c, diags.fragment("cant.resolve.modules"));

これは、Java9に基づいていない、および/または(正しい)モジュール宣言がないmodule-info.Javaリリースバージョンが9に指定されている場合、宣言あり/なしでモジュールを解決できません。

2
Naman

[〜#〜] update [〜#〜]

ほとんどの場合、このエラーは、コンパイラがコンパイルエラーを報告しようとしているときに発生するようですが、プロセスで爆発します。これまでのところ、主に2つのアプローチがこれらの問題の解決に役立ちました。

  • -proc:noneコンパイラー引数を使用して、注釈処理を無効にします(注釈処理がコンパイラーを混乱させる可能性があるようです。
  • 条件付きブレークポイントを使用してコンパイラーをデバッグし、コンパイラーのエラーメッセージが見つかるまでスタックを調べ、そのエラーを修正します...

オリジナルソリューション

多くの試行錯誤の後、この問題をローカルで回避/修正することができましたが、最終的に私のアプローチは次のとおりでした:

  • 依存関係がビルド結果に何らかの形で干渉している可能性があると仮定していたため、障害が発生したモジュールのPOMのMaven <dependency>エントリをコメントアウトし始めました。
  • その後、ビルドは失敗し始めましたが、役に立たないAssertionError失敗の代わりに、シンボルおよび同様のコンパイルエラーを見つけることができませんでした
  • このAssertionErrorをトリガーする特定の依存関係があることが判明しました。
  • コード分​​析の後、その依存関係が問題を引き起こす理由を特定できなかったため、推移的な依存関係を調べ始めました。
  • 次に、以前と同じアプローチを使用しましたが、障害のある依存関係のコメントを外す代わりに、その推移的な依存関係をすべてPOMに挿入しました
  • ビルドは再び失敗し、多くのテストを重ねた結果、io.vavr:vavr:0.9.0:compileとjavax.servlet:servlet-api:3.0.1:testの両方が含まれているときにAssertionErrorをトリガーできることが判明しました依存関係グラフで

テストのスコープ依存関係がプロジェクトのコンパイルにどのように影響するかはまだ私にはわかりません...また、javax.servlet:servlet-api:3.0.1:providedは、障害のあるモジュールの依存関係の中に既にあることがわかりました。テストスコープの依存関係は実際には何にも使用されていません。

最終的に、誤って定義されたテストスコープのservlet-api依存関係をバグトリガーモジュールから削除しただけで、Mavenは以前に失敗したモジュールをコンパイルできました。

これはそもそも非常にあいまいな質問に対する非常にあいまいな答えであると確信していますが、私のアプローチが他の誰かに役立つことを願っています。

1
Peter Major