运行 SonarScanner 分析 Java 11,运行 目标代码 Java 8

Run SonarScanner analysis with Java 11, run target code with Java 8

如下图所示,SonarSource 结束了对 运行 11 之前 Java 版本

代码分析器的支持

我试图搜索 完整示例 关于如何 运行 bitbucket 管道使用 java 11 分析器执行 SonarScanner 分析但是有使用 java 11 之前的版本(例如 java 8)的目标代码,但我找不到。按照那个图应该是可以的

我不确定是什么问题。公告通知您必须使用 Java 11+ 来执行扫描,但您仍然可以使用 Java <11 编译代码。您没有提供任何关于您的项目的信息,所以我们以Maven项目为例。

这通常意味着你必须做这样的事情:

// set Java to 8
export JAVA_HOME=/path/to/jdk8/

// compile, test and build
mvn package

// set Java to 11
export JAVA_HOME=/path/to/jdk11/

// execute scanner
mvn sonar:sonar

虽然@agabrys 提供了最直接的解决方案和我们使用的解决方案,但通过 Jenkins 自由式作业,调用 maven 顶级目标包,然后结束注入 JAVA_HOME 变量并调用 maven 声纳步骤,一个替代方法是...

始终使用 Java 11,但在 maven pom 中指定:

<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>

如该页底部所述,这是运行时不兼容的小风险。

另一种方法是将配置文件与 maven toolchains 结合使用,绑定到不同的配置文件,一个用于编译,一个用于分析步骤。

我在我的项目中也遇到了同样的问题,我的项目需要 jdk8 来编译,但 SonarScan 需要 jdk11,我必须使用 sonar:sonar maven 插件而不是直接 sonarscanner二进制。

为了解决这个问题,我使用了 docker 容器,只用于 运行 声纳扫描部分。编译部分仍然由宿主的 maven 本身完成。

要运行 使用docker 的SonarScan,请使用如下命令:

docker run -u $(id -u ${USER}):$(id -g ${USER}) --rm -v "$PWD":/usr/src/mymaven -v "$HOME/.m2":/tmp/.m2 -w /usr/src/mymaven maven:3-openjdk-11 \
         mvn -gs=/tmp/.m2/settings.xml -Dmaven.repo.local=/tmp/.m2/repository sonar:sonar \
        -Dsonar.dependencyCheck.jsonReportPath=target/dependency-check-report.json \
        -Dsonar.dependencyCheck.htmlReportPath=target/dependency-check-report.html \
        -Dsonar.dependencyCheck.summarize=true \
        -Dsonar.host.url=https://my-sonar-url \
        -Dsonar.login=****