如何正确配置属性“sonar.java.binaries”?

Posted

技术标签:

【中文标题】如何正确配置属性“sonar.java.binaries”?【英文标题】:How to correctly configure the property "sonar.java.binaries"? 【发布时间】:2017-01-10 11:40:21 【问题描述】:

我们使用 SonarQube 5.1.2 和 Ant runner 2.2 和 Java pluging 3.12 进行分析。我可以成功地分析我的项目。我只是不断收到此错误:

Java bytecode has not been made available to the analyzer. The org.sonar.java.bytecode.visitor.DependenciesVisitor@d678716, org.sonar.java.checks.unused.UnusedPrivateMethodCheck@58e28efd, CycleBetweenPackages rule are disabled.

所以我需要配置我的 sonar.java.binaries 和 sonar.java.test.binaries 属性(在http://docs.sonarqube.org/display/PLUG/Java+Plugin+and+Bytecode 之后)。

我认为我做对了:

<property name="project.dir" value="$basedir/xalg.prj/h3_service_fo" />   
<property name="sonar.java.binaries" location="$project.build.dir/classes/main" />
<property name="sonar.java.test.binaries" value="$project.build.dir/classes/test" />

为上述属性解析为以下有效目录:

basedir=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj
project.dir=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/xalg.prj/h3_service_fo
sonar.java.binaries=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj\\xalg.prj\\h3_service_fo\\build\\classes\\main
sonar.java.test.binaries=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/xalg.prj/h3_service_fo/build/classes/test

但我不断得到:

Java bytecode has not been made available to the analyzer. The org.sonar.java.bytecode.visitor.DependenciesVisitor@d678716, org.sonar.java.checks.unused.UnusedPrivateMethodCheck@58e28efd, CycleBetweenPackages rule are disabled.

对于我的生活,我无法弄清楚我需要为 sonar.java.binaries 和 sonar.java.test.binaries 属性提供什么值。我什至尝试使用 sonar.binaries,它给了我以下输出:

Binary dirs: xalg.prj/h3_service_fo/build/classes

我没有使用 sonar.java.binaries 或 sonar.java.test.binaries。我也得到了:

JavaClasspath initialization...
sonar.binaries and sonar.libraries are deprecated since version 2.5 of sonar-java-plugin, please use sonar.java.binaries and sonar.java.libraries instead

对于已弃用的属性,这是预期的。但是使用 sonar.java.binaries 属性我没有在我的日志中得到“Binary dirs”行。

使用 sonar.java.binaries:

Language is forced to java
Load rules
Load rules (done) | time=761ms
Code colorizer, supported languages: cs,plsql
Initializers : 
Base dir: D:\appl\BuildAgent\work\H3\src.prj\java.prj
Working dir: D:\appl\BuildAgent\work\H3\src.prj\java.prj\.sonar
Source paths: xalg.prj/h3_service_fo/src/main/java
Test paths: xalg.prj/h3_service_fo/src/test/java
Source encoding: windows-1252, default locale: en_US
Index files

相对于使用 sonar.binaries:

Language is forced to java
Load rules
Load rules (done) | time=736ms
Code colorizer, supported languages: cs,plsql
Initializers : 
Base dir: D:\appl\BuildAgent\work\H3\src.prj\java.prj
Working dir: D:\appl\BuildAgent\work\H3\src.prj\java.prj\.sonar
Source paths: xalg.prj/h3_service_fo/src/main/java
Test paths: xalg.prj/h3_service_fo/src/test/java
Binary dirs: xalg.prj/h3_service_fo/build/classes
Source encoding: windows-1252, default locale: en_US
Index files

我还查看了 SonarQube、SonarQube Java 插件和 SonarQube 扫描器的源代码,以查找“Java 字节码尚未对分析器可用”的实例。或 sonar.java.binaries。我在 sonar.java.binaries 上找到了很多,但没有关于“Java 字节码尚未对分析器可用”。所以我不知道究竟是什么条件触发了这个错误。

我还在 sonar.java.binaries 上尝试了以下排列:

<property name="sonar.java.binaries" location="$project.build.dir/classes" />
<property name="sonar.java.binaries" location="$project.build.dir/classes/main/nl" />

但这也无济于事。

奇怪的是 Squid 似乎可以很好地解析类路径:

----- Classpath analyzed by Squid:
D:\appl\BuildAgent\work\H3\src.prj\java.prj\xalg.prj\h3_service_fo\build\classes\main

那么,我错过了什么?我究竟做错了什么?提前致谢。

2016 年 9 月 8 日更新: 删除了整个日志,帖子变得很长。

具有(我认为)相关路径的子集:

project.build.dir=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/xalg.prj/h3_service_fo/build
project.dir=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/xalg.prj/h3_service_fo
project.src.dir=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/xalg.prj/h3_service_fo/src

sonar.dir=D\:/appl/sonarqube-5.1.2
sonar.working.directory=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj\\.sonar
sonar.projectBaseDir=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj

sonar.jacoco.reportPath=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/xalg.prj/h3_service_fo/build/jacoco/test.exec
sonar.junit.reportsPath=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/xalg.prj/h3_service_fo/build/test-results

sonar.sources=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/xalg.prj/h3_service_fo/src/main/java
sonar.java.binaries=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj\\xalg.prj\\h3_service_fo\\build\\classes\\main

sonar.java.libraries=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/_deploy/*.jar,D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/_repos/lib/*.jar,D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/_repos/provided/*.jar

sonar.tests=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/xalg.prj/h3_service_fo/src/test/java
sonar.java.test.binaries=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/xalg.prj/h3_service_fo/build/classes/test
sonar.java.test.libraries=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/_deploy/*.jar,D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/_repos/lib/*.jar,D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj/_repos/provided/*.jar

路径与我的帖子中的格式完全相同。会不会是 Sonar Ant runner 无法找出同时带有反斜杠和斜杠的路径?

2016 年 9 月 16 日更新: 删除了整个日志,帖子变得很长。

具有(我认为)相关路径的子集:

project.build.dir=xalg.prj\\\\h3_service_fo\\\\build
project.dir=xalg.prj\\\\h3_service_fo
project.src.dir=xalg.prj\\\\h3_service_fo\\\\src

sonar.dir=D\:\\\\appl\\\\sonarqube-5.1.2
sonar.working.directory=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj\\.sonar
sonar.projectBaseDir=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj

sonar.jacoco.reportPath=xalg.prj\\\\h3_service_fo\\\\build\\\\jacoco/test.exec
sonar.junit.reportsPath=xalg.prj\\\\h3_service_fo\\\\build\\\\test-results

sonar.sources=xalg.prj\\\\h3_service_fo\\\\src\\\\main\\\\java
sonar.java.binaries=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj\\xalg.prj\\h3_service_fo\\build\\classes\\main
sonar.java.libraries=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj\\\\_deploy\\\\*.jar,D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj\\\\_repos\\\\lib\\\\*.jar,D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj\\\\_repos\\\\provided\\\\*.jar

sonar.tests=xalg.prj\\\\h3_service_fo\\\\src\\\\test\\\\java
sonar.java.test.binaries=xalg.prj\\\\h3_service_fo\\\\build\\\\classes\\\\test
sonar.java.test.libraries=D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj\\\\_deploy\\\\*.jar,D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj\\\\_repos\\\\lib\\\\*.jar,D\:\\appl\\BuildAgent\\work\\H3\\src.prj\\java.prj\\\\_repos\\\\provided\\\\*.jar

有些路径变成了相对路径,但我认为这是因为 TeamCity 将 Ant 文件更改为 SVN 中的文件。 sonar.java.binaries 是绝对的,它肯定指向正确的目录。

但我仍然收到此错误:

09:17:52.299 INFO  - Java Main Files AST scan done: 1579 ms
09:17:52.301 INFO  - 2/2 source files have been analyzed
09:17:52.305 WARN  - Java bytecode has not been made available to the analyzer. The org.sonar.java.bytecode.visitor.DependenciesVisitor@757a48f9, org.sonar.java.checks.unused.UnusedPrivateMethodCheck@1adf492b, CycleBetweenPackages rule are disabled.

类路径仍然解释得很好:

[sonar:sonar] 09:17:51.971 DEBUG - ----- Classpath analyzed by Squid:
[sonar:sonar] 09:17:51.972 DEBUG - D:\appl\BuildAgent\work\H3\src.prj\java.prj\xalg.prj\h3_service_fo\build\classes\main
[sonar:sonar] 09:17:51.973 DEBUG - D:\appl\BuildAgent\work\H3\src.prj\java.prj\_deploy\batch.daemon.jar
[sonar:sonar] 09:17:51.974 DEBUG - D:\appl\BuildAgent\work\H3\src.prj\java.prj\_deploy\buildinfo.jar
[sonar:sonar] 09:17:51.975 DEBUG - D:\appl\BuildAgent\work\H3\src.prj\java.prj\_deploy\h2_shared.jar
[sonar:sonar] 09:17:51.975 DEBUG - D:\appl\BuildAgent\work\H3\src.prj\java.prj\_deploy\h3_generator.jar
[sonar:sonar] 09:17:51.976 DEBUG - D:\appl\BuildAgent\work\H3\src.prj\java.prj\_deploy\h3_loadtest.jar
[sonar:sonar] 09:17:51.977 DEBUG - D:\appl\BuildAgent\work\H3\src.prj\java.prj\_deploy\h3_model_common.jar
[sonar:sonar] 09:17:51.977 DEBUG - D:\appl\BuildAgent\work\H3\src.prj\java.prj\_deploy\h3_model_xalg.jar
[sonar:sonar] 09:17:51.978 DEBUG - D:\appl\BuildAgent\work\H3\src.prj\java.prj\_deploy\h3_model_xalg_dao.jar
[sonar:sonar] 09:17:51.979 DEBUG - D:\appl\BuildAgent\work\H3\src.prj\java.prj\_deploy\h3_model_xalg_mappers.jar
[sonar:sonar] 09:17:51.979 DEBUG - D:\appl\BuildAgent\work\H3\src.prj\java.prj\_deploy\h3_model_xalg_procedures.jar
[sonar:sonar] 09:17:51.980 DEBUG - D:\appl\BuildAgent\work\H3\src.prj\java.prj\_deploy\h3_model_xcare.jar
[sonar:sonar] 09:17:51.981 DEBUG - D:\appl\BuildAgent\work\H3\src.prj\java.prj\_deploy\h3_model_xcare_dao.jar
[sonar:sonar] 09:17:51.982 DEBUG - D:\appl\BuildAgent\work\H3\src.prj\java.prj\_deploy\h3_model_xcare_mappers.jar
[sonar:sonar] 09:17:51.982 DEBUG - D:\appl\BuildAgent\work\H3\src.prj\java.prj\_deploy\h3_model_xcare_procedures.jar

Sonar Ant runner 是否对转义的反斜杠有问题?

【问题讨论】:

尝试将-DsonarRunner.dumpToFile=out.txt 附加到命令行并检查路径 感谢您的回复,但这给了我不知道的信息。我已经用新信息更新了我的帖子。请您再看看好吗? 我发现 \\ 和 / 在您解析的路径中的混合很奇怪。您可以尝试将所有斜线指向同一个方向吗? 只用反斜杠做了另一次分析,但仍然没有结果。 我确实尝试过复制这个,但我在 Linux 上,我不能排除这是一个因素。我会尝试:1)从你的路径中删除属性插值(只是为了确保)2)升级。 :-/ 【参考方案1】:

这是我使用的,它有效。

sonar-scanner -Dsonar.projectKey=projectName
-Dsonar.gitlab.commit_sha=$CI_BUILD_REF
-Dsonar.gitlab.ref_name=$CI_BUILD_REF_NAME -Dsonar.sources=directory\src\
-Dsonar.java.binaries=.build\libs\

您需要将 sonar.java.binaries 指向包含 jar 的目录。我不会尝试使用通配符和文件扩展名,那不是一回事。您需要一个目录作为参数,而不是文件的正则表达式。

我对声纳扫描仪一无所知,但我的配置有效。

将我的示例纳入上下文,我在 gitlab 运行器管道中使用它。你的双反斜杠应该没问题,但你总是可以在配置文件中用它们代替正斜杠。

【讨论】:

我认为您对这些属性感到困惑。每个文档是您提到的属性“sonar.java.libraries”,而不是“sonar.java.binaries”。 docs.sonarqube.org/display/PLUG/Java+Plugin+and+Bytecode as per doc --- sonar.java.binaries = 包含与您的源文件相对应的已编译字节码文件的目录的逗号分隔路径。 AND sonar.java.libraries = 项目使用的第三方库(JAR 或 Zip 文件)文件的逗号分隔路径。可以使用通配符: sonar.java.libraries=path/to/Library.jar,directory/**/*.jar -Dsonar.java.binaries=.build\libs\ ....所以这里我们应该有库和不是二进制文件【参考方案2】:

以下是 Gradle 多项目的一些选项。我在 CI (Jenkins) 中运行,但原则适用。

选项:

    手动维护一个硬编码的sonar.java.binaries 条目,例如: sonar.java.binaries=subproject1/build/classes,subproject2/build/classes,(等)

    设置为项目的顶层目录:

    sonar.java.binaries=.

    在运行时使用脚本生成自己的props文件,例如:

    cat > sonar-project.properties <<EOF
    sonar.projectKey=XXXX
    sonar.projectVersion=YYYY
    sonar.sources=$(find . -path '*/src/main' | xargs | tr ' ' ',')
    sonar.java.binaries=$(find . -path '*/build/classes/java' | xargs | tr ' ' ',')
    EOF
    

请注意,上述内容也适用于sonar.sources,并且可能需要与sonar.java.binaries 同步。让二进制文件成为源代码的超集似乎没问题。显然,如果您的来源值太宽泛(即包括测试等),您会得到更多的噪音。使用脚本的优点是您可以根据自己的喜好自定义这些启发式方法。

【讨论】:

这个很有用,谢谢分享【参考方案3】:

基于https://docs.sonarqube.org/latest/analysis/languages/java/的文档

sonar.java.binaries路径的用途是:

包含与您的源文件相对应的已编译字节码文件的目录的逗号分隔路径。

对于 Gradle,默认路径是build/classes,所以我会设置:

sonar.java.binaries=build/classes

【讨论】:

【参考方案4】:

您必须提供参数sonar.java.libraries

如果您使用maven,您可以将这些作为属性添加到pom.xml

<project>
    ...
    <properties>
        ...
        <sonar.java.libraries>target</sonar.java.libraries>

    </properties>

</project>   

或作为运行参数-Dsonar.java.libraries=target

【讨论】:

我认为是二进制文件而不是库,不是吗? :-)

以上是关于如何正确配置属性“sonar.java.binaries”?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用私有方法正确配置 ES6 类的 eslint?

与 MySql 的连接正在自动中止。如何正确配置Connector/J?

与 MySql 的连接正在自动中止。如何正确配置Connector/J?

如何在 bean 实例化之前记录 Spring Boot 应用程序的所有活动属性?

如何配置开火以验证来自外部数据库的用户?

C#WebAPI没有正确地序列化动态属性