【问题标题】:Why does Maven 3.3 not include 'javax.inject' but Maven 3.2 does?为什么 Maven 3.3 不包含 'javax.inject' 但 Maven 3.2 包含?
【发布时间】:2015-08-08 17:06:45
【问题描述】:

我的 Maven 构建在使用 Maven 3.3.1 时失败,但在 Maven 3.2.2 中成功。

到目前为止,我已经运行了/path/to/3.3.1/mvn clean compile -X,并将输出与/path/to/3.2.2/mvn clean compile -X 生成的输出进行了比较。

maven-compiler-plugin / default-compile 阶段内的以下块中确实存在一个差异:

[DEBUG] Populating class realm plugin>org.apache.maven.plugins:maven-compiler-plugin:3.2
[DEBUG]   Included: org.apache.maven.plugins:maven-compiler-plugin:jar:3.2
[DEBUG]   Included: com.google.dagger:dagger-compiler:jar:2.0
[DEBUG]   Included: com.google.dagger:dagger:jar:2.0
[DEBUG]   Included: com.google.dagger:dagger-producers:jar:2.0-beta
[DEBUG]   Included: com.google.guava:guava:jar:18.0
...

区别:虽然 Maven 3.2.2 打印了 [DEBUG] Included: javax.inject:javax.inject:jar:1,但 Maven 3.3.1 却没有。

我不知道这是否有帮助,但这是我的有效构建插件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.2</version> <!-- 3.3 respectively -->
    <dependencies>
        <dependency>
            <groupId>com.google.dagger</groupId>
            <artifactId>dagger-compiler</artifactId>
            <version>2.0</version>
        </dependency>
    </dependencies>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <!-- workaround for http://jira.codehaus.org/browse/MCOMPILER-202 -->
        <forceJavacCompilerUse>true</forceJavacCompilerUse>
    </configuration>
</plugin>

我不明白的是:“填充类领域插件”到底是做什么的?为什么缺少一个 jar,即使它已被两个 maven 版本识别为依赖项?

编辑:构建失败并出现此异常:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (default-compile) on project ui: Compilation failure -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (default-compile) on project ui: Compilation failure
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
    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:307)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:862)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:286)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:197)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    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)
Caused by: org.apache.maven.plugin.compiler.CompilationFailureException: Compilation failure
    at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:913)
    at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:129)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
    ... 20 more

GitHub 上提供了一个最小示例项目。 失败命令的完整输出可用here

【问题讨论】:

  • 如果您能说明实际的构建错误是什么,将会很有帮助。您的问题中没有任何内容表明 javax.inject 差异是您构建失败的原因。
  • 添加了异常,尽管它只是一个通用的编译错误堆栈跟踪

标签: java maven maven-3 dagger-2


【解决方案1】:

问题不在于maven-compiler-plugin的版本。
当您使用选项 forceJavacCompilerUse 时,它基本上会在您的 JDK 中使用 javax.tool API 实现。
由于您使用的是依赖于 javax.inject 的实习生 dagger-compiler,因此应该将其拉出。

您可以尝试为您的 dagger-compiler 插件依赖项添加 [provided] 范围,这样您将锁定所有传递依赖项。

还要确保您已添加 dagger 运行时依赖项中的依赖项。

请提供一些关于异常堆栈跟踪和您的 pom 的其他相关区域的更多详细信息,以帮助访问者缩小问题范围并快速指导您!

【讨论】:

  • 我添加了一个最小项目来重现这个问题以及完整的日志文件。堆栈跟踪已经完成。添加具有提供范围的 dagger-compiler 依赖项不会改变任何内容:-/
  • 使用 javax.tools 编译器添加具有提供范围的 dagger-compiler 解决了这个问题。我刚刚将更新后的 pom.xml 推送到我的问题中提到的 GitHub 项目。它现在正在工作,但我不明白为什么它不能作为构建插件依赖项工作。如果您添加一些关于 javax.tools 与 javac 编译器的内容以及插件依赖项与项目依赖项的不同之处,我会接受这个答案。
  • 嗨塞巴斯蒂安,我已经克隆了你的示例项目并尝试在我的机器上构建,它构建得很好。这是我使用的pom。这是partial debug loginfo log
  • 您一直在使用 Maven 3.2.1,它也没有在我的机器上造成任何问题。尝试 Maven 3.3,它应该会失败。
猜你喜欢
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 2013-03-18
  • 2020-11-01
  • 1970-01-01
相关资源
最近更新 更多