java - 当sonar :sonar plugin runs时,Maven编译失败无法使用@Nonnull注释访问Enum

标签 java maven build sonarqube cobertura

我有一个相当大的 Maven 项目,其中有很多子项目,我的竹子实例使用“mvn clean deploy”运行连续构建。还有一个单独的夜间“mvn clean sonar:sonar”失败并出现以下错误。

MediaServiceType 是正在编译的子项目的主要 java 部分中的一个枚举,它实现了另一个项目的接口(interface)。 AbstractToolTest 与 MediaServiceType 位于同一包中,因此它不显示完整的包名称。有问题的行只是从接口(interface)类型转换为 MediaSerivceType。

我认为我的 pom 有问题,但是使用 -X 查看构建,java 编译器实际上会注销类路径,其中包含一个包含 MediaServiceType.class 的文件夹。我也不确定如何处理“无法访问 MediaServiceType”错误,而不是找不到类。

什么可能导致此类问题?

21-Mar-2013 10:45:46    [INFO] ------------------------------------------------------------------------
21-Mar-2013 10:45:46    [ERROR] BUILD ERROR
21-Mar-2013 10:45:46    [INFO] ------------------------------------------------------------------------
21-Mar-2013 10:45:46    [INFO] Can not execute Sonar
21-Mar-2013 10:45:46    
21-Mar-2013 10:45:46    Embedded error: Unable to execute maven plugin
21-Mar-2013 10:45:46    Compilation failure
21-Mar-2013 10:45:46    /data/bamboo/xml-data/build-dir/PRO-PROTRUNKSONAR-JOB1/processors/processor-tool/src/test/java/company/prod/processor/AbstractToolTest.java:[20,52] error: cannot access MediaServiceType
21-Mar-2013 10:45:46    
21-Mar-2013 10:45:46    
21-Mar-2013 10:45:46    [INFO] ------------------------------------------------------------------------
21-Mar-2013 10:45:46    [DEBUG] Trace
21-Mar-2013 10:45:46    org.apache.maven.lifecycle.LifecycleExecutionException: Can not execute Sonar
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:719)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:284)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)
21-Mar-2013 10:45:46        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)
21-Mar-2013 10:45:46        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
21-Mar-2013 10:45:46        at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
21-Mar-2013 10:45:46        at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
21-Mar-2013 10:45:46        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
21-Mar-2013 10:45:46        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
21-Mar-2013 10:45:46        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
21-Mar-2013 10:45:46        at java.lang.reflect.Method.invoke(Method.java:601)
21-Mar-2013 10:45:46        at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
21-Mar-2013 10:45:46        at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
21-Mar-2013 10:45:46        at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
21-Mar-2013 10:45:46        at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
21-Mar-2013 10:45:46    Caused by: org.apache.maven.plugin.MojoExecutionException: Can not execute Sonar
21-Mar-2013 10:45:46        at org.codehaus.mojo.sonar.Bootstraper.executeMojo(Bootstraper.java:103)
21-Mar-2013 10:45:46        at org.codehaus.mojo.sonar.Bootstraper.start(Bootstraper.java:79)
21-Mar-2013 10:45:46        at org.codehaus.mojo.sonar.SonarMojo.execute(SonarMojo.java:88)
21-Mar-2013 10:45:46        at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
21-Mar-2013 10:45:46        ... 17 more
21-Mar-2013 10:45:46    Caused by: org.sonar.api.utils.SonarException: Unable to execute maven plugin
21-Mar-2013 10:45:46        at org.sonar.batch.AbstractMavenPluginExecutor.execute(AbstractMavenPluginExecutor.java:51)
21-Mar-2013 10:45:46        at org.sonar.batch.AbstractMavenPluginExecutor.execute(AbstractMavenPluginExecutor.java:38)
21-Mar-2013 10:45:46        at org.sonar.batch.phases.InitializersExecutor.executeMavenPlugin(InitializersExecutor.java:73)
21-Mar-2013 10:45:46        at org.sonar.batch.phases.InitializersExecutor.execute(InitializersExecutor.java:60)
21-Mar-2013 10:45:46        at org.sonar.batch.phases.Phases.execute(Phases.java:90)
21-Mar-2013 10:45:46        at org.sonar.batch.bootstrap.ProjectModule.doStart(ProjectModule.java:143)
21-Mar-2013 10:45:46        at org.sonar.batch.bootstrap.Module.start(Module.java:83)
21-Mar-2013 10:45:46        at org.sonar.batch.bootstrap.BatchModule.analyze(BatchModule.java:111)
21-Mar-2013 10:45:46        at org.sonar.batch.bootstrap.BatchModule.analyze(BatchModule.java:106)
21-Mar-2013 10:45:46        at org.sonar.batch.bootstrap.BatchModule.analyze(BatchModule.java:106)
21-Mar-2013 10:45:46        at org.sonar.batch.bootstrap.BatchModule.doStart(BatchModule.java:101)
21-Mar-2013 10:45:46        at org.sonar.batch.bootstrap.Module.start(Module.java:83)
21-Mar-2013 10:45:46        at org.sonar.batch.bootstrap.BootstrapModule.doStart(BootstrapModule.java:102)
21-Mar-2013 10:45:46        at org.sonar.batch.bootstrap.Module.start(Module.java:83)
21-Mar-2013 10:45:46        at org.sonar.batch.Batch.execute(Batch.java:100)
21-Mar-2013 10:45:46        at org.sonar.maven.SonarMojo.executeBatch(SonarMojo.java:152)
21-Mar-2013 10:45:46        at org.sonar.maven.SonarMojo.execute(SonarMojo.java:142)
21-Mar-2013 10:45:46        at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
21-Mar-2013 10:45:46        at org.codehaus.mojo.sonar.Bootstraper.executeMojo(Bootstraper.java:98)
21-Mar-2013 10:45:46        ... 21 more
21-Mar-2013 10:45:46    Caused by: org.apache.maven.BuildFailureException: Compilation failure
21-Mar-2013 10:45:46    /data/bamboo/xml-data/build-dir/PRO-PROTRUNKSONAR-JOB1/processors/processor-tool/src/test/java/company/prod/processor/AbstractToolTest.java:[20,52] error: cannot access MediaServiceType
21-Mar-2013 10:45:46    
21-Mar-2013 10:45:46    
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:715)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:556)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.forkProjectLifecycle(DefaultLifecycleExecutor.java:1205)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.forkLifecycle(DefaultLifecycleExecutor.java:1038)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:643)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)
21-Mar-2013 10:45:46        at org.sonar.maven.Maven2PluginExecutor.concreteExecute(Maven2PluginExecutor.java:52)
21-Mar-2013 10:45:46        at org.sonar.batch.AbstractMavenPluginExecutor.execute(AbstractMavenPluginExecutor.java:49)
21-Mar-2013 10:45:46        ... 39 more
21-Mar-2013 10:45:46    Caused by: org.apache.maven.plugin.CompilationFailureException: Compilation failure
21-Mar-2013 10:45:46    /data/bamboo/xml-data/build-dir/PRO-PROTRUNKSONAR-JOB1/processors/processor-tool/src/test/java/company/prod/processor/AbstractToolTest.java:[20,52] error: cannot access MediaServiceType
21-Mar-2013 10:45:46    
21-Mar-2013 10:45:46    
21-Mar-2013 10:45:46        at org.apache.maven.plugin.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:516)
21-Mar-2013 10:45:46        at org.apache.maven.plugin.TestCompilerMojo.execute(TestCompilerMojo.java:102)
21-Mar-2013 10:45:46        at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
21-Mar-2013 10:45:46        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
21-Mar-2013 10:45:46        ... 50 more

