Java SonarQube插件后分析任务仅在扫描仪参数设置时执行

Java SonarQube插件后分析任务仅在扫描仪参数设置时执行,java,sonarqube,sonarscanner,Java,Sonarqube,Sonarscanner,我正在为SonarQube开发一个插件,它将运行一个自定义的后期分析任务,但前提是向sonar scanner命令提供了一个命名的scanner参数。我可以这样做吗 public class MyPlugin implements Plugin { @Override public void define(Context context) { context.addExtension(MyPostAnalysisTask.class); } } publ

我正在为SonarQube开发一个插件,它将运行一个自定义的后期分析任务,但前提是向sonar scanner命令提供了一个命名的scanner参数。我可以这样做吗

public class MyPlugin implements Plugin {
    @Override
    public void define(Context context) {
        context.addExtension(MyPostAnalysisTask.class);
    }
}

public class MyPostAnalysisTask implements PostProjectAnalysisTask, Sensor {

    private String param = "";

    @Override
    public void describe(SensorDescriptor descriptor) {
        descriptor.name(getClass().getName());
    }

    @Override
    public void execute(SensorContext context) {
        // Get command line param.
        Optional<String> param = context.config().get('my.param.name');
        if (param.isPresent()) {
            this.param = param.get();
        }
    }

    @Override
    public void finished(final ProjectAnalysis analysis) {
        if (!this.param.isEmpty()) {
            // Perform custom post analysis task.
        }
    }
}
公共类MyPlugin实现插件{
@凌驾
公共void定义(上下文){
addExtension(mypostalysistask.class);
}
}
公共类MyPostAnalysisTask实现项目后分析任务,传感器{
私有字符串param=“”;
@凌驾
公共无效描述(传感器描述符){
descriptor.name(getClass().getName());
}
@凌驾
public void execute(传感器上下文){
//获取命令行参数。
可选param=context.config().get('my.param.name');
if(参数isPresent()){
this.param=param.get();
}
}
@凌驾
公共作废完成(最终项目分析){
如果(!this.param.isEmpty()){
//执行自定义后期分析任务。
}
}
}

我不熟悉插件对象的范围/生命周期。每个扫描或每个SonarQube服务器实例都是唯一的吗?

传感器是扫描仪侧的扩展点。它将在对生成代理进行分析期间运行。 PostProjectAnalysisTask是一个服务器端扩展点,将在分析报告处理结束时实例化/调用它。您不能像使用class属性那样共享状态,因为在运行时,两个类将在不同的JVM上实例化

我认为最好在单独的类中实现这两个扩展点,并使用scanner上下文在scanner端和服务器端之间传递值:

public class MyPlugin implements Plugin {
    @Override
    public void define(Context context) {
        context.addExtensions(
            MySensor.class, 
            MyPostAnalysisTask.class);
    }
}

public class MySensor implements Sensor {

    @Override
    public void describe(SensorDescriptor descriptor) {
        descriptor.name(getClass().getName());
    }

    @Override
    public void execute(SensorContext context) {
        // Get command line param.
        Optional<String> param = context.config().get("my.param.name");
        if (param.isPresent()) {
            context.addContextProperty("my.context.key", param.get());
        }
    }
}

public class MyPostAnalysisTask implements PostProjectAnalysisTask {

    @Override
    public void finished(final ProjectAnalysis analysis) {
        if (analysis.getScannerContext().getProperties().containsKey("my.context.key")) {
            // Perform custom post analysis task.
        }
    }
}
公共类MyPlugin实现插件{
@凌驾
公共void定义(上下文){
context.addExtensions(
迈森索级,
MyPostalysistask.class);
}
}
公共类MySensor实现传感器{
@凌驾
公共无效描述(传感器描述符){
descriptor.name(getClass().getName());
}
@凌驾
public void execute(传感器上下文){
//获取命令行参数。
可选param=context.config().get(“my.param.name”);
if(参数isPresent()){
addContextProperty(“my.context.key”,param.get());
}
}
}
公共类MyPostAnalysisTask实现PostProjectAnalysisTask{
@凌驾
公共作废完成(最终项目分析){
if(analysis.getScannerContext().getProperties().containsKey(“my.context.key”)){
//执行自定义后期分析任务。
}
}
}

传感器是扫描仪侧的扩展点。它将在对生成代理进行分析期间运行。 PostProjectAnalysisTask是一个服务器端扩展点,将在分析报告处理结束时实例化/调用它。您不能像使用class属性那样共享状态,因为在运行时,两个类将在不同的JVM上实例化

我认为最好在单独的类中实现这两个扩展点,并使用scanner上下文在scanner端和服务器端之间传递值:

public class MyPlugin implements Plugin {
    @Override
    public void define(Context context) {
        context.addExtensions(
            MySensor.class, 
            MyPostAnalysisTask.class);
    }
}

public class MySensor implements Sensor {

    @Override
    public void describe(SensorDescriptor descriptor) {
        descriptor.name(getClass().getName());
    }

    @Override
    public void execute(SensorContext context) {
        // Get command line param.
        Optional<String> param = context.config().get("my.param.name");
        if (param.isPresent()) {
            context.addContextProperty("my.context.key", param.get());
        }
    }
}

public class MyPostAnalysisTask implements PostProjectAnalysisTask {

    @Override
    public void finished(final ProjectAnalysis analysis) {
        if (analysis.getScannerContext().getProperties().containsKey("my.context.key")) {
            // Perform custom post analysis task.
        }
    }
}
公共类MyPlugin实现插件{
@凌驾
公共void定义(上下文){
context.addExtensions(
迈森索级,
MyPostalysistask.class);
}
}
公共类MySensor实现传感器{
@凌驾
公共无效描述(传感器描述符){
descriptor.name(getClass().getName());
}
@凌驾
public void execute(传感器上下文){
//获取命令行参数。
可选param=context.config().get(“my.param.name”);
if(参数isPresent()){
addContextProperty(“my.context.key”,param.get());
}
}
}
公共类MyPostAnalysisTask实现PostProjectAnalysisTask{
@凌驾
公共作废完成(最终项目分析){
if(analysis.getScannerContext().getProperties().containsKey(“my.context.key”)){
//执行自定义后期分析任务。
}
}
}

也发布在sonarsource社区这里:也发布在sonarsource社区这里: