2016-07-20 41 views
1

我試圖訪問我的SonarQube插件延伸RulesDefinitionProperty。 我定義了性能與擴展SonarPlugin類:SonarQube獲取屬性RulesDefinition

@Properties(
    @Property(key="sonar.root.path", name="Path to installation", description = "Root directory of the Master plugin installation directory") 
) 

正確創建的屬性,我把它在SQ的配置頁面值,但不知何故,我無法從使用此代碼擴展RulesDefinition類訪問在重寫define(Context context)方法:

// Get access to the Properties 
Settings settings = new Settings(new PropertyDefinitions(new MyPlugin())); 
if(settings.hasKey("sonar.root.path")) { 
    // Never enters here 
    String path = settings.getString("sonar.root.path"); 
} else { 
    // If always returns false and enters here 
    LOG.info("No property defined with the provided key."); 
} 

// To double-check 
LOG.info("The value: " + settings.getString("sonar.root.path")); // Returns null 

LOG.info("Has default value: " + settings.hasDefaultValue("sonar.root.path"));  
// Returns false, or true if I provide a default value, proving it can 
    // access the property - so the if condition above should have returned true 

奇怪的是,我已經通過REST Web服務檢查了物業,並確認所顯示的值是在網頁中設置的,但如果我提供了一個默認值(如上面所述),日誌顯示了錯誤lt值,而不是在網頁中輸入的值(並通過Web服務顯示)。

也許問題出在我得到Settings對象的方式。希望提供任何幫助。 在此先感謝。

回答

3

組件設置是核心實例化,並必須在對象通過構造函數參數注入:

public class YourRulesDefinition implements RulesDefinition { 
    private final Settings settings; 

    public YourRulesDefinition(Settings s) { 
    this.settings = s; 
    } 

    void yourMethod() { 
    if(settings.hasKey("sonar.root.path")) { 
     // ... 
    } 
    } 
} 

注意,你不應該實例化的核心類。它們總是通過構造函數注入來使用。

+0

謝謝你的回答。我明天會試試,我會提供反饋意見。我沒有這個類的構造函數,因爲我不需要。如果我按照您的建議創建它,SonarQube的引擎會自動使用實例化的信息訪問它,是這樣嗎?另外,我應該在擴展'SonarPlugin'的類中保留'Property'definition嗎?謝謝。 – jonypera

+0

是和是(但[PropertyDefinition](http://javadocs.sonarsource.org/5.6/apidocs/index.html?org/sonar/api/config/PropertyDefinition.html)是首選) –

+0

謝謝你的朋友,工作得很漂亮不錯。 – jonypera