打开详细日志记录后,我得到以下内容

21-Mar-2013 17:55:07    [loading RegularFileObject[/data/bamboo/xml-data/build-dir/PRO-PROTRUNKSONAR-JOB1/processors/processor-tool/target/generated-classes/cobertura/company/prod/processor/MediaServiceType.class]]
21-Mar-2013 17:55:07    /data/bamboo/xml-data/build-dir/PRO-PROTRUNKSONAR-JOB1/processors/processor-tool/src/test/java/company/prod/processor/AbstractToolTest.java:20: error: cannot access MediaServiceType
21-Mar-2013 17:55:07            return MediaServiceFactory.getMediaService((MediaServiceType) serviceType, ppt2TextPath, pdfwmkPath);

并且类文件存在,这意味着缺少的不是 MediaServiceType,而是其他内容。

我现在发现,如果我删除 Sonar 构建运行,则问题与 MediaServiceType 中使用的 javax.annotations.Nonnull 有关。运行 mvn test 也可以正常工作,但是如果我运行 sonar,测试编译就会失败,所以我现在很确定责任在于 sonar,而不是我的 pom 文件。

对测试与 Sonar 构建的 --debug 日志进行比较,我可以看到,当 Sonar 运行时,以下额外的 jar 会放在编译类路径中:

  • cobertura-1.9.4.1.jar
  • ant-1.7.0.jar
  • ant-launcher-1.7.0.jar

也不是使用目标/类作为主类,而是使用生成的类/cobertura。

目前我已经通过在 cobertura 配置中忽略 MediaServiceType 来解决这个问题

            <configuration>
                <instrumentation>
                    <excludes>
                        <exclude>**/MediaServiceType.class</exclude>
                        <exclude>**/*Parameter.class</exclude>
                    </excludes>
                </instrumentation>
            </configuration>

参数枚举似乎也有同样的问题,它们也是使用@Nonnull的枚举。

最佳答案

您是否检查过包含 MediaServiceType 和 AbstractToolTest 的依赖项是否在测试范围内。 <scope>test</scope> 。测试找不到该类,因此它可能不在范围内。

关于java - 当sonar :sonar plugin runs时,Maven编译失败无法使用@Nonnull注释访问Enum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15547673/

相关文章:

extjs - 将 Sencha Cmd 与动态加载的 Controller 结合使用

android - 每次在 Android Studio 和 Gradle 中都必须重建项目

java - 在给定的 int 处分割长字符串

java - 是否有一个库可以将任何字符串转换为符合代码约定的有效类名

maven - 在多模块项目中生成聚合 javadoc 时如何避免重复 fork

java - 使用 Maven 将资源文件夹下的文件添加到 zip

java - Maven war 插件 : Specify Regular Expression to exclude libraries within web-inf/lib

java - 为什么 Android 会更改我的 JSON 字符串的顺序?

java - 小数值错误

c++ - CMake 编译时不包含链接库的路径